llvm opt -O3失败(?)

时间:2018-11-29 07:02:04

标签: optimization llvm static-analysis

我需要标识行为类似于布尔变量的整数变量,也就是说,它们只能具有值01。 为此,我修改了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顺利互操作吗?或我可以使用的其他任何技巧? 非常感谢!

0 个答案:

没有答案