xref: /llvm-project/llvm/test/CodeGen/X86/isel-phi.ll (revision c5abcb0521dd81bfd8b736c5d03177cc3a2d0fe3)
1*c5abcb05SEvgenii Kudriashov; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*c5abcb05SEvgenii Kudriashov; RUN: llc -mtriple=i686-linux-gnu -verify-machineinstrs < %s -o - | FileCheck %s --check-prefixes=X86
3*c5abcb05SEvgenii Kudriashov; RUN: llc -mtriple=i686-linux-gnu -fast-isel -fast-isel-abort=1 -verify-machineinstrs < %s -o - | FileCheck %s --check-prefixes=X86
4*c5abcb05SEvgenii Kudriashov; TODO: enable when x87 is supported
5*c5abcb05SEvgenii Kudriashov; llc -mtriple=i686-linux-gnu -global-isel -global-isel-abort=1 -verify-machineinstrs < %s -o - | FileCheck %s --check-prefixes=X86,GLOBAL-X86
6*c5abcb05SEvgenii Kudriashov; RUN: llc -mtriple=x86_64-linux-gnu -verify-machineinstrs < %s -o - | FileCheck %s --check-prefixes=X64,DAG-X64
7*c5abcb05SEvgenii Kudriashov; RUN: llc -mtriple=x86_64-linux-gnu -fast-isel -fast-isel-abort=1 -verify-machineinstrs < %s -o - | FileCheck %s --check-prefixes=X64,DAG-X64
8*c5abcb05SEvgenii Kudriashov; RUN: llc -mtriple=x86_64-linux-gnu -global-isel -global-isel-abort=1 -verify-machineinstrs < %s -o - | FileCheck %s --check-prefixes=X64,GLOBAL-X64
9*c5abcb05SEvgenii Kudriashov
10*c5abcb05SEvgenii Kudriashovdefine i1 @test_i1(i1 %a, i1 %b, i1 %c, i1 %pred0, i1 %pred1) {
11*c5abcb05SEvgenii Kudriashov; X86-LABEL: test_i1:
12*c5abcb05SEvgenii Kudriashov; X86:       # %bb.0: # %entry
13*c5abcb05SEvgenii Kudriashov; X86-NEXT:    testb $1, {{[0-9]+}}(%esp)
14*c5abcb05SEvgenii Kudriashov; X86-NEXT:    je .LBB0_1
15*c5abcb05SEvgenii Kudriashov; X86-NEXT:  # %bb.2: # %cond
16*c5abcb05SEvgenii Kudriashov; X86-NEXT:    testb $1, {{[0-9]+}}(%esp)
17*c5abcb05SEvgenii Kudriashov; X86-NEXT:    je .LBB0_4
18*c5abcb05SEvgenii Kudriashov; X86-NEXT:  # %bb.3:
19*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
20*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
21*c5abcb05SEvgenii Kudriashov; X86-NEXT:  .LBB0_1:
22*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
23*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
24*c5abcb05SEvgenii Kudriashov; X86-NEXT:  .LBB0_4: # %cond.false
25*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
26*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
27*c5abcb05SEvgenii Kudriashov;
28*c5abcb05SEvgenii Kudriashov; X64-LABEL: test_i1:
29*c5abcb05SEvgenii Kudriashov; X64:       # %bb.0: # %entry
30*c5abcb05SEvgenii Kudriashov; X64-NEXT:    testb $1, %cl
31*c5abcb05SEvgenii Kudriashov; X64-NEXT:    je .LBB0_1
32*c5abcb05SEvgenii Kudriashov; X64-NEXT:  # %bb.2: # %cond
33*c5abcb05SEvgenii Kudriashov; X64-NEXT:    movl %esi, %eax
34*c5abcb05SEvgenii Kudriashov; X64-NEXT:    testb $1, %r8b
35*c5abcb05SEvgenii Kudriashov; X64-NEXT:    jne .LBB0_4
36*c5abcb05SEvgenii Kudriashov; X64-NEXT:  # %bb.3: # %cond.false
37*c5abcb05SEvgenii Kudriashov; X64-NEXT:    movl %edx, %eax
38*c5abcb05SEvgenii Kudriashov; X64-NEXT:  .LBB0_4: # %cond.end
39*c5abcb05SEvgenii Kudriashov; X64-NEXT:    # kill: def $al killed $al killed $eax
40*c5abcb05SEvgenii Kudriashov; X64-NEXT:    retq
41*c5abcb05SEvgenii Kudriashov; X64-NEXT:  .LBB0_1:
42*c5abcb05SEvgenii Kudriashov; X64-NEXT:    movl %edi, %eax
43*c5abcb05SEvgenii Kudriashov; X64-NEXT:    # kill: def $al killed $al killed $eax
44*c5abcb05SEvgenii Kudriashov; X64-NEXT:    retq
45*c5abcb05SEvgenii Kudriashoventry:
46*c5abcb05SEvgenii Kudriashov  br i1 %pred0, label %cond, label %cond.end
47*c5abcb05SEvgenii Kudriashov
48*c5abcb05SEvgenii Kudriashovcond:
49*c5abcb05SEvgenii Kudriashov  br i1 %pred1, label %cond.true, label %cond.false
50*c5abcb05SEvgenii Kudriashov
51*c5abcb05SEvgenii Kudriashovcond.true:
52*c5abcb05SEvgenii Kudriashov  br label %cond.end
53*c5abcb05SEvgenii Kudriashov
54*c5abcb05SEvgenii Kudriashovcond.false:
55*c5abcb05SEvgenii Kudriashov  br label %cond.end
56*c5abcb05SEvgenii Kudriashov
57*c5abcb05SEvgenii Kudriashovcond.end:
58*c5abcb05SEvgenii Kudriashov  %res = phi i1 [ %a, %entry ], [ %b, %cond.true ], [ %c, %cond.false ]
59*c5abcb05SEvgenii Kudriashov  ret i1 %res
60*c5abcb05SEvgenii Kudriashov}
61*c5abcb05SEvgenii Kudriashov
62*c5abcb05SEvgenii Kudriashovdefine i8 @test_i8(i8 %f, i8 %t, i1 %pred) {
63*c5abcb05SEvgenii Kudriashov; X86-LABEL: test_i8:
64*c5abcb05SEvgenii Kudriashov; X86:       # %bb.0: # %entry
65*c5abcb05SEvgenii Kudriashov; X86-NEXT:    testb $1, {{[0-9]+}}(%esp)
66*c5abcb05SEvgenii Kudriashov; X86-NEXT:    je .LBB1_2
67*c5abcb05SEvgenii Kudriashov; X86-NEXT:  # %bb.1:
68*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
69*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
70*c5abcb05SEvgenii Kudriashov; X86-NEXT:  .LBB1_2: # %cond.false
71*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
72*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
73*c5abcb05SEvgenii Kudriashov;
74*c5abcb05SEvgenii Kudriashov; X64-LABEL: test_i8:
75*c5abcb05SEvgenii Kudriashov; X64:       # %bb.0: # %entry
76*c5abcb05SEvgenii Kudriashov; X64-NEXT:    testb $1, %dl
77*c5abcb05SEvgenii Kudriashov; X64-NEXT:    je .LBB1_2
78*c5abcb05SEvgenii Kudriashov; X64-NEXT:  # %bb.1:
79*c5abcb05SEvgenii Kudriashov; X64-NEXT:    movl %edi, %eax
80*c5abcb05SEvgenii Kudriashov; X64-NEXT:    # kill: def $al killed $al killed $eax
81*c5abcb05SEvgenii Kudriashov; X64-NEXT:    retq
82*c5abcb05SEvgenii Kudriashov; X64-NEXT:  .LBB1_2: # %cond.false
83*c5abcb05SEvgenii Kudriashov; X64-NEXT:    movl %esi, %eax
84*c5abcb05SEvgenii Kudriashov; X64-NEXT:    # kill: def $al killed $al killed $eax
85*c5abcb05SEvgenii Kudriashov; X64-NEXT:    retq
86*c5abcb05SEvgenii Kudriashoventry:
87*c5abcb05SEvgenii Kudriashov  br i1 %pred, label %cond.true, label %cond.false
88*c5abcb05SEvgenii Kudriashov
89*c5abcb05SEvgenii Kudriashovcond.true:                                        ; preds = %entry
90*c5abcb05SEvgenii Kudriashov  br label %cond.end
91*c5abcb05SEvgenii Kudriashov
92*c5abcb05SEvgenii Kudriashovcond.false:                                       ; preds = %entry
93*c5abcb05SEvgenii Kudriashov  br label %cond.end
94*c5abcb05SEvgenii Kudriashov
95*c5abcb05SEvgenii Kudriashovcond.end:                                         ; preds = %cond.false, %cond.true
96*c5abcb05SEvgenii Kudriashov  %cond = phi i8 [ %f, %cond.true ], [ %t, %cond.false ]
97*c5abcb05SEvgenii Kudriashov  ret i8 %cond
98*c5abcb05SEvgenii Kudriashov}
99*c5abcb05SEvgenii Kudriashov
100*c5abcb05SEvgenii Kudriashovdefine i16 @test_i16(i16 %f, i16 %t, i1 %pred) {
101*c5abcb05SEvgenii Kudriashov; X86-LABEL: test_i16:
102*c5abcb05SEvgenii Kudriashov; X86:       # %bb.0: # %entry
103*c5abcb05SEvgenii Kudriashov; X86-NEXT:    testb $1, {{[0-9]+}}(%esp)
104*c5abcb05SEvgenii Kudriashov; X86-NEXT:    je .LBB2_2
105*c5abcb05SEvgenii Kudriashov; X86-NEXT:  # %bb.1:
106*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
107*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
108*c5abcb05SEvgenii Kudriashov; X86-NEXT:  .LBB2_2: # %cond.false
109*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
110*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
111*c5abcb05SEvgenii Kudriashov;
112*c5abcb05SEvgenii Kudriashov; X64-LABEL: test_i16:
113*c5abcb05SEvgenii Kudriashov; X64:       # %bb.0: # %entry
114*c5abcb05SEvgenii Kudriashov; X64-NEXT:    testb $1, %dl
115*c5abcb05SEvgenii Kudriashov; X64-NEXT:    je .LBB2_2
116*c5abcb05SEvgenii Kudriashov; X64-NEXT:  # %bb.1:
117*c5abcb05SEvgenii Kudriashov; X64-NEXT:    movl %edi, %eax
118*c5abcb05SEvgenii Kudriashov; X64-NEXT:    # kill: def $ax killed $ax killed $eax
119*c5abcb05SEvgenii Kudriashov; X64-NEXT:    retq
120*c5abcb05SEvgenii Kudriashov; X64-NEXT:  .LBB2_2: # %cond.false
121*c5abcb05SEvgenii Kudriashov; X64-NEXT:    movl %esi, %eax
122*c5abcb05SEvgenii Kudriashov; X64-NEXT:    # kill: def $ax killed $ax killed $eax
123*c5abcb05SEvgenii Kudriashov; X64-NEXT:    retq
124*c5abcb05SEvgenii Kudriashoventry:
125*c5abcb05SEvgenii Kudriashov  br i1 %pred, label %cond.true, label %cond.false
126*c5abcb05SEvgenii Kudriashov
127*c5abcb05SEvgenii Kudriashovcond.true:                                        ; preds = %entry
128*c5abcb05SEvgenii Kudriashov  br label %cond.end
129*c5abcb05SEvgenii Kudriashov
130*c5abcb05SEvgenii Kudriashovcond.false:                                       ; preds = %entry
131*c5abcb05SEvgenii Kudriashov  br label %cond.end
132*c5abcb05SEvgenii Kudriashov
133*c5abcb05SEvgenii Kudriashovcond.end:                                         ; preds = %cond.false, %cond.true
134*c5abcb05SEvgenii Kudriashov  %cond = phi i16 [ %f, %cond.true ], [ %t, %cond.false ]
135*c5abcb05SEvgenii Kudriashov  ret i16 %cond
136*c5abcb05SEvgenii Kudriashov}
137*c5abcb05SEvgenii Kudriashov
138*c5abcb05SEvgenii Kudriashovdefine i32 @test_i32(i32 %f, i32 %t, i1 %pred) {
139*c5abcb05SEvgenii Kudriashov; X86-LABEL: test_i32:
140*c5abcb05SEvgenii Kudriashov; X86:       # %bb.0: # %entry
141*c5abcb05SEvgenii Kudriashov; X86-NEXT:    testb $1, {{[0-9]+}}(%esp)
142*c5abcb05SEvgenii Kudriashov; X86-NEXT:    je .LBB3_2
143*c5abcb05SEvgenii Kudriashov; X86-NEXT:  # %bb.1:
144*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
145*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
146*c5abcb05SEvgenii Kudriashov; X86-NEXT:  .LBB3_2: # %cond.false
147*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
148*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
149*c5abcb05SEvgenii Kudriashov;
150*c5abcb05SEvgenii Kudriashov; X64-LABEL: test_i32:
151*c5abcb05SEvgenii Kudriashov; X64:       # %bb.0: # %entry
152*c5abcb05SEvgenii Kudriashov; X64-NEXT:    movl %edi, %eax
153*c5abcb05SEvgenii Kudriashov; X64-NEXT:    testb $1, %dl
154*c5abcb05SEvgenii Kudriashov; X64-NEXT:    jne .LBB3_2
155*c5abcb05SEvgenii Kudriashov; X64-NEXT:  # %bb.1: # %cond.false
156*c5abcb05SEvgenii Kudriashov; X64-NEXT:    movl %esi, %eax
157*c5abcb05SEvgenii Kudriashov; X64-NEXT:  .LBB3_2: # %cond.end
158*c5abcb05SEvgenii Kudriashov; X64-NEXT:    retq
159*c5abcb05SEvgenii Kudriashoventry:
160*c5abcb05SEvgenii Kudriashov  br i1 %pred, label %cond.true, label %cond.false
161*c5abcb05SEvgenii Kudriashov
162*c5abcb05SEvgenii Kudriashovcond.true:                                        ; preds = %entry
163*c5abcb05SEvgenii Kudriashov  br label %cond.end
164*c5abcb05SEvgenii Kudriashov
165*c5abcb05SEvgenii Kudriashovcond.false:                                       ; preds = %entry
166*c5abcb05SEvgenii Kudriashov  br label %cond.end
167*c5abcb05SEvgenii Kudriashov
168*c5abcb05SEvgenii Kudriashovcond.end:                                         ; preds = %cond.false, %cond.true
169*c5abcb05SEvgenii Kudriashov  %cond = phi i32 [ %f, %cond.true ], [ %t, %cond.false ]
170*c5abcb05SEvgenii Kudriashov  ret i32 %cond
171*c5abcb05SEvgenii Kudriashov}
172*c5abcb05SEvgenii Kudriashov
173*c5abcb05SEvgenii Kudriashovdefine i64 @test_i64(i64 %f, i64 %t, i1 %pred) {
174*c5abcb05SEvgenii Kudriashov; X86-LABEL: test_i64:
175*c5abcb05SEvgenii Kudriashov; X86:       # %bb.0: # %entry
176*c5abcb05SEvgenii Kudriashov; X86-NEXT:    testb $1, {{[0-9]+}}(%esp)
177*c5abcb05SEvgenii Kudriashov; X86-NEXT:    je .LBB4_2
178*c5abcb05SEvgenii Kudriashov; X86-NEXT:  # %bb.1:
179*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
180*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
181*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
182*c5abcb05SEvgenii Kudriashov; X86-NEXT:  .LBB4_2: # %cond.false
183*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
184*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
185*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
186*c5abcb05SEvgenii Kudriashov;
187*c5abcb05SEvgenii Kudriashov; X64-LABEL: test_i64:
188*c5abcb05SEvgenii Kudriashov; X64:       # %bb.0: # %entry
189*c5abcb05SEvgenii Kudriashov; X64-NEXT:    movq %rdi, %rax
190*c5abcb05SEvgenii Kudriashov; X64-NEXT:    testb $1, %dl
191*c5abcb05SEvgenii Kudriashov; X64-NEXT:    jne .LBB4_2
192*c5abcb05SEvgenii Kudriashov; X64-NEXT:  # %bb.1: # %cond.false
193*c5abcb05SEvgenii Kudriashov; X64-NEXT:    movq %rsi, %rax
194*c5abcb05SEvgenii Kudriashov; X64-NEXT:  .LBB4_2: # %cond.end
195*c5abcb05SEvgenii Kudriashov; X64-NEXT:    retq
196*c5abcb05SEvgenii Kudriashoventry:
197*c5abcb05SEvgenii Kudriashov  br i1 %pred, label %cond.true, label %cond.false
198*c5abcb05SEvgenii Kudriashov
199*c5abcb05SEvgenii Kudriashovcond.true:                                        ; preds = %entry
200*c5abcb05SEvgenii Kudriashov  br label %cond.end
201*c5abcb05SEvgenii Kudriashov
202*c5abcb05SEvgenii Kudriashovcond.false:                                       ; preds = %entry
203*c5abcb05SEvgenii Kudriashov  br label %cond.end
204*c5abcb05SEvgenii Kudriashov
205*c5abcb05SEvgenii Kudriashovcond.end:                                         ; preds = %cond.false, %cond.true
206*c5abcb05SEvgenii Kudriashov  %cond = phi i64 [ %f, %cond.true ], [ %t, %cond.false ]
207*c5abcb05SEvgenii Kudriashov  ret i64 %cond
208*c5abcb05SEvgenii Kudriashov}
209*c5abcb05SEvgenii Kudriashov
210*c5abcb05SEvgenii Kudriashovdefine float @test_float(float %f, float %t, i1 %pred) {
211*c5abcb05SEvgenii Kudriashov; X86-LABEL: test_float:
212*c5abcb05SEvgenii Kudriashov; X86:       # %bb.0: # %entry
213*c5abcb05SEvgenii Kudriashov; X86-NEXT:    flds {{[0-9]+}}(%esp)
214*c5abcb05SEvgenii Kudriashov; X86-NEXT:    flds {{[0-9]+}}(%esp)
215*c5abcb05SEvgenii Kudriashov; X86-NEXT:    testb $1, {{[0-9]+}}(%esp)
216*c5abcb05SEvgenii Kudriashov; X86-NEXT:    jne .LBB5_2
217*c5abcb05SEvgenii Kudriashov; X86-NEXT:  # %bb.1: # %cond.false
218*c5abcb05SEvgenii Kudriashov; X86-NEXT:    fstp %st(0)
219*c5abcb05SEvgenii Kudriashov; X86-NEXT:    fldz
220*c5abcb05SEvgenii Kudriashov; X86-NEXT:    fxch %st(1)
221*c5abcb05SEvgenii Kudriashov; X86-NEXT:  .LBB5_2: # %cond.end
222*c5abcb05SEvgenii Kudriashov; X86-NEXT:    fstp %st(1)
223*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
224*c5abcb05SEvgenii Kudriashov;
225*c5abcb05SEvgenii Kudriashov; X64-LABEL: test_float:
226*c5abcb05SEvgenii Kudriashov; X64:       # %bb.0: # %entry
227*c5abcb05SEvgenii Kudriashov; X64-NEXT:    testb $1, %dil
228*c5abcb05SEvgenii Kudriashov; X64-NEXT:    jne .LBB5_2
229*c5abcb05SEvgenii Kudriashov; X64-NEXT:  # %bb.1: # %cond.false
230*c5abcb05SEvgenii Kudriashov; X64-NEXT:    movaps %xmm1, %xmm0
231*c5abcb05SEvgenii Kudriashov; X64-NEXT:  .LBB5_2: # %cond.end
232*c5abcb05SEvgenii Kudriashov; X64-NEXT:    retq
233*c5abcb05SEvgenii Kudriashoventry:
234*c5abcb05SEvgenii Kudriashov  br i1 %pred, label %cond.true, label %cond.false
235*c5abcb05SEvgenii Kudriashov
236*c5abcb05SEvgenii Kudriashovcond.true:                                        ; preds = %entry
237*c5abcb05SEvgenii Kudriashov  br label %cond.end
238*c5abcb05SEvgenii Kudriashov
239*c5abcb05SEvgenii Kudriashovcond.false:                                       ; preds = %entry
240*c5abcb05SEvgenii Kudriashov  br label %cond.end
241*c5abcb05SEvgenii Kudriashov
242*c5abcb05SEvgenii Kudriashovcond.end:                                         ; preds = %cond.false, %cond.true
243*c5abcb05SEvgenii Kudriashov  %cond = phi float [ %f, %cond.true ], [ %t, %cond.false ]
244*c5abcb05SEvgenii Kudriashov  ret float %cond
245*c5abcb05SEvgenii Kudriashov}
246*c5abcb05SEvgenii Kudriashov
247*c5abcb05SEvgenii Kudriashovdefine double @test_double(i32 %a, double %f, double %t, i1 %pred) {
248*c5abcb05SEvgenii Kudriashov; X86-LABEL: test_double:
249*c5abcb05SEvgenii Kudriashov; X86:       # %bb.0: # %entry
250*c5abcb05SEvgenii Kudriashov; X86-NEXT:    fldl {{[0-9]+}}(%esp)
251*c5abcb05SEvgenii Kudriashov; X86-NEXT:    fldl {{[0-9]+}}(%esp)
252*c5abcb05SEvgenii Kudriashov; X86-NEXT:    testb $1, {{[0-9]+}}(%esp)
253*c5abcb05SEvgenii Kudriashov; X86-NEXT:    jne .LBB6_2
254*c5abcb05SEvgenii Kudriashov; X86-NEXT:  # %bb.1: # %cond.false
255*c5abcb05SEvgenii Kudriashov; X86-NEXT:    fstp %st(0)
256*c5abcb05SEvgenii Kudriashov; X86-NEXT:    fldz
257*c5abcb05SEvgenii Kudriashov; X86-NEXT:    fxch %st(1)
258*c5abcb05SEvgenii Kudriashov; X86-NEXT:  .LBB6_2: # %cond.end
259*c5abcb05SEvgenii Kudriashov; X86-NEXT:    fstp %st(1)
260*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
261*c5abcb05SEvgenii Kudriashov;
262*c5abcb05SEvgenii Kudriashov; X64-LABEL: test_double:
263*c5abcb05SEvgenii Kudriashov; X64:       # %bb.0: # %entry
264*c5abcb05SEvgenii Kudriashov; X64-NEXT:    testb $1, %sil
265*c5abcb05SEvgenii Kudriashov; X64-NEXT:    jne .LBB6_2
266*c5abcb05SEvgenii Kudriashov; X64-NEXT:  # %bb.1: # %cond.false
267*c5abcb05SEvgenii Kudriashov; X64-NEXT:    movaps %xmm1, %xmm0
268*c5abcb05SEvgenii Kudriashov; X64-NEXT:  .LBB6_2: # %cond.end
269*c5abcb05SEvgenii Kudriashov; X64-NEXT:    retq
270*c5abcb05SEvgenii Kudriashoventry:
271*c5abcb05SEvgenii Kudriashov  br i1 %pred, label %cond.true, label %cond.false
272*c5abcb05SEvgenii Kudriashov
273*c5abcb05SEvgenii Kudriashovcond.true:                                        ; preds = %entry
274*c5abcb05SEvgenii Kudriashov  br label %cond.end
275*c5abcb05SEvgenii Kudriashov
276*c5abcb05SEvgenii Kudriashovcond.false:                                       ; preds = %entry
277*c5abcb05SEvgenii Kudriashov  br label %cond.end
278*c5abcb05SEvgenii Kudriashov
279*c5abcb05SEvgenii Kudriashovcond.end:                                         ; preds = %cond.false, %cond.true
280*c5abcb05SEvgenii Kudriashov  %cond = phi double [ %f, %cond.true ], [ %t, %cond.false ]
281*c5abcb05SEvgenii Kudriashov  ret double %cond
282*c5abcb05SEvgenii Kudriashov}
283*c5abcb05SEvgenii Kudriashov
284*c5abcb05SEvgenii Kudriashovdefine ptr @test_ptr(ptr %a, ptr %b, ptr %c, ptr %d, ptr %e, ptr %f, ptr %g, i1 %pred0, i1 %pred1, i1 %pred2) {
285*c5abcb05SEvgenii Kudriashov; X86-LABEL: test_ptr:
286*c5abcb05SEvgenii Kudriashov; X86:       # %bb.0: # %entry
287*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
288*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
289*c5abcb05SEvgenii Kudriashov; X86-NEXT:    testb $1, {{[0-9]+}}(%esp)
290*c5abcb05SEvgenii Kudriashov; X86-NEXT:    je .LBB7_6
291*c5abcb05SEvgenii Kudriashov; X86-NEXT:  # %bb.1: # %cond.true
292*c5abcb05SEvgenii Kudriashov; X86-NEXT:    testb $1, %cl
293*c5abcb05SEvgenii Kudriashov; X86-NEXT:    je .LBB7_3
294*c5abcb05SEvgenii Kudriashov; X86-NEXT:  # %bb.2:
295*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
296*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
297*c5abcb05SEvgenii Kudriashov; X86-NEXT:  .LBB7_6: # %cond.false
298*c5abcb05SEvgenii Kudriashov; X86-NEXT:    testb $1, %cl
299*c5abcb05SEvgenii Kudriashov; X86-NEXT:    je .LBB7_10
300*c5abcb05SEvgenii Kudriashov; X86-NEXT:  # %bb.7: # %cond.false.true
301*c5abcb05SEvgenii Kudriashov; X86-NEXT:    testb $1, %al
302*c5abcb05SEvgenii Kudriashov; X86-NEXT:    je .LBB7_9
303*c5abcb05SEvgenii Kudriashov; X86-NEXT:  # %bb.8:
304*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
305*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
306*c5abcb05SEvgenii Kudriashov; X86-NEXT:  .LBB7_3: # %cond.true.false
307*c5abcb05SEvgenii Kudriashov; X86-NEXT:    testb $1, %al
308*c5abcb05SEvgenii Kudriashov; X86-NEXT:    je .LBB7_5
309*c5abcb05SEvgenii Kudriashov; X86-NEXT:  # %bb.4:
310*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
311*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
312*c5abcb05SEvgenii Kudriashov; X86-NEXT:  .LBB7_10: # %cond.false.false
313*c5abcb05SEvgenii Kudriashov; X86-NEXT:    testb $1, %al
314*c5abcb05SEvgenii Kudriashov; X86-NEXT:    je .LBB7_12
315*c5abcb05SEvgenii Kudriashov; X86-NEXT:  # %bb.11:
316*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
317*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
318*c5abcb05SEvgenii Kudriashov; X86-NEXT:  .LBB7_9: # %cond.false.true.false
319*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
320*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
321*c5abcb05SEvgenii Kudriashov; X86-NEXT:  .LBB7_5: # %cond.true.false.false
322*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
323*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
324*c5abcb05SEvgenii Kudriashov; X86-NEXT:  .LBB7_12: # %cond.false.false.false
325*c5abcb05SEvgenii Kudriashov; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
326*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
327*c5abcb05SEvgenii Kudriashov;
328*c5abcb05SEvgenii Kudriashov; DAG-X64-LABEL: test_ptr:
329*c5abcb05SEvgenii Kudriashov; DAG-X64:       # %bb.0: # %entry
330*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    movq %rdi, %rax
331*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %edi
332*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    movzbl {{[0-9]+}}(%rsp), %r10d
333*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    testb $1, {{[0-9]+}}(%rsp)
334*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    je .LBB7_4
335*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:  # %bb.1: # %cond.true
336*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    testb $1, %r10b
337*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    jne .LBB7_9
338*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:  # %bb.2: # %cond.true.false
339*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    testb $1, %dil
340*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    movq %rsi, %rax
341*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    jne .LBB7_9
342*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:  # %bb.3: # %cond.true.false.false
343*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    movq %rdx, %rax
344*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    retq
345*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:  .LBB7_4: # %cond.false
346*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    testb $1, %r10b
347*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    je .LBB7_7
348*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:  # %bb.5: # %cond.false.true
349*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    testb $1, %dil
350*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    movq %rcx, %rax
351*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    jne .LBB7_9
352*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:  # %bb.6: # %cond.false.true.false
353*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    movq %r8, %rax
354*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    retq
355*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:  .LBB7_7: # %cond.false.false
356*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    testb $1, %dil
357*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    movq %r9, %rax
358*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    jne .LBB7_9
359*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:  # %bb.8: # %cond.false.false.false
360*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    movq {{[0-9]+}}(%rsp), %rax
361*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:  .LBB7_9: # %cond.end
362*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    retq
363*c5abcb05SEvgenii Kudriashov;
364*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-LABEL: test_ptr:
365*c5abcb05SEvgenii Kudriashov; GLOBAL-X64:       # %bb.0: # %entry
366*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    movq %rdi, %rax
367*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    movl {{[0-9]+}}(%rsp), %r11d
368*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    movl {{[0-9]+}}(%rsp), %r10d
369*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    movl {{[0-9]+}}(%rsp), %edi
370*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    testb $1, %r11b
371*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    je .LBB7_4
372*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:  # %bb.1: # %cond.true
373*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    testb $1, %r10b
374*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    jne .LBB7_9
375*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:  # %bb.2: # %cond.true.false
376*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    testb $1, %dil
377*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    movq %rsi, %rax
378*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    jne .LBB7_9
379*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:  # %bb.3: # %cond.true.false.false
380*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    movq %rdx, %rax
381*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    retq
382*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:  .LBB7_4: # %cond.false
383*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    testb $1, %r10b
384*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    je .LBB7_7
385*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:  # %bb.5: # %cond.false.true
386*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    testb $1, %dil
387*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    movq %rcx, %rax
388*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    jne .LBB7_9
389*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:  # %bb.6: # %cond.false.true.false
390*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    movq %r8, %rax
391*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    retq
392*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:  .LBB7_7: # %cond.false.false
393*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    testb $1, %dil
394*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    movq %r9, %rax
395*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    jne .LBB7_9
396*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:  # %bb.8: # %cond.false.false.false
397*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    movq {{[0-9]+}}(%rsp), %rax
398*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:  .LBB7_9: # %cond.end
399*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    retq
400*c5abcb05SEvgenii Kudriashoventry:
401*c5abcb05SEvgenii Kudriashov  br i1 %pred0, label %cond.true, label %cond.false
402*c5abcb05SEvgenii Kudriashov
403*c5abcb05SEvgenii Kudriashovcond.true:
404*c5abcb05SEvgenii Kudriashov  br i1 %pred1, label %cond.end, label %cond.true.false
405*c5abcb05SEvgenii Kudriashov
406*c5abcb05SEvgenii Kudriashovcond.true.false:
407*c5abcb05SEvgenii Kudriashov  br i1 %pred2, label %cond.true.false.true, label %cond.true.false.false
408*c5abcb05SEvgenii Kudriashov
409*c5abcb05SEvgenii Kudriashovcond.true.false.true:
410*c5abcb05SEvgenii Kudriashov  br label %cond.end
411*c5abcb05SEvgenii Kudriashov
412*c5abcb05SEvgenii Kudriashovcond.true.false.false:
413*c5abcb05SEvgenii Kudriashov  br label %cond.end
414*c5abcb05SEvgenii Kudriashov
415*c5abcb05SEvgenii Kudriashovcond.false:
416*c5abcb05SEvgenii Kudriashov  br i1 %pred1, label %cond.false.true, label %cond.false.false
417*c5abcb05SEvgenii Kudriashov
418*c5abcb05SEvgenii Kudriashovcond.false.true:
419*c5abcb05SEvgenii Kudriashov  br i1 %pred2, label %cond.false.true.true, label %cond.false.true.false
420*c5abcb05SEvgenii Kudriashov
421*c5abcb05SEvgenii Kudriashovcond.false.true.true:
422*c5abcb05SEvgenii Kudriashov  br label %cond.end
423*c5abcb05SEvgenii Kudriashov
424*c5abcb05SEvgenii Kudriashovcond.false.true.false:
425*c5abcb05SEvgenii Kudriashov  br label %cond.end
426*c5abcb05SEvgenii Kudriashov
427*c5abcb05SEvgenii Kudriashovcond.false.false:
428*c5abcb05SEvgenii Kudriashov  br i1 %pred2, label %cond.false.false.true, label %cond.false.false.false
429*c5abcb05SEvgenii Kudriashov
430*c5abcb05SEvgenii Kudriashovcond.false.false.true:
431*c5abcb05SEvgenii Kudriashov  br label %cond.end
432*c5abcb05SEvgenii Kudriashov
433*c5abcb05SEvgenii Kudriashovcond.false.false.false:
434*c5abcb05SEvgenii Kudriashov  br label %cond.end
435*c5abcb05SEvgenii Kudriashov
436*c5abcb05SEvgenii Kudriashovcond.end:
437*c5abcb05SEvgenii Kudriashov  %res = phi ptr [ %a, %cond.true ], [ %b, %cond.true.false.true ], [ %c, %cond.true.false.false ], [ %d, %cond.false.true.true ], [ %e, %cond.false.true.false ], [ %f, %cond.false.false.true ], [ %g, %cond.false.false.false ]
438*c5abcb05SEvgenii Kudriashov  ret ptr %res
439*c5abcb05SEvgenii Kudriashov}
440*c5abcb05SEvgenii Kudriashov
441*c5abcb05SEvgenii Kudriashovdefine x86_fp80 @test_fp80(x86_fp80 %f, x86_fp80 %t, i1 %pred) {
442*c5abcb05SEvgenii Kudriashov; X86-LABEL: test_fp80:
443*c5abcb05SEvgenii Kudriashov; X86:       # %bb.0: # %entry
444*c5abcb05SEvgenii Kudriashov; X86-NEXT:    fldt {{[0-9]+}}(%esp)
445*c5abcb05SEvgenii Kudriashov; X86-NEXT:    fldt {{[0-9]+}}(%esp)
446*c5abcb05SEvgenii Kudriashov; X86-NEXT:    testb $1, {{[0-9]+}}(%esp)
447*c5abcb05SEvgenii Kudriashov; X86-NEXT:    jne .LBB8_2
448*c5abcb05SEvgenii Kudriashov; X86-NEXT:  # %bb.1: # %cond.false
449*c5abcb05SEvgenii Kudriashov; X86-NEXT:    fstp %st(0)
450*c5abcb05SEvgenii Kudriashov; X86-NEXT:    fldz
451*c5abcb05SEvgenii Kudriashov; X86-NEXT:    fxch %st(1)
452*c5abcb05SEvgenii Kudriashov; X86-NEXT:  .LBB8_2: # %cond.end
453*c5abcb05SEvgenii Kudriashov; X86-NEXT:    fstp %st(1)
454*c5abcb05SEvgenii Kudriashov; X86-NEXT:    retl
455*c5abcb05SEvgenii Kudriashov;
456*c5abcb05SEvgenii Kudriashov; DAG-X64-LABEL: test_fp80:
457*c5abcb05SEvgenii Kudriashov; DAG-X64:       # %bb.0: # %entry
458*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    fldt {{[0-9]+}}(%rsp)
459*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    fldt {{[0-9]+}}(%rsp)
460*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    testb $1, %dil
461*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    jne .LBB8_2
462*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:  # %bb.1: # %cond.false
463*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    fstp %st(0)
464*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    fldz
465*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    fxch %st(1)
466*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:  .LBB8_2: # %cond.end
467*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    fstp %st(1)
468*c5abcb05SEvgenii Kudriashov; DAG-X64-NEXT:    retq
469*c5abcb05SEvgenii Kudriashov;
470*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-LABEL: test_fp80:
471*c5abcb05SEvgenii Kudriashov; GLOBAL-X64:       # %bb.0: # %entry
472*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    fldt {{[0-9]+}}(%rsp)
473*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    fldt {{[0-9]+}}(%rsp)
474*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    testb $1, %dil
475*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    jne .LBB8_2
476*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:  # %bb.1: # %cond.false
477*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    fstp %st(1)
478*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    fldz
479*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:  .LBB8_2: # %cond.end
480*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    fstp %st(0)
481*c5abcb05SEvgenii Kudriashov; GLOBAL-X64-NEXT:    retq
482*c5abcb05SEvgenii Kudriashoventry:
483*c5abcb05SEvgenii Kudriashov  br i1 %pred, label %cond.true, label %cond.false
484*c5abcb05SEvgenii Kudriashov
485*c5abcb05SEvgenii Kudriashovcond.true:                                        ; preds = %entry
486*c5abcb05SEvgenii Kudriashov  br label %cond.end
487*c5abcb05SEvgenii Kudriashov
488*c5abcb05SEvgenii Kudriashovcond.false:                                       ; preds = %entry
489*c5abcb05SEvgenii Kudriashov  br label %cond.end
490*c5abcb05SEvgenii Kudriashov
491*c5abcb05SEvgenii Kudriashovcond.end:                                         ; preds = %cond.false, %cond.true
492*c5abcb05SEvgenii Kudriashov  %cond = phi x86_fp80 [ %f, %cond.true ], [ %t, %cond.false ]
493*c5abcb05SEvgenii Kudriashov  ret x86_fp80 %cond
494*c5abcb05SEvgenii Kudriashov}
495