xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/sink-hoist.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -verify-machineinstrs -march=x86-64 -asm-verbose=false -mtriple=x86_64-unknown-linux-gnu -mcpu=nehalem -post-RA-scheduler=true -schedmodel=false | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Currently, floating-point selects are lowered to CFG triangles.
4*9880d681SAndroid Build Coastguard Worker; This means that one side of the select is always unconditionally
5*9880d681SAndroid Build Coastguard Worker; evaluated, however with MachineSink we can sink the other side so
6*9880d681SAndroid Build Coastguard Worker; that it's conditionally evaluated.
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo:
9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: testb $1, %dil
10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: jne
11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: divsd
12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movapd
13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
14*9880d681SAndroid Build Coastguard Worker; CHECK:      divsd
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdefine double @foo(double %x, double %y, i1 %c) nounwind {
17*9880d681SAndroid Build Coastguard Worker  %a = fdiv double %x, 3.2
18*9880d681SAndroid Build Coastguard Worker  %b = fdiv double %y, 3.3
19*9880d681SAndroid Build Coastguard Worker  %z = select i1 %c, double %a, double %b
20*9880d681SAndroid Build Coastguard Worker  ret double %z
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker; Make sure the critical edge is broken so the divsd is sunken below
24*9880d681SAndroid Build Coastguard Worker; the conditional branch.
25*9880d681SAndroid Build Coastguard Worker; rdar://8454886
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: split:
28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: testb $1, %dil
29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je
30*9880d681SAndroid Build Coastguard Worker; CHECK:      divsd
31*9880d681SAndroid Build Coastguard Worker; CHECK:      movapd
32*9880d681SAndroid Build Coastguard Worker; CHECK:      ret
33*9880d681SAndroid Build Coastguard Workerdefine double @split(double %x, double %y, i1 %c) nounwind {
34*9880d681SAndroid Build Coastguard Worker  %a = fdiv double %x, 3.2
35*9880d681SAndroid Build Coastguard Worker  %z = select i1 %c, double %a, double %y
36*9880d681SAndroid Build Coastguard Worker  ret double %z
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker; Hoist floating-point constant-pool loads out of loops.
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bar:
43*9880d681SAndroid Build Coastguard Worker; CHECK: movsd
44*9880d681SAndroid Build Coastguard Worker; CHECK: align
45*9880d681SAndroid Build Coastguard Workerdefine void @bar(double* nocapture %p, i64 %n) nounwind {
46*9880d681SAndroid Build Coastguard Workerentry:
47*9880d681SAndroid Build Coastguard Worker  %0 = icmp sgt i64 %n, 0
48*9880d681SAndroid Build Coastguard Worker  br i1 %0, label %bb, label %return
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerbb:
51*9880d681SAndroid Build Coastguard Worker  %i.03 = phi i64 [ 0, %entry ], [ %3, %bb ]
52*9880d681SAndroid Build Coastguard Worker  %scevgep = getelementptr double, double* %p, i64 %i.03
53*9880d681SAndroid Build Coastguard Worker  %1 = load double, double* %scevgep, align 8
54*9880d681SAndroid Build Coastguard Worker  %2 = fdiv double 3.200000e+00, %1
55*9880d681SAndroid Build Coastguard Worker  store double %2, double* %scevgep, align 8
56*9880d681SAndroid Build Coastguard Worker  %3 = add nsw i64 %i.03, 1
57*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i64 %3, %n
58*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %return, label %bb
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerreturn:
61*9880d681SAndroid Build Coastguard Worker  ret void
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker; Sink instructions with dead EFLAGS defs.
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; FIXME: Unfail the zzz test if we can correctly mark pregs with the kill flag.
67*9880d681SAndroid Build Coastguard Worker;
68*9880d681SAndroid Build Coastguard Worker; See <rdar://problem/8030636>. This test isn't valid after we made machine
69*9880d681SAndroid Build Coastguard Worker; sinking more conservative about sinking instructions that define a preg into a
70*9880d681SAndroid Build Coastguard Worker; block when we don't know if the preg is killed within the current block.
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker; FIXMEHECK: zzz:
74*9880d681SAndroid Build Coastguard Worker; FIXMEHECK:      je
75*9880d681SAndroid Build Coastguard Worker; FIXMEHECK-NEXT: orb
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker; define zeroext i8 @zzz(i8 zeroext %a, i8 zeroext %b) nounwind readnone {
78*9880d681SAndroid Build Coastguard Worker; entry:
79*9880d681SAndroid Build Coastguard Worker;   %tmp = zext i8 %a to i32                        ; <i32> [#uses=1]
80*9880d681SAndroid Build Coastguard Worker;   %tmp2 = icmp eq i8 %a, 0                    ; <i1> [#uses=1]
81*9880d681SAndroid Build Coastguard Worker;   %tmp3 = or i8 %b, -128                          ; <i8> [#uses=1]
82*9880d681SAndroid Build Coastguard Worker;   %tmp4 = and i8 %b, 127                          ; <i8> [#uses=1]
83*9880d681SAndroid Build Coastguard Worker;   %b_addr.0 = select i1 %tmp2, i8 %tmp4, i8 %tmp3 ; <i8> [#uses=1]
84*9880d681SAndroid Build Coastguard Worker;   ret i8 %b_addr.0
85*9880d681SAndroid Build Coastguard Worker; }
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker; Codegen should hoist and CSE these constants.
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vv:
90*9880d681SAndroid Build Coastguard Worker; CHECK: LCPI3_0(%rip), %xmm0
91*9880d681SAndroid Build Coastguard Worker; CHECK: LCPI3_1(%rip), %xmm1
92*9880d681SAndroid Build Coastguard Worker; CHECK: LCPI3_2(%rip), %xmm2
93*9880d681SAndroid Build Coastguard Worker; CHECK: align
94*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: LCPI
95*9880d681SAndroid Build Coastguard Worker; CHECK: ret
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker@_minusZero.6007 = internal constant <4 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00> ; <<4 x float>*> [#uses=0]
98*9880d681SAndroid Build Coastguard Worker@twoTo23.6008 = internal constant <4 x float> <float 8.388608e+06, float 8.388608e+06, float 8.388608e+06, float 8.388608e+06> ; <<4 x float>*> [#uses=0]
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerdefine void @vv(float* %y, float* %x, i32* %n) nounwind ssp {
101*9880d681SAndroid Build Coastguard Workerentry:
102*9880d681SAndroid Build Coastguard Worker  br label %bb60
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Workerbb:                                               ; preds = %bb60
105*9880d681SAndroid Build Coastguard Worker  %i.0 = phi i32 [ 0, %bb60 ]                    ; <i32> [#uses=2]
106*9880d681SAndroid Build Coastguard Worker  %0 = bitcast float* %x_addr.0 to <4 x float>*   ; <<4 x float>*> [#uses=1]
107*9880d681SAndroid Build Coastguard Worker  %1 = load <4 x float>, <4 x float>* %0, align 16             ; <<4 x float>> [#uses=4]
108*9880d681SAndroid Build Coastguard Worker  %tmp20 = bitcast <4 x float> %1 to <4 x i32>    ; <<4 x i32>> [#uses=1]
109*9880d681SAndroid Build Coastguard Worker  %tmp22 = and <4 x i32> %tmp20, <i32 2147483647, i32 2147483647, i32 2147483647, i32 2147483647> ; <<4 x i32>> [#uses=1]
110*9880d681SAndroid Build Coastguard Worker  %tmp23 = bitcast <4 x i32> %tmp22 to <4 x float> ; <<4 x float>> [#uses=1]
111*9880d681SAndroid Build Coastguard Worker  %tmp25 = bitcast <4 x float> %1 to <4 x i32>    ; <<4 x i32>> [#uses=1]
112*9880d681SAndroid Build Coastguard Worker  %tmp27 = and <4 x i32> %tmp25, <i32 -2147483648, i32 -2147483648, i32 -2147483648, i32 -2147483648> ; <<4 x i32>> [#uses=2]
113*9880d681SAndroid Build Coastguard Worker  %tmp30 = call <4 x float> @llvm.x86.sse.cmp.ps(<4 x float> %tmp23, <4 x float> <float 8.388608e+06, float 8.388608e+06, float 8.388608e+06, float 8.388608e+06>, i8 5) ; <<4 x float>> [#uses=1]
114*9880d681SAndroid Build Coastguard Worker  %tmp34 = bitcast <4 x float> %tmp30 to <4 x i32> ; <<4 x i32>> [#uses=1]
115*9880d681SAndroid Build Coastguard Worker  %tmp36 = xor <4 x i32> %tmp34, <i32 -1, i32 -1, i32 -1, i32 -1> ; <<4 x i32>> [#uses=1]
116*9880d681SAndroid Build Coastguard Worker  %tmp37 = and <4 x i32> %tmp36, <i32 1258291200, i32 1258291200, i32 1258291200, i32 1258291200> ; <<4 x i32>> [#uses=1]
117*9880d681SAndroid Build Coastguard Worker  %tmp42 = or <4 x i32> %tmp37, %tmp27            ; <<4 x i32>> [#uses=1]
118*9880d681SAndroid Build Coastguard Worker  %tmp43 = bitcast <4 x i32> %tmp42 to <4 x float> ; <<4 x float>> [#uses=2]
119*9880d681SAndroid Build Coastguard Worker  %tmp45 = fadd <4 x float> %1, %tmp43            ; <<4 x float>> [#uses=1]
120*9880d681SAndroid Build Coastguard Worker  %tmp47 = fsub <4 x float> %tmp45, %tmp43        ; <<4 x float>> [#uses=2]
121*9880d681SAndroid Build Coastguard Worker  %tmp49 = call <4 x float> @llvm.x86.sse.cmp.ps(<4 x float> %1, <4 x float> %tmp47, i8 1) ; <<4 x float>> [#uses=1]
122*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <4 x float> %tmp49 to <4 x i32>    ; <<4 x i32>> [#uses=1]
123*9880d681SAndroid Build Coastguard Worker  %3 = call <4 x float> @llvm.x86.sse2.cvtdq2ps(<4 x i32> %2) nounwind readnone ; <<4 x float>> [#uses=1]
124*9880d681SAndroid Build Coastguard Worker  %tmp53 = fadd <4 x float> %tmp47, %3            ; <<4 x float>> [#uses=1]
125*9880d681SAndroid Build Coastguard Worker  %tmp55 = bitcast <4 x float> %tmp53 to <4 x i32> ; <<4 x i32>> [#uses=1]
126*9880d681SAndroid Build Coastguard Worker  %tmp57 = or <4 x i32> %tmp55, %tmp27            ; <<4 x i32>> [#uses=1]
127*9880d681SAndroid Build Coastguard Worker  %tmp58 = bitcast <4 x i32> %tmp57 to <4 x float> ; <<4 x float>> [#uses=1]
128*9880d681SAndroid Build Coastguard Worker  %4 = bitcast float* %y_addr.0 to <4 x float>*   ; <<4 x float>*> [#uses=1]
129*9880d681SAndroid Build Coastguard Worker  store <4 x float> %tmp58, <4 x float>* %4, align 16
130*9880d681SAndroid Build Coastguard Worker  %5 = getelementptr float, float* %x_addr.0, i64 4      ; <float*> [#uses=1]
131*9880d681SAndroid Build Coastguard Worker  %6 = getelementptr float, float* %y_addr.0, i64 4      ; <float*> [#uses=1]
132*9880d681SAndroid Build Coastguard Worker  %7 = add i32 %i.0, 4                            ; <i32> [#uses=1]
133*9880d681SAndroid Build Coastguard Worker  %8 = load i32, i32* %n, align 4                      ; <i32> [#uses=1]
134*9880d681SAndroid Build Coastguard Worker  %9 = icmp sgt i32 %8, %7                        ; <i1> [#uses=1]
135*9880d681SAndroid Build Coastguard Worker  br i1 %9, label %bb60, label %return
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Workerbb60:                                             ; preds = %bb, %entry
138*9880d681SAndroid Build Coastguard Worker  %x_addr.0 = phi float* [ %x, %entry ], [ %5, %bb ] ; <float*> [#uses=2]
139*9880d681SAndroid Build Coastguard Worker  %y_addr.0 = phi float* [ %y, %entry ], [ %6, %bb ] ; <float*> [#uses=2]
140*9880d681SAndroid Build Coastguard Worker  br label %bb
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %bb60
143*9880d681SAndroid Build Coastguard Worker  ret void
144*9880d681SAndroid Build Coastguard Worker}
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.x86.sse.cmp.ps(<4 x float>, <4 x float>, i8) nounwind readnone
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.x86.sse2.cvtdq2ps(<4 x i32>) nounwind readnone
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker; CodeGen should use the correct register class when extracting
151*9880d681SAndroid Build Coastguard Worker; a load from a zero-extending load for hoisting.
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: default_get_pch_validity:
154*9880d681SAndroid Build Coastguard Worker; CHECK: movl cl_options_count(%rip), %ecx
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker@cl_options_count = external constant i32         ; <i32*> [#uses=2]
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workerdefine void @default_get_pch_validity() nounwind {
159*9880d681SAndroid Build Coastguard Workerentry:
160*9880d681SAndroid Build Coastguard Worker  %tmp4 = load i32, i32* @cl_options_count, align 4    ; <i32> [#uses=1]
161*9880d681SAndroid Build Coastguard Worker  %tmp5 = icmp eq i32 %tmp4, 0                    ; <i1> [#uses=1]
162*9880d681SAndroid Build Coastguard Worker  br i1 %tmp5, label %bb6, label %bb2
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workerbb2:                                              ; preds = %bb2, %entry
165*9880d681SAndroid Build Coastguard Worker  %i.019 = phi i64 [ 0, %entry ], [ %tmp25, %bb2 ] ; <i64> [#uses=1]
166*9880d681SAndroid Build Coastguard Worker  %tmp25 = add i64 %i.019, 1                      ; <i64> [#uses=2]
167*9880d681SAndroid Build Coastguard Worker  %tmp11 = load i32, i32* @cl_options_count, align 4   ; <i32> [#uses=1]
168*9880d681SAndroid Build Coastguard Worker  %tmp12 = zext i32 %tmp11 to i64                 ; <i64> [#uses=1]
169*9880d681SAndroid Build Coastguard Worker  %tmp13 = icmp ugt i64 %tmp12, %tmp25            ; <i1> [#uses=1]
170*9880d681SAndroid Build Coastguard Worker  br i1 %tmp13, label %bb2, label %bb6
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workerbb6:                                              ; preds = %bb2, %entry
173*9880d681SAndroid Build Coastguard Worker  ret void
174*9880d681SAndroid Build Coastguard Worker}
175