
This extends the work from 7755c26 to all of the different backend taken count kinds that we print for the scev analysis printer. As before, the goal is to cut down on confusion as i4 -1 is a very different (unsigned) value from i32 -1.
76 lines
3.3 KiB
LLVM
76 lines
3.3 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
|
|
; RUN: opt < %s -passes='print<scalar-evolution>,simple-loop-unswitch<no-nontrivial>,print<scalar-evolution>' -disable-output 2>&1 | FileCheck -check-prefix CHECK-SCEV %s
|
|
; RUN: opt < %s -passes='function(loop-deletion,simple-loop-unswitch<no-nontrivial>),verify<scalar-evolution>' -S | FileCheck -check-prefix CHECK-IR %s
|
|
|
|
; These tests used to hit an assertion failure in llvm::ScalarEvolution::BackedgeTakenInfo::getExact:
|
|
; "We should only have known counts for exiting blocks that dominate latch!"' failed.
|
|
;
|
|
; Verify that we no longer hit that assert, while we expect to have forgotten SCEV for the outer loop.
|
|
; Also added checks to show and verify the IR transformation.
|
|
|
|
|
|
; Before the unswitch:
|
|
;
|
|
; CHECK-SCEV: Classifying expressions for: @f4
|
|
; CHECK-SCEV-NEXT: %j.0 = phi i16 [ 0, %entry ], [ %0, %sw.bb2 ]
|
|
; CHECK-SCEV-NEXT: --> {0,+,1}<nuw><nsw><%lbl1> U: [0,3) S: [0,3) Exits: 2 LoopDispositions: { %lbl1: Computable, %lbl2: Invariant }
|
|
; CHECK-SCEV-NEXT: %0 = add i16 %j.0, 1
|
|
; CHECK-SCEV-NEXT: --> {1,+,1}<nuw><nsw><%lbl1> U: [1,4) S: [1,4) Exits: 3 LoopDispositions: { %lbl1: Computable, %lbl2: Invariant }
|
|
; CHECK-SCEV-DAG: Loop %lbl2: Unpredictable backedge-taken count.
|
|
; CHECK-SCEV-DAG: Loop %lbl1: backedge-taken count is i16 2
|
|
;
|
|
; After the unswitch:
|
|
;
|
|
; CHECK-SCEV: Classifying expressions for: @f4
|
|
; CHECK-SCEV-NEXT: %j.0 = phi i16 [ 0, %entry ], [ %0, %sw.bb2 ]
|
|
; CHECK-SCEV-NEXT: --> {0,+,1}<nuw><nsw><%lbl1> U: [0,-32768) S: [0,-32768) Exits: <<Unknown>> LoopDispositions: { %lbl1: Computable }
|
|
; CHECK-SCEV-NEXT: %0 = add i16 %j.0, 1
|
|
; CHECK-SCEV-NEXT: --> {1,+,1}<nuw><nsw><%lbl1> U: [1,-32768) S: [1,-32768) Exits: <<Unknown>> LoopDispositions: { %lbl1: Computable }
|
|
; CHECK-SCEV-DAG: Loop %lbl1: Unpredictable backedge-taken count.
|
|
; CHECK-SCEV-DAG: Loop %lbl2: <multiple exits> Unpredictable backedge-taken count.
|
|
|
|
|
|
define i16 @f4() {
|
|
; CHECK-IR-LABEL: define i16 @f4() {
|
|
; CHECK-IR-NEXT: entry:
|
|
; CHECK-IR-NEXT: br label [[LBL1:%.*]]
|
|
; CHECK-IR: lbl1:
|
|
; CHECK-IR-NEXT: [[J_0:%.*]] = phi i16 [ 0, [[ENTRY:%.*]] ], [ [[TMP0:%.*]], [[SW_BB2:%.*]] ]
|
|
; CHECK-IR-NEXT: switch i16 [[J_0]], label [[LBL1_SPLIT:%.*]] [
|
|
; CHECK-IR-NEXT: i16 0, label [[SW_BB2]]
|
|
; CHECK-IR-NEXT: i16 1, label [[SW_BB2]]
|
|
; CHECK-IR-NEXT: i16 2, label [[LBL3:%.*]]
|
|
; CHECK-IR-NEXT: ]
|
|
; CHECK-IR: lbl1.split:
|
|
; CHECK-IR-NEXT: br label [[LBL2:%.*]]
|
|
; CHECK-IR: lbl2:
|
|
; CHECK-IR-NEXT: br label [[LBL2]]
|
|
; CHECK-IR: sw.bb2:
|
|
; CHECK-IR-NEXT: [[TMP0]] = add i16 [[J_0]], 1
|
|
; CHECK-IR-NEXT: br label [[LBL1]]
|
|
; CHECK-IR: lbl3:
|
|
; CHECK-IR-NEXT: ret i16 0
|
|
;
|
|
entry:
|
|
br label %lbl1
|
|
|
|
lbl1: ; preds = %sw.bb2, %entry
|
|
%j.0 = phi i16 [ 0, %entry ], [ %0, %sw.bb2 ]
|
|
br label %lbl2
|
|
|
|
lbl2: ; preds = %lbl2, %lbl1
|
|
switch i16 %j.0, label %lbl2 [
|
|
i16 0, label %sw.bb2
|
|
i16 1, label %sw.bb2
|
|
i16 2, label %lbl3
|
|
]
|
|
|
|
sw.bb2: ; preds = %lbl2, %lbl2
|
|
%0 = add i16 %j.0, 1
|
|
br label %lbl1
|
|
|
|
lbl3: ; preds = %lbl2
|
|
ret i16 0
|
|
}
|
|
|