xref: /aosp_15_r20/external/llvm/test/Transforms/LoopSimplify/preserve-scev.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S < %s -indvars | opt -analyze -iv-users | grep "%cmp = icmp slt i32" | grep "= {%\.ph,+,1}<%for.cond>"
2*9880d681SAndroid Build Coastguard Worker; PR8079
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; Provide legal integer types.
5*9880d681SAndroid Build Coastguard Workertarget datalayout = "n8:16:32:64"
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; LoopSimplify should invalidate indvars when splitting out the
8*9880d681SAndroid Build Coastguard Worker; inner loop.
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker@maxStat = external global i32
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine i32 @test() nounwind {
13*9880d681SAndroid Build Coastguard Workerentry:
14*9880d681SAndroid Build Coastguard Worker  br label %for.cond
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerfor.cond:                                         ; preds = %if.then5, %if.end, %entry
17*9880d681SAndroid Build Coastguard Worker  %cuts.1 = phi i32 [ 0, %entry ], [ %inc, %if.then5 ], [ %cuts.1, %if.end ]
18*9880d681SAndroid Build Coastguard Worker  %0 = phi i32 [ 0, %entry ], [ %add, %if.end ], [ %add, %if.then5 ]
19*9880d681SAndroid Build Coastguard Worker  %add = add i32 %0, 1
20*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %0, 1
21*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* @maxStat, align 4
22*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.cond14.preheader
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerfor.cond14.preheader:                             ; preds = %for.cond
25*9880d681SAndroid Build Coastguard Worker  %cmp1726 = icmp sgt i32 %tmp1, 0
26*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1726, label %for.body18, label %return
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.cond
29*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp sgt i32 %tmp1, 100
30*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %return, label %if.end
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %for.body
33*9880d681SAndroid Build Coastguard Worker  %cmp4 = icmp sgt i32 %tmp1, -1
34*9880d681SAndroid Build Coastguard Worker  br i1 %cmp4, label %if.then5, label %for.cond
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workerif.then5:                                         ; preds = %if.end
37*9880d681SAndroid Build Coastguard Worker  call void @foo() nounwind
38*9880d681SAndroid Build Coastguard Worker  %inc = add i32 %cuts.1, 1
39*9880d681SAndroid Build Coastguard Worker  br label %for.cond
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerfor.body18:                                       ; preds = %for.body18, %for.cond14.preheader
42*9880d681SAndroid Build Coastguard Worker  %i13.027 = phi i32 [ %1, %for.body18 ], [ 0, %for.cond14.preheader ]
43*9880d681SAndroid Build Coastguard Worker  call void @foo() nounwind
44*9880d681SAndroid Build Coastguard Worker  %1 = add nsw i32 %i13.027, 1
45*9880d681SAndroid Build Coastguard Worker  %tmp16 = load i32, i32* @maxStat, align 4
46*9880d681SAndroid Build Coastguard Worker  %cmp17 = icmp slt i32 %1, %tmp16
47*9880d681SAndroid Build Coastguard Worker  br i1 %cmp17, label %for.body18, label %return
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %for.body18, %for.body, %for.cond14.preheader
50*9880d681SAndroid Build Coastguard Worker  ret i32 0
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdeclare void @foo() nounwind
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker; Notify SCEV when removing an ExitingBlock.
56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @mergeExit(
57*9880d681SAndroid Build Coastguard Worker; CHECK: while.cond191:
58*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %or.cond, label %while.body197
59*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: land.rhs:
60*9880d681SAndroid Build Coastguard Worker; CHECK: ret
61*9880d681SAndroid Build Coastguard Workerdefine void @mergeExit(i32 %MapAttrCount) nounwind uwtable ssp {
62*9880d681SAndroid Build Coastguard Workerentry:
63*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if.then124, label %if.end126
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerif.then124:                                       ; preds = %entry
66*9880d681SAndroid Build Coastguard Worker  unreachable
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerif.end126:                                        ; preds = %entry
69*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %while.body.lr.ph, label %if.end591
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerwhile.body.lr.ph:                                 ; preds = %if.end126
72*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if.end140, label %if.then137
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerif.then137:                                       ; preds = %while.body.lr.ph
75*9880d681SAndroid Build Coastguard Worker  unreachable
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerif.end140:                                        ; preds = %while.body.lr.ph
78*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %while.cond191.outer, label %if.then148
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerif.then148:                                       ; preds = %if.end140
81*9880d681SAndroid Build Coastguard Worker  unreachable
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Workerwhile.cond191.outer:                              ; preds = %if.then205, %if.end140
84*9880d681SAndroid Build Coastguard Worker  br label %while.cond191
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workerwhile.cond191:                                    ; preds = %while.body197, %while.cond191.outer
87*9880d681SAndroid Build Coastguard Worker  %CppIndex.0 = phi i32 [ %inc, %while.body197 ], [ undef, %while.cond191.outer ]
88*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %land.rhs, label %if.then216
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerland.rhs:                                         ; preds = %while.cond191
91*9880d681SAndroid Build Coastguard Worker  %inc = add i32 %CppIndex.0, 1
92*9880d681SAndroid Build Coastguard Worker  %cmp196 = icmp ult i32 %inc, %MapAttrCount
93*9880d681SAndroid Build Coastguard Worker  br i1 %cmp196, label %while.body197, label %if.then216
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerwhile.body197:                                    ; preds = %land.rhs
96*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if.then205, label %while.cond191
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerif.then205:                                       ; preds = %while.body197
99*9880d681SAndroid Build Coastguard Worker  br label %while.cond191.outer
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerif.then216:                                       ; preds = %land.rhs, %while.cond191
102*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if.else, label %if.then221
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Workerif.then221:                                       ; preds = %if.then216
105*9880d681SAndroid Build Coastguard Worker  unreachable
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerif.else:                                          ; preds = %if.then216
108*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if.then266, label %if.end340
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerif.then266:                                       ; preds = %if.else
111*9880d681SAndroid Build Coastguard Worker  switch i32 undef, label %if.else329 [
112*9880d681SAndroid Build Coastguard Worker    i32 17, label %if.then285
113*9880d681SAndroid Build Coastguard Worker    i32 19, label %if.then285
114*9880d681SAndroid Build Coastguard Worker    i32 18, label %if.then285
115*9880d681SAndroid Build Coastguard Worker    i32 15, label %if.then285
116*9880d681SAndroid Build Coastguard Worker  ]
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Workerif.then285:                                       ; preds = %if.then266, %if.then266, %if.then266, %if.then266
119*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if.then317, label %if.else324
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerif.then317:                                       ; preds = %if.then285
122*9880d681SAndroid Build Coastguard Worker  br label %if.end340
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Workerif.else324:                                       ; preds = %if.then285
125*9880d681SAndroid Build Coastguard Worker  unreachable
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workerif.else329:                                       ; preds = %if.then266
128*9880d681SAndroid Build Coastguard Worker  unreachable
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Workerif.end340:                                        ; preds = %if.then317, %if.else
131*9880d681SAndroid Build Coastguard Worker  unreachable
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Workerif.end591:                                        ; preds = %if.end126
134*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %cond.end, label %cond.false
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workercond.false:                                       ; preds = %if.end591
137*9880d681SAndroid Build Coastguard Worker  unreachable
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workercond.end:                                         ; preds = %if.end591
140*9880d681SAndroid Build Coastguard Worker  ret void
141*9880d681SAndroid Build Coastguard Worker}
142