我在InstructionCombining优化过程中发现了一个无限循环。
这是一个详细的无限循环情况(IR代码)。
步骤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通过错误还是我的问题?