xref: /aosp_15_r20/external/llvm/test/Transforms/IndVarSimplify/rewrite-loop-exit-value.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -indvars -instcombine -S < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker;; Test that loop's exit value is rewritten to its initial
4*9880d681SAndroid Build Coastguard Worker;; value from loop preheader
5*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32* %var) {
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1
7*9880d681SAndroid Build Coastguard Workerentry:
8*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32* %var, null
9*9880d681SAndroid Build Coastguard Worker br label %header
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Workerheader:
12*9880d681SAndroid Build Coastguard Worker %phi_indvar = phi i32 [0, %entry], [%indvar, %loop]
13*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %loop, label %exit
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerloop:
16*9880d681SAndroid Build Coastguard Worker %indvar = add i32 %phi_indvar, 1
17*9880d681SAndroid Build Coastguard Worker br label %header
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerexit:
20*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0
21*9880d681SAndroid Build Coastguard Worker ret i32 %phi_indvar
22*9880d681SAndroid Build Coastguard Worker}
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker;; Test that we can not rewrite loop exit value if it's not
25*9880d681SAndroid Build Coastguard Worker;; a phi node (%indvar is an add instruction in this test).
26*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32* %var) {
27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2
28*9880d681SAndroid Build Coastguard Workerentry:
29*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32* %var, null
30*9880d681SAndroid Build Coastguard Worker br label %header
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerheader:
33*9880d681SAndroid Build Coastguard Worker %phi_indvar = phi i32 [0, %entry], [%indvar, %header]
34*9880d681SAndroid Build Coastguard Worker %indvar = add i32 %phi_indvar, 1
35*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %header, label %exit
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerexit:
38*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %indvar
39*9880d681SAndroid Build Coastguard Worker ret i32 %indvar
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker;; Test that we can not rewrite loop exit value if the condition
43*9880d681SAndroid Build Coastguard Worker;; is not in loop header.
44*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32* %var) {
45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3
46*9880d681SAndroid Build Coastguard Workerentry:
47*9880d681SAndroid Build Coastguard Worker %cond1 = icmp eq i32* %var, null
48*9880d681SAndroid Build Coastguard Worker br label %header
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerheader:
51*9880d681SAndroid Build Coastguard Worker %phi_indvar = phi i32 [0, %entry], [%indvar, %header], [%indvar, %body]
52*9880d681SAndroid Build Coastguard Worker %indvar = add i32 %phi_indvar, 1
53*9880d681SAndroid Build Coastguard Worker %cond2 = icmp eq i32 %indvar, 10
54*9880d681SAndroid Build Coastguard Worker br i1 %cond2, label %header, label %body
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerbody:
57*9880d681SAndroid Build Coastguard Worker br i1 %cond1, label %header, label %exit
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerexit:
60*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %phi_indvar
61*9880d681SAndroid Build Coastguard Worker ret i32 %phi_indvar
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64