
As defined in LangRef, branching on `undef` is undefined behavior. This PR aims to remove undefined behavior from tests. As UB tests break Alive2 and may be the root cause of breaking future optimizations. Here's an Alive2 proof for one of the examples: https://alive2.llvm.org/ce/z/TncxhP
127 lines
4.2 KiB
LLVM
127 lines
4.2 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
|
|
; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-max-iterations=0 -scalar-evolution-classify-expressions=0 2>&1 | FileCheck %s
|
|
|
|
; PR1101
|
|
|
|
@A = weak global [1000 x i32] zeroinitializer, align 32
|
|
|
|
define void @test1(i32 %N) {
|
|
; CHECK-LABEL: 'test1'
|
|
; CHECK-NEXT: Determining loop execution counts for: @test1
|
|
; CHECK-NEXT: Loop %bb3: backedge-taken count is i32 100
|
|
; CHECK-NEXT: Loop %bb3: constant max backedge-taken count is i32 100
|
|
; CHECK-NEXT: Loop %bb3: symbolic max backedge-taken count is i32 100
|
|
; CHECK-NEXT: Loop %bb3: Trip multiple is 101
|
|
;
|
|
entry:
|
|
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
|
|
br label %bb3
|
|
|
|
bb: ; preds = %bb3
|
|
%tmp = getelementptr [1000 x i32], ptr @A, i32 0, i32 %i.0 ; <ptr> [#uses=1]
|
|
store i32 123, ptr %tmp
|
|
%tmp2 = add i32 %i.0, 1 ; <i32> [#uses=1]
|
|
br label %bb3
|
|
|
|
bb3: ; preds = %bb, %entry
|
|
%i.0 = phi i32 [ 2, %entry ], [ %tmp2, %bb ] ; <i32> [#uses=3]
|
|
%SQ = mul i32 %i.0, %i.0
|
|
%tmp4 = mul i32 %i.0, 2
|
|
%tmp5 = sub i32 %SQ, %tmp4
|
|
%tmp3 = icmp sle i32 %tmp5, 9999 ; <i1> [#uses=1]
|
|
br i1 %tmp3, label %bb, label %bb5
|
|
|
|
bb5: ; preds = %bb3
|
|
br label %return
|
|
|
|
return: ; preds = %bb5
|
|
ret void
|
|
}
|
|
|
|
|
|
; PR10383
|
|
; These next two used to crash.
|
|
|
|
define void @test2(i1 %cmp, i64 %n, i1 %arg) {
|
|
; CHECK-LABEL: 'test2'
|
|
; CHECK-NEXT: Determining loop execution counts for: @test2
|
|
; CHECK-NEXT: Loop %for.body2: Unpredictable backedge-taken count.
|
|
; CHECK-NEXT: Loop %for.body2: Unpredictable constant max backedge-taken count.
|
|
; CHECK-NEXT: Loop %for.body2: Unpredictable symbolic max backedge-taken count.
|
|
; CHECK-NEXT: Loop %for.body1: Unpredictable backedge-taken count.
|
|
; CHECK-NEXT: Loop %for.body1: Unpredictable constant max backedge-taken count.
|
|
; CHECK-NEXT: Loop %for.body1: Unpredictable symbolic max backedge-taken count.
|
|
;
|
|
entry:
|
|
br label %for.body1
|
|
|
|
for.body1:
|
|
%a0.08 = phi i64 [ 0, %entry ], [ %inc512, %for.body1 ]
|
|
%inc512 = add i64 %a0.08, 1
|
|
br i1 %cmp, label %preheader, label %for.body1
|
|
|
|
preheader:
|
|
br label %for.body2
|
|
|
|
for.body2:
|
|
%indvar = phi i64 [ 0, %preheader ], [ %indvar.next, %for.body2 ]
|
|
%tmp111 = add i64 %n, %indvar
|
|
%tmp114 = mul i64 %a0.08, %indvar
|
|
%mul542 = mul i64 %tmp114, %tmp111
|
|
%indvar.next = add i64 %indvar, 1
|
|
br i1 %arg, label %end, label %for.body2
|
|
|
|
end:
|
|
ret void
|
|
}
|
|
|
|
define i32 @test3(i1 %arg) {
|
|
; CHECK-LABEL: 'test3'
|
|
; CHECK-NEXT: Determining loop execution counts for: @test3
|
|
; CHECK-NEXT: Loop %for.inc479: Unpredictable backedge-taken count.
|
|
; CHECK-NEXT: Loop %for.inc479: Unpredictable constant max backedge-taken count.
|
|
; CHECK-NEXT: Loop %for.inc479: Unpredictable symbolic max backedge-taken count.
|
|
;
|
|
if.then466:
|
|
br i1 %arg, label %for.cond539.preheader, label %for.inc479
|
|
|
|
for.inc479:
|
|
%a2.07 = phi i32 [ %add495, %for.inc479 ], [ 0, %if.then466 ]
|
|
%j.36 = phi i32 [ %inc497, %for.inc479 ], [ undef, %if.then466 ]
|
|
%mul484 = mul nsw i32 %j.36, %j.36
|
|
%mul491 = mul i32 %j.36, %j.36
|
|
%mul493 = mul i32 %mul491, %mul484
|
|
%add495 = add nsw i32 %mul493, %a2.07
|
|
%inc497 = add nsw i32 %j.36, 1
|
|
br i1 %arg, label %for.cond539.preheader, label %for.inc479
|
|
|
|
for.cond539.preheader:
|
|
unreachable
|
|
}
|
|
|
|
; PR13489
|
|
; We used to crash on this too.
|
|
|
|
define void @test4() {
|
|
; CHECK-LABEL: 'test4'
|
|
; CHECK-NEXT: Determining loop execution counts for: @test4
|
|
; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.
|
|
; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.
|
|
; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.
|
|
;
|
|
entry:
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %for.body, %entry
|
|
%v2.02 = phi i64 [ 2, %entry ], [ %phitmp, %for.body ]
|
|
%v1.01 = phi i64 [ -2, %entry ], [ %sub1, %for.body ]
|
|
%sub1 = sub i64 %v1.01, %v2.02
|
|
%phitmp = add i64 %v2.02, 2
|
|
%tobool = icmp eq i64 %sub1, %phitmp
|
|
br i1 %tobool, label %for.end, label %for.body
|
|
|
|
for.end: ; preds = %for.body
|
|
ret void
|
|
}
|
|
|