xref: /aosp_15_r20/external/llvm/test/Analysis/ScalarEvolution/smax-br-phi-idioms.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -analyze -scalar-evolution < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine i32 @f0(i32 %x, i32 %y) {
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f0
5*9880d681SAndroid Build Coastguard Worker entry:
6*9880d681SAndroid Build Coastguard Worker  %c = icmp sgt i32 %y, 0
7*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %add, label %merge
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker add:
10*9880d681SAndroid Build Coastguard Worker  %sum = add i32 %x, %y
11*9880d681SAndroid Build Coastguard Worker  br label %merge
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker merge:
14*9880d681SAndroid Build Coastguard Worker  %v = phi i32 [ %sum, %add ], [ %x, %entry ]
15*9880d681SAndroid Build Coastguard Worker; CHECK:  %v = phi i32 [ %sum, %add ], [ %x, %entry ]
16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  ((0 smax %y) + %x) U: full-set S: full-set
17*9880d681SAndroid Build Coastguard Worker  ret i32 %v
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefine i32 @f1(i32 %x, i32 %y) {
21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f1
22*9880d681SAndroid Build Coastguard Worker entry:
23*9880d681SAndroid Build Coastguard Worker  %c = icmp sge i32 %y, 0
24*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %add, label %merge
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker add:
27*9880d681SAndroid Build Coastguard Worker  %sum = add i32 %x, %y
28*9880d681SAndroid Build Coastguard Worker  br label %merge
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker merge:
31*9880d681SAndroid Build Coastguard Worker  %v = phi i32 [ %sum, %add ], [ %x, %entry ]
32*9880d681SAndroid Build Coastguard Worker; CHECK:  %v = phi i32 [ %sum, %add ], [ %x, %entry ]
33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  ((0 smax %y) + %x) U: full-set S: full-set
34*9880d681SAndroid Build Coastguard Worker  ret i32 %v
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerdefine i32 @f2(i32 %x, i32 %y, i32* %ptr) {
38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f2
39*9880d681SAndroid Build Coastguard Worker entry:
40*9880d681SAndroid Build Coastguard Worker  %c = icmp sge i32 %y, 0
41*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %add, label %merge
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker add:
44*9880d681SAndroid Build Coastguard Worker  %lv = load i32, i32* %ptr
45*9880d681SAndroid Build Coastguard Worker  br label %merge
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker merge:
48*9880d681SAndroid Build Coastguard Worker  %v = phi i32 [ %lv, %add ], [ %x, %entry ]
49*9880d681SAndroid Build Coastguard Worker; CHECK:  %v = phi i32 [ %lv, %add ], [ %x, %entry ]
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  %v U: full-set S: full-set
51*9880d681SAndroid Build Coastguard Worker  ret i32 %v
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdefine i32 @f3(i32 %x, i32 %init, i32 %lim) {
55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f3
56*9880d681SAndroid Build Coastguard Worker entry:
57*9880d681SAndroid Build Coastguard Worker  br label %loop
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerloop:
60*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ %init, %entry ], [ %iv.inc, %merge ]
61*9880d681SAndroid Build Coastguard Worker  %iv.inc = add i32 %iv, 1
62*9880d681SAndroid Build Coastguard Worker  %c = icmp sge i32 %iv, 0
63*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %add, label %merge
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker add:
66*9880d681SAndroid Build Coastguard Worker  %sum = add i32 %x, %iv
67*9880d681SAndroid Build Coastguard Worker  br label %merge
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker merge:
70*9880d681SAndroid Build Coastguard Worker  %v = phi i32 [ %sum, %add ], [ %x, %loop ]
71*9880d681SAndroid Build Coastguard Worker; CHECK:  %v = phi i32 [ %sum, %add ], [ %x, %loop ]
72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  ((0 smax {%init,+,1}<%loop>) + %x) U: full-set S: full-set
73*9880d681SAndroid Build Coastguard Worker  %be.cond = icmp eq i32 %iv.inc, %lim
74*9880d681SAndroid Build Coastguard Worker  br i1 %be.cond, label %loop, label %leave
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker leave:
77*9880d681SAndroid Build Coastguard Worker  ret i32 0
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdefine i32 @f4(i32 %x, i32 %init, i32 %lim) {
81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f4
82*9880d681SAndroid Build Coastguard Worker entry:
83*9880d681SAndroid Build Coastguard Worker  %c = icmp sge i32 %init, 0
84*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %add, label %merge
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker add:
87*9880d681SAndroid Build Coastguard Worker  br label %loop
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker loop:
90*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ %init, %add ], [ %iv.inc, %loop ]
91*9880d681SAndroid Build Coastguard Worker  %iv.inc = add i32 %iv, 1
92*9880d681SAndroid Build Coastguard Worker  %be.cond = icmp eq i32 %iv.inc, %lim
93*9880d681SAndroid Build Coastguard Worker  br i1 %be.cond, label %loop, label %add.cont
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker add.cont:
96*9880d681SAndroid Build Coastguard Worker  %sum = add i32 %x, %iv
97*9880d681SAndroid Build Coastguard Worker  br label %merge
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker merge:
100*9880d681SAndroid Build Coastguard Worker  %v = phi i32 [ %sum, %add.cont ], [ %x, %entry ]
101*9880d681SAndroid Build Coastguard Worker; CHECK:  %v = phi i32 [ %sum, %add.cont ], [ %x, %entry ]
102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  %v U: full-set S: full-set
103*9880d681SAndroid Build Coastguard Worker  ret i32 %v
104*9880d681SAndroid Build Coastguard Worker}
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerdefine i32 @f5(i32* %val) {
107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f5
108*9880d681SAndroid Build Coastguard Workerentry:
109*9880d681SAndroid Build Coastguard Worker  br label %for.end
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerfor.condt:
112*9880d681SAndroid Build Coastguard Worker  br i1 true, label %for.cond.0, label %for.end
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerfor.end:
115*9880d681SAndroid Build Coastguard Worker  %inc = load i32, i32* %val
116*9880d681SAndroid Build Coastguard Worker  br i1 false, label %for.condt, label %for.cond.0
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Workerfor.cond.0:
119*9880d681SAndroid Build Coastguard Worker  %init = phi i32 [ 0, %for.condt ], [ %inc, %for.end ]
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker; CHECK:  %init = phi i32 [ 0, %for.condt ], [ %inc, %for.end ]
122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  -->  %init U: full-set S: full-set
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker; Matching "through" %init will break LCSSA at the SCEV expression
125*9880d681SAndroid Build Coastguard Worker; level.
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker  ret i32 %init
128*9880d681SAndroid Build Coastguard Worker}
129