Clang LLVM:在生成机器代码时禁用某些指令

Clang LLVM:在生成机器代码时禁用某些指令,clang,llvm,Clang,Llvm,我不想在llvm生成的汇编代码中使用特定的机器指令 有没有办法禁用相同的功能?我也可以修改llvm代码。一种解决方案是向llvm指定此指令不能“降低”。。。可能会发生两件事: 编译器可以使用其他指令组合执行相同的操作。。。一切都会好起来的 编译器不能没有它,在这种情况下,您必须修改目标生成器以建议解决方法(如果您不熟悉llvm,则不太容易) 要执行此操作,请搜索XXXISelDAGToDAG.cpp,其中XXX是您的目标计算机,并向构造函数指定如下内容: setOperationAction

我不想在llvm生成的汇编代码中使用特定的机器指令


有没有办法禁用相同的功能?我也可以修改llvm代码。

一种解决方案是向llvm指定此指令不能“降低”。。。可能会发生两件事:

  • 编译器可以使用其他指令组合执行相同的操作。。。一切都会好起来的
  • 编译器不能没有它,在这种情况下,您必须修改目标生成器以建议解决方法(如果您不熟悉llvm,则不太容易)
要执行此操作,请搜索XXXISelDAGToDAG.cpp,其中XXX是您的目标计算机,并向构造函数指定如下内容:

setOperationAction(ISD::YYY, MVT::i8, Expand);
setOperationAction(ISD::YYY, MVT::i16, Expand);
setOperationAction(ISD::YYY, MVT::i32, Expand);
setOperationAction(ISD::YYY, MVT::i64, Expand);
其中ISD::YYY是您不想使用的指令。 这在浏览源代码时很容易找到

大致:

  • setOperationAction指定要更改给定操作的默认操作以及类型(MVT::…)
  • Expand表示“尝试扩展到另一个操作”(还有其他操作,例如Custom、Libcall…)
玩弄它,你应该能够解决你的问题


希望它能有所帮助。

你不想使用的说明是什么,为什么不想使用它?它是为了一些研究目的。我想禁用bt(位测试)指令。您可以先从lib/target/X86/X86InstrInfo.td中删除位测试指令,然后重新构建。我不确定是否还需要其他东西。