C++ 什么';这是'&&';在LLVM IR中?
我想在LLVM IR中编写一个LLVM过程来减少C++ 什么';这是'&&';在LLVM IR中?,c++,llvm-ir,C++,Llvm Ir,我想在LLVM IR中编写一个LLVM过程来减少&&,但在IR中找不到它的具体说明。比如说, #包括 int main(){ 布尔a=真; 布尔b=假; boolc=a&b; 返回0; } 我得到了IR define dso_local i32 @main() #4 { %1 = alloca i32, align 4 %2 = alloca i8, align 1 %3 = alloca i8, align 1 %4 = alloca i8, align 1 store
&&
,但在IR中找不到它的具体说明。比如说,
#包括
int main(){
布尔a=真;
布尔b=假;
boolc=a&b;
返回0;
}
我得到了IR
define dso_local i32 @main() #4 {
%1 = alloca i32, align 4
%2 = alloca i8, align 1
%3 = alloca i8, align 1
%4 = alloca i8, align 1
store i32 0, i32* %1, align 4
store i8 1, i8* %2, align 1
store i8 0, i8* %3, align 1
%5 = load i8, i8* %2, align 1
%6 = trunc i8 %5 to i1
br i1 %6, label %7, label %10
7: ; preds = %0
%8 = load i8, i8* %3, align 1
%9 = trunc i8 %8 to i1
br label %10
10: ; preds = %7, %0
%11 = phi i1 [ false, %0 ], [ %9, %7 ]
%12 = zext i1 %11 to i8
store i8 %12, i8* %4, align 1
ret i32 0
}
但是我试过这个
#包括
int main(){
INTA=10;
int b=10;
INTC;
c=a&b;
返回0;
}
我明白了
define dso_local i32 @main() #4 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
%3 = alloca i32, align 4
%4 = alloca i32, align 4
store i32 0, i32* %1, align 4
store i32 10, i32* %2, align 4
store i32 10, i32* %3, align 4
%5 = load i32, i32* %2, align 4
%6 = icmp ne i32 %5, 0
br i1 %6, label %7, label %10
7: ; preds = %0
%8 = load i32, i32* %3, align 4
%9 = icmp ne i32 %8, 0
br label %10
10: ; preds = %7, %0
%11 = phi i1 [ false, %0 ], [ %9, %7 ]
%12 = zext i1 %11 to i32
store i32 %12, i32* %4, align 4
ret i32 0
}
我在ubuntu中使用LLVM10。我将非常感谢您的回答或建议。没有专门对应于
&&
运算符的LLVM指令。根据表达式和优化设置,可以并将以不同的方式对其进行翻译
启用优化后,操作数没有副作用(且计算成本不高),且整个表达式无法优化掉,clang
通常会将两个操作数转换为i1
,并对其应用逻辑和
运算符
当优化被禁用或操作数有副作用时,通常会使用分支指令对其进行转换。你贴的两个例子就是这样
请注意,expr1&&expr2
在语义上等同于expr1?expr2:false
通常两种情况下都会得到相同的LLVM代码
如果你同意治疗expr1?expr2:false
和其他与&
相同的等效代码(例如使用if
语句),您可以尝试检测它们创建的分支模式。如果您需要您的通行证在优化后也适用,您还必须至少检测到转换为i1和和ing的模式
如果您只想将转换应用于&&
,而不想应用于其他任何东西,那么就不能在LLVM级别进行转换。您需要在Clang级别进行AST转换。您所说的“我想在LLVM IR中编写一个reduce&&过程”是什么意思?什么是“通行证”?如果在一个只有一行可观察代码的程序中“reduce&&”返回0,那么预期的结果是什么
,为什么您希望任何其他代码都能进入汇编程序或二进制文件?现代编译器喜欢忽略任何没有明显效果的东西。您已经展示了两段汇编代码,就好像它有一些惊人的奇怪之处。假设它不是,并解释什么让你困惑。我想写一个LLVM过程来实现&&
的指令混淆。使用这些示例是为了显示&&
在不同情况下可以转换为IR中的不同指令。e、 g.trunc
icmp
有人能解释一下什么是“通行证”吗?似乎意义如此明显,OP无法回答这个问题。谢谢。我希望实现指令混淆,例如,boolc=a和&b
转换为boolc=(!(!a))&&b
。使用pass来实现这一点,我认为首先要识别操作符&&
。如果没有具体的回应,有什么建议吗?@lcy没有办法专门针对&&&
这样做,只有LLVM级别的&&
这样做。不过,直接为所有i1
值插入双否定是很简单的。请注意,一旦优化器发现这样的操作,它们就不会消失而不留痕迹。