首页 > 解决方案 > llvm opt -O3 失败(?)

问题描述

我需要识别行为类似于 boolean variables 的整数变量,也就是说,它们只能具有值0or 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 顺利互操作?或我可以使用的任何其他技巧?非常感谢!

标签: optimizationllvmstatic-analysis

解决方案


推荐阅读