LLVM指令期间的无限循环组合通过优化

时间:2019-07-07 22:35:09

标签: optimization clang llvm infinite-loop llvm-ir

我在InstructionCombining优化过程中发现了一个无限循环。

  • LLVM版本:8.0版
  • 测试程序:Deal.II(在SPEC CPU2006基准中)
  • 我修改了clang,将非多态类强制标记为多态类,以测试某些功能并编译了Deal.II。

这是一个详细的无限循环情况(IR代码)。

  • 我只修改了clang(不修改InstructionCombining阶段)。

步骤1 :(应用fmul的Y *(-X)=>-(X * Y)策略。1条指令-> 2条指令)

[Before] %153 = fmul double %129, fsub (double -0.000000e+00, double bitcast (i64 ptrtoint (i8** getelementptr inbounds ({ [2 x i8*] }, { [2 x i8*] }* @_ZTV5PointILi3EE, i64 0, inrange i32 0, i64 2) to i64) to double)), !dbg !3967

[After] 

%153 = fmul double bitcast (i64 ptrtoint (i8** getelementptr inbounds ({ [2 x i8*] }, { [2 x i8*] }* @_ZTV5PointILi3EE, i64 0, inrange i32 0, i64 2) to i64) to double), %129

<badref> = fsub double -0.000000e+00, %153, !dbg !DILocation(line: 483, column: 29, scope: <0x6d73b40>, inlinedAt: !DILocation(line: 1032, column: 7, scope: <0x69a9230>)

第2步(应用了fmul的SimplifyAssociativeOrCommutative策略。更具体地说,“对操作数进行排序,使其从右(最小复数)到左(最复数)列出”)。

[Before] %153 = fmul double bitcast (i64 ptrtoint (i8** getelementptr inbounds ({ [2 x i8*] }, { [2 x i8*] }* @_ZTV5PointILi3EE, i64 0, inrange i32 0, i64 2) to i64) to double), %129, !dbg !3967

[After]  %153 = fmul double %129, bitcast (i64 ptrtoint (i8** getelementptr inbounds ({ [2 x i8*] }, { [2 x i8*] }* @_ZTV5PointILi3EE, i64 0, inrange i32 0, i64 2) to i64) to double), !dbg !3967

第3步(应用了fsub的“将否定折叠为常量操作数”策略。(即-(X * C)-> X *(-C)))

[Before] %154 = fsub double -0.000000e+00, %153, !dbg !3967

[After] <badref> = fmul double %129, fsub (double -0.000000e+00, double bitcast (i64 ptrtoint (i8** getelementptr inbounds ({ [2 x i8*] }, { [2 x i8*] }* @_ZTV5PointILi3EE, i64 0, inrange i32 0, i64 2) to i64) to double))

在步骤3之后,无限循环开始(即,步骤1->步骤2->步骤3->步骤1->步骤2->步骤3-> ...)。

请问这是LLVM通过错误还是我的问题?

0 个答案:

没有答案