xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/lsr-delayed-fold.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=x86-64 < %s > /dev/null
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; ScalarEvolution misses an opportunity to fold ((trunc x) + (trunc -x) + y),
4*9880d681SAndroid Build Coastguard Worker; but LSR should tolerate this.
5*9880d681SAndroid Build Coastguard Worker; rdar://7886751
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
8*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-darwin11.0"
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerdefine fastcc void @formatValue(i64 %arg5) nounwind {
11*9880d681SAndroid Build Coastguard Workerbb12:                                             ; preds = %bb11
12*9880d681SAndroid Build Coastguard Worker  %t = trunc i64 %arg5 to i32                   ; <i32> [#uses=1]
13*9880d681SAndroid Build Coastguard Worker  %t13 = sub i64 0, %arg5                       ; <i64> [#uses=1]
14*9880d681SAndroid Build Coastguard Worker  %t14 = and i64 %t13, 4294967295             ; <i64> [#uses=1]
15*9880d681SAndroid Build Coastguard Worker  br label %bb15
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerbb15:                                             ; preds = %bb21, %bb12
18*9880d681SAndroid Build Coastguard Worker  %t16 = phi i64 [ 0, %bb12 ], [ %t23, %bb15 ] ; <i64> [#uses=2]
19*9880d681SAndroid Build Coastguard Worker  %t17 = mul i64 %t14, %t16                 ; <i64> [#uses=1]
20*9880d681SAndroid Build Coastguard Worker  %t18 = add i64 undef, %t17                  ; <i64> [#uses=1]
21*9880d681SAndroid Build Coastguard Worker  %t19 = trunc i64 %t18 to i32                ; <i32> [#uses=1]
22*9880d681SAndroid Build Coastguard Worker  %t22 = icmp eq i32 %t19, %t               ; <i1> [#uses=1]
23*9880d681SAndroid Build Coastguard Worker  %t23 = add i64 %t16, 1                      ; <i64> [#uses=1]
24*9880d681SAndroid Build Coastguard Worker  br i1 %t22, label %bb24, label %bb15
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerbb24:                                             ; preds = %bb21, %bb11
27*9880d681SAndroid Build Coastguard Worker  unreachable
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker; ScalarEvolution should be able to correctly expand the crazy addrec here.
31*9880d681SAndroid Build Coastguard Worker; PR6914
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerdefine void @int323() nounwind {
34*9880d681SAndroid Build Coastguard Workerentry:
35*9880d681SAndroid Build Coastguard Worker  br label %for.cond
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerfor.cond:                                         ; preds = %lbl_264, %for.inc, %entry
38*9880d681SAndroid Build Coastguard Worker  %g_263.tmp.1 = phi i8 [ undef, %entry ], [ %g_263.tmp.1, %for.cond ]
39*9880d681SAndroid Build Coastguard Worker  %p_95.addr.0 = phi i8 [ 0, %entry ], [ %add, %for.cond ]
40*9880d681SAndroid Build Coastguard Worker  %add = add i8 %p_95.addr.0, 1                   ; <i8> [#uses=1]
41*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.cond, label %lbl_264
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerlbl_264:                                          ; preds = %if.end, %lbl_264.preheader
44*9880d681SAndroid Build Coastguard Worker  %g_263.tmp.0 = phi i8 [ %g_263.tmp.1, %for.cond ] ; <i8> [#uses=1]
45*9880d681SAndroid Build Coastguard Worker  %tmp7 = load i16, i16* undef                         ; <i16> [#uses=1]
46*9880d681SAndroid Build Coastguard Worker  %conv8 = trunc i16 %tmp7 to i8                  ; <i8> [#uses=1]
47*9880d681SAndroid Build Coastguard Worker  %mul.i = mul i8 %p_95.addr.0, %p_95.addr.0      ; <i8> [#uses=1]
48*9880d681SAndroid Build Coastguard Worker  %mul.i18 = mul i8 %mul.i, %conv8                ; <i8> [#uses=1]
49*9880d681SAndroid Build Coastguard Worker  %tobool12 = icmp eq i8 %mul.i18, 0              ; <i1> [#uses=1]
50*9880d681SAndroid Build Coastguard Worker  unreachable
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker; LSR ends up going into conservative pruning mode; don't prune the solution
54*9880d681SAndroid Build Coastguard Worker; so far that it becomes unsolvable though.
55*9880d681SAndroid Build Coastguard Worker; PR7077
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker%struct.Bu = type { i32, i32, i32 }
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdefine void @_Z3fooP2Bui(%struct.Bu* nocapture %bu) {
60*9880d681SAndroid Build Coastguard Workerentry:
61*9880d681SAndroid Build Coastguard Worker  br label %for.body
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.inc131, %entry
64*9880d681SAndroid Build Coastguard Worker  %indvar = phi i64 [ %indvar.next, %for.inc131 ], [ 0, %entry ] ; <i64> [#uses=3]
65*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.inc131, label %lor.lhs.false
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerlor.lhs.false:                                    ; preds = %for.body
68*9880d681SAndroid Build Coastguard Worker  %tmp15 = add i64 %indvar, 1                     ; <i64> [#uses=1]
69*9880d681SAndroid Build Coastguard Worker  %tmp17 = add i64 %indvar, 2                      ; <i64> [#uses=1]
70*9880d681SAndroid Build Coastguard Worker  %tmp19 = add i64 %indvar, 3                      ; <i64> [#uses=1]
71*9880d681SAndroid Build Coastguard Worker  %tmp21 = add i64 %indvar, 4                      ; <i64> [#uses=1]
72*9880d681SAndroid Build Coastguard Worker  %tmp23 = add i64 %indvar, 5                      ; <i64> [#uses=1]
73*9880d681SAndroid Build Coastguard Worker  %tmp25 = add i64 %indvar, 6                      ; <i64> [#uses=1]
74*9880d681SAndroid Build Coastguard Worker  %tmp27 = add i64 %indvar, 7                      ; <i64> [#uses=1]
75*9880d681SAndroid Build Coastguard Worker  %tmp29 = add i64 %indvar, 8                      ; <i64> [#uses=1]
76*9880d681SAndroid Build Coastguard Worker  %tmp31 = add i64 %indvar, 9                      ; <i64> [#uses=1]
77*9880d681SAndroid Build Coastguard Worker  %tmp35 = add i64 %indvar, 11                     ; <i64> [#uses=1]
78*9880d681SAndroid Build Coastguard Worker  %tmp37 = add i64 %indvar, 12                     ; <i64> [#uses=1]
79*9880d681SAndroid Build Coastguard Worker  %tmp39 = add i64 %indvar, 13                     ; <i64> [#uses=1]
80*9880d681SAndroid Build Coastguard Worker  %tmp41 = add i64 %indvar, 14                     ; <i64> [#uses=1]
81*9880d681SAndroid Build Coastguard Worker  %tmp43 = add i64 %indvar, 15                     ; <i64> [#uses=1]
82*9880d681SAndroid Build Coastguard Worker  %tmp45 = add i64 %indvar, 16                     ; <i64> [#uses=1]
83*9880d681SAndroid Build Coastguard Worker  %tmp47 = add i64 %indvar, 17                     ; <i64> [#uses=1]
84*9880d681SAndroid Build Coastguard Worker  %mul = trunc i64 %indvar to i32                  ; <i32> [#uses=1]
85*9880d681SAndroid Build Coastguard Worker  %add22 = trunc i64 %tmp15 to i32                ; <i32> [#uses=1]
86*9880d681SAndroid Build Coastguard Worker  %add28 = trunc i64 %tmp17 to i32                ; <i32> [#uses=1]
87*9880d681SAndroid Build Coastguard Worker  %add34 = trunc i64 %tmp19 to i32                ; <i32> [#uses=1]
88*9880d681SAndroid Build Coastguard Worker  %add40 = trunc i64 %tmp21 to i32                ; <i32> [#uses=1]
89*9880d681SAndroid Build Coastguard Worker  %add46 = trunc i64 %tmp23 to i32                ; <i32> [#uses=1]
90*9880d681SAndroid Build Coastguard Worker  %add52 = trunc i64 %tmp25 to i32                ; <i32> [#uses=1]
91*9880d681SAndroid Build Coastguard Worker  %add58 = trunc i64 %tmp27 to i32                ; <i32> [#uses=1]
92*9880d681SAndroid Build Coastguard Worker  %add64 = trunc i64 %tmp29 to i32                ; <i32> [#uses=1]
93*9880d681SAndroid Build Coastguard Worker  %add70 = trunc i64 %tmp31 to i32                ; <i32> [#uses=1]
94*9880d681SAndroid Build Coastguard Worker  %add82 = trunc i64 %tmp35 to i32                ; <i32> [#uses=1]
95*9880d681SAndroid Build Coastguard Worker  %add88 = trunc i64 %tmp37 to i32                ; <i32> [#uses=1]
96*9880d681SAndroid Build Coastguard Worker  %add94 = trunc i64 %tmp39 to i32                ; <i32> [#uses=1]
97*9880d681SAndroid Build Coastguard Worker  %add100 = trunc i64 %tmp41 to i32               ; <i32> [#uses=1]
98*9880d681SAndroid Build Coastguard Worker  %add106 = trunc i64 %tmp43 to i32               ; <i32> [#uses=1]
99*9880d681SAndroid Build Coastguard Worker  %add112 = trunc i64 %tmp45 to i32               ; <i32> [#uses=1]
100*9880d681SAndroid Build Coastguard Worker  %add118 = trunc i64 %tmp47 to i32               ; <i32> [#uses=1]
101*9880d681SAndroid Build Coastguard Worker  %tmp10 = getelementptr %struct.Bu, %struct.Bu* %bu, i64 %indvar, i32 2 ; <i32*> [#uses=1]
102*9880d681SAndroid Build Coastguard Worker  %tmp11 = load i32, i32* %tmp10                       ; <i32> [#uses=0]
103*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add22)
104*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add28)
105*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add34)
106*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add40)
107*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add46)
108*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add52)
109*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add58)
110*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add64)
111*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add70)
112*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add82)
113*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add88)
114*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add94)
115*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add100)
116*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add106)
117*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add112)
118*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add118)
119*9880d681SAndroid Build Coastguard Worker  br label %for.body123
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerfor.body123:                                      ; preds = %for.body123, %lor.lhs.false
122*9880d681SAndroid Build Coastguard Worker  %j.03 = phi i32 [ 0, %lor.lhs.false ], [ %inc, %for.body123 ] ; <i32> [#uses=2]
123*9880d681SAndroid Build Coastguard Worker  %add129 = add i32 %mul, %j.03                   ; <i32> [#uses=1]
124*9880d681SAndroid Build Coastguard Worker  tail call void undef(i32 %add129)
125*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i32 %j.03, 1                     ; <i32> [#uses=1]
126*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.inc131, label %for.body123
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerfor.inc131:                                       ; preds = %for.body123, %for.body
129*9880d681SAndroid Build Coastguard Worker  %indvar.next = add i64 %indvar, 1               ; <i64> [#uses=1]
130*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.end134, label %for.body
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Workerfor.end134:                                       ; preds = %for.inc131
133*9880d681SAndroid Build Coastguard Worker  ret void
134*9880d681SAndroid Build Coastguard Worker}
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Worker; LSR needs to remember inserted instructions even in postinc mode, because
137*9880d681SAndroid Build Coastguard Worker; there could be multiple subexpressions within a single expansion which
138*9880d681SAndroid Build Coastguard Worker; require insert point adjustment.
139*9880d681SAndroid Build Coastguard Worker; PR7306
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Workerdefine fastcc i32 @GetOptimum() nounwind {
142*9880d681SAndroid Build Coastguard Workerbb:
143*9880d681SAndroid Build Coastguard Worker  br label %bb1
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerbb1:                                              ; preds = %bb1, %bb
146*9880d681SAndroid Build Coastguard Worker  %t = phi i32 [ 0, %bb ], [ %t2, %bb1 ]      ; <i32> [#uses=1]
147*9880d681SAndroid Build Coastguard Worker  %t2 = add i32 %t, undef                     ; <i32> [#uses=3]
148*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %bb1, label %bb3
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Workerbb3:                                              ; preds = %bb1
151*9880d681SAndroid Build Coastguard Worker  %t4 = add i32 undef, -1                       ; <i32> [#uses=1]
152*9880d681SAndroid Build Coastguard Worker  br label %bb5
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Workerbb5:                                              ; preds = %bb16, %bb3
155*9880d681SAndroid Build Coastguard Worker  %t6 = phi i32 [ %t17, %bb16 ], [ 0, %bb3 ]  ; <i32> [#uses=3]
156*9880d681SAndroid Build Coastguard Worker  %t7 = add i32 undef, %t6                    ; <i32> [#uses=2]
157*9880d681SAndroid Build Coastguard Worker  %t8 = add i32 %t4, %t6                    ; <i32> [#uses=1]
158*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %bb9, label %bb10
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Workerbb9:                                              ; preds = %bb5
161*9880d681SAndroid Build Coastguard Worker  br label %bb10
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workerbb10:                                             ; preds = %bb9, %bb5
164*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %bb11, label %bb16
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Workerbb11:                                             ; preds = %bb10
167*9880d681SAndroid Build Coastguard Worker  %t12 = icmp ugt i32 %t7, %t2              ; <i1> [#uses=1]
168*9880d681SAndroid Build Coastguard Worker  %t13 = select i1 %t12, i32 %t2, i32 %t7 ; <i32> [#uses=1]
169*9880d681SAndroid Build Coastguard Worker  br label %bb14
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerbb14:                                             ; preds = %bb11
172*9880d681SAndroid Build Coastguard Worker  store i32 %t13, i32* null
173*9880d681SAndroid Build Coastguard Worker  ret i32 %t8
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Workerbb16:                                             ; preds = %bb10
176*9880d681SAndroid Build Coastguard Worker  %t17 = add i32 %t6, 1                       ; <i32> [#uses=1]
177*9880d681SAndroid Build Coastguard Worker  br label %bb5
178*9880d681SAndroid Build Coastguard Worker}
179