gpt4 book ai didi

c++ - LLVM IR 中 '&&' 的指令是什么?

转载 作者:行者123 更新时间:2023-12-01 14:51:38 26 4
gpt4 key购买 nike

我想写一个 LLVM pass 来减少 &&在 LLVM IR 中,但我在 IR 中找不到它的具体说明。例如,

#include <iostream>

int main(){
bool a = true;
bool b = false;
bool c = a && b;

return 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
}
但我试过这个,
#include <iostream>

int main(){
int a = 10;
int b = 10;
int c;
c = a && b;

return 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 中使用 LLVM 10。我将不胜感激任何答案或建议。

最佳答案

没有专门对应&&的LLVM指令运算符(operator)。它可以并且将会根据表达式和优化设置以不同的方式进行翻译。
当您启用优化时,操作数没有副作用(并且计算成本不高)并且整个表达式不能被优化掉,clang通常会将两个操作数都转换为 i1并应用逻辑 and他们的运营商。
当优化被禁用或操作数有副作用时,它通常会使用分支指令进行翻译。您发布的两个示例就是这种情况。
请注意 expr1 && expr2在语义上等同于 expr1 ? expr2 : false并且您通常会为两者获得相同的 LLVM 代码。
如果您同意治疗 expr1 ? expr2 : false和其他等效代码(例如使用 if 语句)与 && 相同,您可以尝试检测它们创建的分支模式。如果您需要您的通行证在优化后也适用,您还必须至少检测转换为 i1 和 and 的模式。 ing。
如果您只想将转换应用于 &&没有别的,你根本无法在 LLVM 级别做到这一点。您需要在 Clang 级别进行 AST 转换。

关于c++ - LLVM IR 中 '&&' 的指令是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63193018/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com