llvm-project/llvm/test/Analysis/ScalarEvolution/SolveQuadraticEquation.ll
Lee Wei 1469d82e1c
Remove br i1 undef from some regression tests [NFC] (#115130)
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
2024-11-07 08:11:15 +00:00

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
}