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