Я обнаружил бесконечный цикл во время оптимизации InstructionCombining.
- LLVM версия: выпуск 8.0
- Тестовая программа: Deal.II (в тесте SPEC CPU2006)
- Я модифицировал clang, чтобы принудительно пометить неполиморфный класс как полиморфный класс для проверки некоторых функций, и скомпилировал Deal.II.
Это подробный случай бесконечного цикла (ИК код).
- Я только модифицировал Clang (не проход InstructionCombining).
Шаг 1: (Примененная политика Y * (-X) => - (X * Y) fmul. 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 SimplifyAssociativeOrCommulative. Более конкретно, "операнды порядка, такие, что они перечислены справа (наименее сложный) слева (самый сложный)" политика).
[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 pass или моей проблемой?