xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/2011-09-14-valcoalesce.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86 -disable-block-placement | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; Test RegistersDefinedFromSameValue. We have multiple copies of the same vreg:
4*9880d681SAndroid Build Coastguard Worker; while.body85.i:
5*9880d681SAndroid Build Coastguard Worker;   vreg1 = copy vreg2
6*9880d681SAndroid Build Coastguard Worker;   vreg2 = add
7*9880d681SAndroid Build Coastguard Worker; critical edge from land.lhs.true.i -> if.end117.i:
8*9880d681SAndroid Build Coastguard Worker;   vreg27 = vreg2
9*9880d681SAndroid Build Coastguard Worker; critical edge from land.lhs.true103.i -> if.end117.i:
10*9880d681SAndroid Build Coastguard Worker;   vreg27 = vreg2
11*9880d681SAndroid Build Coastguard Worker; if.then108.i:
12*9880d681SAndroid Build Coastguard Worker;   vreg27 = vreg1
13*9880d681SAndroid Build Coastguard Worker;
14*9880d681SAndroid Build Coastguard Worker; Prior to fixing PR10920 401.bzip miscompile, the coalescer would
15*9880d681SAndroid Build Coastguard Worker; consider vreg1 and vreg27 to be copies of the same value. It would
16*9880d681SAndroid Build Coastguard Worker; then remove one of the critical edge copes, which cannot safely be removed.
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker; There are two obvious ways the register-allocator could go here, either
19*9880d681SAndroid Build Coastguard Worker; reusing the pre-addition register later, or the post-addition one. Currently,
20*9880d681SAndroid Build Coastguard Worker; it does the latter, so we check:
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker; CHECK: # %while.body85.i{{$}}
23*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: # %
24*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add
25*9880d681SAndroid Build Coastguard Worker; CHECK: movl %[[POSTR:e[abcdxi]+]], %[[PRER:e[abcdxi]+]]
26*9880d681SAndroid Build Coastguard Worker; CHECK: addl %{{.*}}, %[[POSTR]]
27*9880d681SAndroid Build Coastguard Worker; CHECK: # %while.end.i
28*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movl %[[POSTR]]
29*9880d681SAndroid Build Coastguard Worker; CHECK: # %land.lhs.true.i
30*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movl %[[POSTR]]
31*9880d681SAndroid Build Coastguard Worker; CHECK: # %land.lhs.true103.i
32*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movl %[[POSTR]]
33*9880d681SAndroid Build Coastguard Worker; CHECK: # %if.then108.i
34*9880d681SAndroid Build Coastguard Worker; CHECK: movl %[[PRER]], %[[POSTR]]
35*9880d681SAndroid Build Coastguard Worker; CHECK: # %if.end117.i
36*9880d681SAndroid Build Coastguard Worker;   and use it for fprintf:
37*9880d681SAndroid Build Coastguard Worker; CHECK: movl %[[POSTR]], 12(%esp)
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker; If it ever reverts to reusing the pre-addition register then we should
41*9880d681SAndroid Build Coastguard Worker; *probably* check this instead (it certainly worked last time):
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker; CHECKALT: # %while.body85.i
44*9880d681SAndroid Build Coastguard Worker; CHECKALT-NOT: # %
45*9880d681SAndroid Build Coastguard Worker; CHECKALT-NOT: add
46*9880d681SAndroid Build Coastguard Worker; CHECKALT: movl %[[POSTR:e[abcdxi]+]], %[[PRER:e[abcdxi]+]]
47*9880d681SAndroid Build Coastguard Worker; CHECKALT: addl %{{.*}}, %[[POSTR]]
48*9880d681SAndroid Build Coastguard Worker; CHECKALT: # %while.end.i
49*9880d681SAndroid Build Coastguard Worker; CHECKALT: movl %[[POSTR]], %[[USER:e[abcdxi]+]]
50*9880d681SAndroid Build Coastguard Worker; CHECKALT: # %land.lhs.true.i
51*9880d681SAndroid Build Coastguard Worker; CHECKALT: movl %[[POSTR]], %[[USER]]
52*9880d681SAndroid Build Coastguard Worker; CHECKALT: # %land.lhs.true103.i
53*9880d681SAndroid Build Coastguard Worker; CHECKALT: movl %[[POSTR]], %[[USER]]
54*9880d681SAndroid Build Coastguard Worker; CHECKALT: # %if.then108.i
55*9880d681SAndroid Build Coastguard Worker; [[PRER] live out, so nothing on this path should define it.
56*9880d681SAndroid Build Coastguard Worker; CHECKALT-NOT: , %[[PRER]]
57*9880d681SAndroid Build Coastguard Worker; CHECKALT: # %if.end117.i
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32"
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker@.str3 = external unnamed_addr constant [59 x i8], align 1
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdefine void @BZ2_compressBlock() nounwind ssp {
64*9880d681SAndroid Build Coastguard Workerentry:
65*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if.then68, label %if.end85
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerif.then68:                                        ; preds = %entry
68*9880d681SAndroid Build Coastguard Worker  br label %for.body.i.i
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerfor.body.i.i:                                     ; preds = %for.inc.i.i, %if.then68
71*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.inc.i.i, label %if.then.i.i
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workerif.then.i.i:                                      ; preds = %for.body.i.i
74*9880d681SAndroid Build Coastguard Worker  br label %for.inc.i.i
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Workerfor.inc.i.i:                                      ; preds = %if.then.i.i, %for.body.i.i
77*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %makeMaps_e.exit.i, label %for.body.i.i
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard WorkermakeMaps_e.exit.i:                                ; preds = %for.inc.i.i
80*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.cond19.preheader.i, label %for.cond.for.cond19.preheader_crit_edge.i
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerfor.cond.for.cond19.preheader_crit_edge.i:        ; preds = %makeMaps_e.exit.i
83*9880d681SAndroid Build Coastguard Worker  unreachable
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerfor.cond19.preheader.i:                           ; preds = %makeMaps_e.exit.i
86*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.body25.lr.ph.i, label %for.cond33.preheader.i
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerfor.body25.lr.ph.i:                               ; preds = %for.cond19.preheader.i
89*9880d681SAndroid Build Coastguard Worker  br label %for.body25.i
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerfor.cond33.preheader.i:                           ; preds = %for.body25.i, %for.cond19.preheader.i
92*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if.then.i, label %if.end.i
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerfor.body25.i:                                     ; preds = %for.body25.i, %for.body25.lr.ph.i
95*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.body25.i, label %for.cond33.preheader.i
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerif.then.i:                                        ; preds = %for.cond33.preheader.i
98*9880d681SAndroid Build Coastguard Worker  br label %if.end.i
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerif.end.i:                                         ; preds = %if.then.i, %for.cond33.preheader.i
101*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.inc27.us.5.i, label %for.end30.i
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerfor.end30.i:                                      ; preds = %for.inc27.us.5.i, %if.end.i
104*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if.end36.i, label %if.then35.i
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerif.then35.i:                                      ; preds = %for.end30.i
107*9880d681SAndroid Build Coastguard Worker  unreachable
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerif.end36.i:                                       ; preds = %for.end30.i
110*9880d681SAndroid Build Coastguard Worker  %sub83.i = add nsw i32 undef, 1
111*9880d681SAndroid Build Coastguard Worker  br label %while.body.i188
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerfor.cond182.preheader.i:                          ; preds = %for.end173.i
114*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.inc220.us.i, label %while.body300.preheader.i
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workerwhile.body.i188:                                  ; preds = %for.end173.i, %if.end36.i
117*9880d681SAndroid Build Coastguard Worker  %gs.0526.i = phi i32 [ 0, %if.end36.i ], [ %add177.i, %for.end173.i ]
118*9880d681SAndroid Build Coastguard Worker  %or.cond514517.i = and i1 false, undef
119*9880d681SAndroid Build Coastguard Worker  br i1 %or.cond514517.i, label %while.body85.i, label %if.end117.i
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerwhile.body85.i:                                   ; preds = %while.body85.i, %while.body.i188
122*9880d681SAndroid Build Coastguard Worker  %aFreq.0518.i = phi i32 [ %add93.i, %while.body85.i ], [ 0, %while.body.i188 ]
123*9880d681SAndroid Build Coastguard Worker  %inc87.i = add nsw i32 0, 1
124*9880d681SAndroid Build Coastguard Worker  %tmp91.i = load i32, i32* undef, align 4
125*9880d681SAndroid Build Coastguard Worker  %add93.i = add nsw i32 %tmp91.i, %aFreq.0518.i
126*9880d681SAndroid Build Coastguard Worker  %or.cond514.i = and i1 undef, false
127*9880d681SAndroid Build Coastguard Worker  br i1 %or.cond514.i, label %while.body85.i, label %while.end.i
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Workerwhile.end.i:                                      ; preds = %while.body85.i
130*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %land.lhs.true.i, label %if.end117.i
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Workerland.lhs.true.i:                                  ; preds = %while.end.i
133*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %land.lhs.true103.i, label %if.end117.i
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerland.lhs.true103.i:                               ; preds = %land.lhs.true.i
136*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if.then108.i, label %if.end117.i
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workerif.then108.i:                                     ; preds = %land.lhs.true103.i
139*9880d681SAndroid Build Coastguard Worker  br label %if.end117.i
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Workerif.end117.i:                                      ; preds = %if.then108.i, %land.lhs.true103.i, %land.lhs.true.i, %while.end.i, %while.body.i188
142*9880d681SAndroid Build Coastguard Worker  %aFreq.1.i = phi i32 [ %aFreq.0518.i, %if.then108.i ], [ %add93.i, %land.lhs.true103.i ], [ %add93.i, %land.lhs.true.i ], [ %add93.i, %while.end.i ], [ 0, %while.body.i188 ]
143*9880d681SAndroid Build Coastguard Worker  %ge.1.i = phi i32 [ 0, %if.then108.i ], [ %inc87.i, %land.lhs.true103.i ], [ %inc87.i, %land.lhs.true.i ], [ %inc87.i, %while.end.i ], [ 0, %while.body.i188 ]
144*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if.then122.i, label %for.cond138.preheader.i
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Workerif.then122.i:                                     ; preds = %if.end117.i
147*9880d681SAndroid Build Coastguard Worker  call void (...) @fprintf(i32 undef, i32 %gs.0526.i, i32 %ge.1.i, i32 %aFreq.1.i, double undef) nounwind
148*9880d681SAndroid Build Coastguard Worker  br label %for.cond138.preheader.i
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Workerfor.cond138.preheader.i:                          ; preds = %if.then122.i, %if.end117.i
151*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.body143.lr.ph.i, label %for.end173.i
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Workerfor.body143.lr.ph.i:                              ; preds = %for.cond138.preheader.i
154*9880d681SAndroid Build Coastguard Worker  br label %for.body143.i
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerfor.body143.i:                                    ; preds = %for.body143.i, %for.body143.lr.ph.i
157*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.end173.i, label %for.body143.i
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Workerfor.end173.i:                                     ; preds = %for.body143.i, %for.cond138.preheader.i
160*9880d681SAndroid Build Coastguard Worker  %add177.i = add nsw i32 %ge.1.i, 1
161*9880d681SAndroid Build Coastguard Worker  %cmp73.i = icmp sgt i32 undef, 0
162*9880d681SAndroid Build Coastguard Worker  br i1 %cmp73.i, label %while.body.i188, label %for.cond182.preheader.i
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workerfor.inc220.us.i:                                  ; preds = %for.cond182.preheader.i
165*9880d681SAndroid Build Coastguard Worker  unreachable
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerwhile.body300.preheader.i:                        ; preds = %for.cond182.preheader.i
168*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.end335.i, label %while.end2742.i
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Workerfor.end335.i:                                     ; preds = %for.end2039.i, %while.body300.preheader.i
171*9880d681SAndroid Build Coastguard Worker  br label %for.body2021.i
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerfor.body2021.i:                                   ; preds = %for.body2021.i, %for.end335.i
174*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.body2021.i, label %for.end2039.i
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workerfor.end2039.i:                                    ; preds = %for.body2021.i
177*9880d681SAndroid Build Coastguard Worker  br label %for.end335.i
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Workerwhile.end2742.i:                                  ; preds = %while.body300.preheader.i
180*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if.then2748.i, label %for.body2778.i
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Workerif.then2748.i:                                    ; preds = %while.end2742.i
183*9880d681SAndroid Build Coastguard Worker  unreachable
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Workerfor.body2778.i:                                   ; preds = %while.end2742.i
186*9880d681SAndroid Build Coastguard Worker  unreachable
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workerfor.inc27.us.5.i:                                 ; preds = %if.end.i
189*9880d681SAndroid Build Coastguard Worker  br label %for.end30.i
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Workerif.end85:                                         ; preds = %entry
192*9880d681SAndroid Build Coastguard Worker  ret void
193*9880d681SAndroid Build Coastguard Worker}
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Workerdeclare void @fprintf(...) nounwind
196