Бесконечный цикл во время оптимизации прохода LLVM InstructionCombining - PullRequest
0 голосов
/ 08 июля 2019

Я обнаружил бесконечный цикл во время оптимизации 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 или моей проблемой?

...