optimization - llvm opt -O3 失败(?)
问题描述
我需要识别行为类似于 boolean variables 的整数变量,也就是说,它们只能具有值0
or 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 顺利互操作?或我可以使用的任何其他技巧?非常感谢!
解决方案
推荐阅读
- r - R gghighlight 上浆
- javascript - 需要从本地 iframe 中的 src url 中删除页眉和页脚
- c - float 类型可以容纳的最大数量是多少?
- python - 如何在python中的组内计算两点之间的距离,对于许多结果点
- reactjs - history.push 是否应该渲染与路由关联的组件?
- mongodb - NFS 卷上带有 PVC 的 mongodb 以“文件重命名:重命名:权限被拒绝”重新启动
- wso2 - 错误 Axis2Sender 发送消息时出现意外错误 org.apache.axis2.AxisFault:Payload 无法写入 JSON
- sql - AVG(x) - 1 给了我们什么?
- ios - didReceiveRemoteNotification 在单击通知(背景)时不工作,但在应用程序为前台时工作
- c - 如何在c中创建信号量?