
This transformation doesn't actually use any of the internal state of LSR and recomputes all information from SCEV. Splitting it out makes it easier to test. Note that long term I would like to write a version of this transform which *is* integrated with LSR's solver, but if that happens, we'll just delete the extra pass. Integration wise, I switched from using TTI to using a pass configuration variable. This seems slightly more idiomatic, and means we don't run the extra logic on any target other than RISCV.
42 lines
1.7 KiB
LLVM
42 lines
1.7 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -passes=loop-reduce,loop-term-fold -S | FileCheck %s
|
|
|
|
; This test used to crash due to matchSimpleRecurrence matching the simple
|
|
; recurrence in pn-loop when evaluating unrelated-loop. Since unrelated-loop
|
|
; cannot jump to pn-node isAlmostDeadIV panics.
|
|
define void @phi_node_different_bb() {
|
|
; CHECK-LABEL: @phi_node_different_bb(
|
|
; CHECK-NEXT: br label [[PN_LOOP:%.*]]
|
|
; CHECK: pn-loop:
|
|
; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ 1, [[TMP0:%.*]] ], [ [[TMP2:%.*]], [[PN_LOOP]] ]
|
|
; CHECK-NEXT: [[TMP2]] = add i32 [[TMP1]], 1
|
|
; CHECK-NEXT: [[TMP3:%.*]] = icmp ugt i32 [[TMP2]], 1
|
|
; CHECK-NEXT: br i1 [[TMP3]], label [[PN_LOOP]], label [[UNRELATED_LOOP_PREHEADER:%.*]]
|
|
; CHECK: unrelated-loop.preheader:
|
|
; CHECK-NEXT: [[DOTLCSSA:%.*]] = phi i32 [ [[TMP2]], [[PN_LOOP]] ]
|
|
; CHECK-NEXT: br label [[UNRELATED_LOOP:%.*]]
|
|
; CHECK: unrelated-loop:
|
|
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[DOTLCSSA]], 0
|
|
; CHECK-NEXT: br i1 [[TMP4]], label [[END:%.*]], label [[UNRELATED_LOOP]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
br label %pn-loop
|
|
|
|
pn-loop: ; preds = %pn-loop, %0
|
|
%1 = phi i32 [ 1, %0 ], [ %2, %pn-loop ]
|
|
%2 = add i32 %1, 1
|
|
%3 = icmp ugt i32 %2, 1
|
|
br i1 %3, label %pn-loop, label %unrelated-loop.preheader
|
|
|
|
unrelated-loop.preheader: ; preds = %pn-loop
|
|
br label %unrelated-loop
|
|
|
|
unrelated-loop: ; preds = %unrelated-loop, %unrelated-loop.preheader
|
|
%4 = icmp eq i32 %2, 0
|
|
br i1 %4, label %end, label %unrelated-loop
|
|
|
|
end: ; preds = %unrelated-loop
|
|
ret void
|
|
}
|