我需要标识行为类似于布尔变量的整数变量,也就是说,它们只能具有值0
或1
。
为此,我修改了llvm位代码,以向其添加等效指令:
int tmp = someVar*(someVar-1);
希望进行积极的O3
优化会将tmp
识别为常数0
。这是我使用的代码的C
版本:
int should_expand(char *s)
{
int tmp = 0;
int ret = 0;
char *p = s;
if (p && *p == '&')
{
ret = 1;
}
tmp = ret * (ret - 1);
return tmp;
}
当我检查*.ll
文件时,我发现万能的clang 6.0.0失败了
意识到tmp
实际上是0
:
define i32 @should_expand(i8* readonly %s) local_unnamed_addr #0 {
entry:
%tobool = icmp eq i8* %s, null
br i1 %tobool, label %if.end, label %land.lhs.true
land.lhs.true: ; preds = %entry
%tmp = load i8, i8* %s, align 1, !tbaa !2
%cmp = icmp eq i8 %tmp, 38
%spec.select = zext i1 %cmp to i32
br label %if.end
if.end: ; preds = %land.lhs.true, %entry
%ret.0 = phi i32 [ 0, %entry ], [ %spec.select, %land.lhs.true ]
%sub = add nsw i32 %ret.0, -1
%tmp1 = sub nsw i32 0, %ret.0
%mul = and i32 %sub, %tmp1
ret i32 %mul
}
这有意义吗?我可以使用任何外部静态分析器与clang顺利互操作吗?或我可以使用的其他任何技巧? 非常感谢!