llvm opt -O3 fail (?) - PullRequest
       45

llvm opt -O3 fail (?)

0 голосов
/ 29 ноября 2018

Мне нужно определить целочисленные переменные, которые ведут себя как логические переменные , то есть они могут иметь только значения 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, я вижу, что всемогущий лязг 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?или любой другой трюк, который я могу использовать?Большое спасибо!

...