Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';这是'&&';在LLVM IR中?_C++_Llvm Ir - Fatal编程技术网

C++ 什么';这是'&&';在LLVM IR中?

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

我想在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 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
值插入双否定是很简单的。请注意,一旦优化器发现这样的操作,它们就不会消失而不留痕迹。