xref: /llvm-project/llvm/test/CodeGen/RISCV/machine-combiner.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1bd6bf349SAnton Sidorenko; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2af5dd270SHsiangkai Wang; RUN: llc -mtriple=riscv64 -mattr=+d,+zbb,+zfh -verify-machineinstrs -mcpu=sifive-u74 \
32693efa8SAnton Sidorenko; RUN: -O1 -riscv-enable-machine-combiner=true -riscv-force-machine-combiner-strategy=local < %s | \
42693efa8SAnton Sidorenko; RUN: FileCheck %s --check-prefixes=CHECK,CHECK_LOCAL
52693efa8SAnton Sidorenko
62693efa8SAnton Sidorenko; RUN: llc -mtriple=riscv64 -mattr=+d,+zbb,+zfh -verify-machineinstrs -mcpu=sifive-u74 \
72693efa8SAnton Sidorenko; RUN: -O1 -riscv-enable-machine-combiner=true -riscv-force-machine-combiner-strategy=min-instr < %s | \
82693efa8SAnton Sidorenko; RUN: FileCheck %s --check-prefixes=CHECK,CHECK_GLOBAL
9bd6bf349SAnton Sidorenko
10bd6bf349SAnton Sidorenkodefine double @test_reassoc_fadd1(double %a0, double %a1, double %a2, double %a3) {
11bd6bf349SAnton Sidorenko; CHECK-LABEL: test_reassoc_fadd1:
12bd6bf349SAnton Sidorenko; CHECK:       # %bb.0:
13*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa5, fa2, fa3
14*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa0, fa1
15*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa0, fa4, fa5
16bd6bf349SAnton Sidorenko; CHECK-NEXT:    ret
17bd6bf349SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
18bd6bf349SAnton Sidorenko  %t1 = fadd nsz reassoc double %t0, %a2
19bd6bf349SAnton Sidorenko  %t2 = fadd nsz reassoc double %t1, %a3
20bd6bf349SAnton Sidorenko  ret double %t2
21bd6bf349SAnton Sidorenko}
22bd6bf349SAnton Sidorenko
23bd6bf349SAnton Sidorenkodefine double @test_reassoc_fadd2(double %a0, double %a1, double %a2, double %a3) {
24bd6bf349SAnton Sidorenko; CHECK-LABEL: test_reassoc_fadd2:
25bd6bf349SAnton Sidorenko; CHECK:       # %bb.0:
26*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa5, fa2, fa3
27*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa0, fa1
28*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa0, fa5, fa4
29bd6bf349SAnton Sidorenko; CHECK-NEXT:    ret
30bd6bf349SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
31bd6bf349SAnton Sidorenko  %t1 = fadd nsz reassoc double %a2, %t0
32bd6bf349SAnton Sidorenko  %t2 = fadd nsz reassoc double %t1, %a3
33bd6bf349SAnton Sidorenko  ret double %t2
34bd6bf349SAnton Sidorenko}
35bd6bf349SAnton Sidorenko
36bd6bf349SAnton Sidorenkodefine double @test_reassoc_fadd3(double %a0, double %a1, double %a2, double %a3) {
37bd6bf349SAnton Sidorenko; CHECK-LABEL: test_reassoc_fadd3:
38bd6bf349SAnton Sidorenko; CHECK:       # %bb.0:
39*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa5, fa3, fa2
40*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa0, fa1
41*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa0, fa5, fa4
42bd6bf349SAnton Sidorenko; CHECK-NEXT:    ret
43bd6bf349SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
44bd6bf349SAnton Sidorenko  %t1 = fadd nsz reassoc double %t0, %a2
45bd6bf349SAnton Sidorenko  %t2 = fadd nsz reassoc double %a3, %t1
46bd6bf349SAnton Sidorenko  ret double %t2
47bd6bf349SAnton Sidorenko}
48bd6bf349SAnton Sidorenko
49bd6bf349SAnton Sidorenkodefine double @test_reassoc_fadd4(double %a0, double %a1, double %a2, double %a3) {
50bd6bf349SAnton Sidorenko; CHECK-LABEL: test_reassoc_fadd4:
51bd6bf349SAnton Sidorenko; CHECK:       # %bb.0:
52*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa5, fa3, fa2
53*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa0, fa1
54*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa0, fa5, fa4
55bd6bf349SAnton Sidorenko; CHECK-NEXT:    ret
56bd6bf349SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
57bd6bf349SAnton Sidorenko  %t1 = fadd nsz reassoc double %a2, %t0
58bd6bf349SAnton Sidorenko  %t2 = fadd nsz reassoc double %a3, %t1
59bd6bf349SAnton Sidorenko  ret double %t2
60bd6bf349SAnton Sidorenko}
61bd6bf349SAnton Sidorenko
62bd6bf349SAnton Sidorenkodefine double @test_reassoc_fmul1(double %a0, double %a1, double %a2, double %a3) {
63bd6bf349SAnton Sidorenko; CHECK-LABEL: test_reassoc_fmul1:
64bd6bf349SAnton Sidorenko; CHECK:       # %bb.0:
65*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa5, fa2, fa3
66*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa4, fa0, fa1
67*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa0, fa4, fa5
68bd6bf349SAnton Sidorenko; CHECK-NEXT:    ret
69bd6bf349SAnton Sidorenko  %t0 = fmul nsz reassoc double %a0, %a1
70bd6bf349SAnton Sidorenko  %t1 = fmul nsz reassoc double %t0, %a2
71bd6bf349SAnton Sidorenko  %t2 = fmul nsz reassoc double %t1, %a3
72bd6bf349SAnton Sidorenko  ret double %t2
73bd6bf349SAnton Sidorenko}
74bd6bf349SAnton Sidorenko
75bd6bf349SAnton Sidorenkodefine double @test_reassoc_fmul2(double %a0, double %a1, double %a2, double %a3) {
76bd6bf349SAnton Sidorenko; CHECK-LABEL: test_reassoc_fmul2:
77bd6bf349SAnton Sidorenko; CHECK:       # %bb.0:
78*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa5, fa2, fa3
79*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa4, fa0, fa1
80*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa0, fa5, fa4
81bd6bf349SAnton Sidorenko; CHECK-NEXT:    ret
82bd6bf349SAnton Sidorenko  %t0 = fmul nsz reassoc double %a0, %a1
83bd6bf349SAnton Sidorenko  %t1 = fmul nsz reassoc double %a2, %t0
84bd6bf349SAnton Sidorenko  %t2 = fmul nsz reassoc double %t1, %a3
85bd6bf349SAnton Sidorenko  ret double %t2
86bd6bf349SAnton Sidorenko}
87bd6bf349SAnton Sidorenko
88bd6bf349SAnton Sidorenkodefine double @test_reassoc_fmul3(double %a0, double %a1, double %a2, double %a3) {
89bd6bf349SAnton Sidorenko; CHECK-LABEL: test_reassoc_fmul3:
90bd6bf349SAnton Sidorenko; CHECK:       # %bb.0:
91*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa5, fa3, fa2
92*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa4, fa0, fa1
93*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa0, fa5, fa4
94bd6bf349SAnton Sidorenko; CHECK-NEXT:    ret
95bd6bf349SAnton Sidorenko  %t0 = fmul nsz reassoc double %a0, %a1
96bd6bf349SAnton Sidorenko  %t1 = fmul nsz reassoc double %t0, %a2
97bd6bf349SAnton Sidorenko  %t2 = fmul nsz reassoc double %a3, %t1
98bd6bf349SAnton Sidorenko  ret double %t2
99bd6bf349SAnton Sidorenko}
100bd6bf349SAnton Sidorenko
101bd6bf349SAnton Sidorenkodefine double @test_reassoc_fmul4(double %a0, double %a1, double %a2, double %a3) {
102bd6bf349SAnton Sidorenko; CHECK-LABEL: test_reassoc_fmul4:
103bd6bf349SAnton Sidorenko; CHECK:       # %bb.0:
104*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa5, fa3, fa2
105*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa4, fa0, fa1
106*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa0, fa5, fa4
107bd6bf349SAnton Sidorenko; CHECK-NEXT:    ret
108bd6bf349SAnton Sidorenko  %t0 = fmul nsz reassoc double %a0, %a1
109bd6bf349SAnton Sidorenko  %t1 = fmul nsz reassoc double %a2, %t0
110bd6bf349SAnton Sidorenko  %t2 = fmul nsz reassoc double %a3, %t1
111bd6bf349SAnton Sidorenko  ret double %t2
112bd6bf349SAnton Sidorenko}
113bd6bf349SAnton Sidorenko
114bd6bf349SAnton Sidorenkodefine double @test_reassoc_big1(double %a0, double %a1, double %a2, double %a3, double %a4, double %a5, double %a6) {
115bd6bf349SAnton Sidorenko; CHECK-LABEL: test_reassoc_big1:
116bd6bf349SAnton Sidorenko; CHECK:       # %bb.0:
1177b0c4184SCraig Topper; CHECK-NEXT:    fadd.d fa5, fa4, fa5
118*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa2, fa3
119*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa3, fa0, fa1
1207b0c4184SCraig Topper; CHECK-NEXT:    fadd.d fa5, fa5, fa6
121*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa3, fa4
1227b0c4184SCraig Topper; CHECK-NEXT:    fadd.d fa0, fa4, fa5
123bd6bf349SAnton Sidorenko; CHECK-NEXT:    ret
124bd6bf349SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
125bd6bf349SAnton Sidorenko  %t1 = fadd nsz reassoc double %t0, %a2
126bd6bf349SAnton Sidorenko  %t2 = fadd nsz reassoc double %t1, %a3
127bd6bf349SAnton Sidorenko  %t3 = fadd nsz reassoc double %t2, %a4
128bd6bf349SAnton Sidorenko  %t4 = fadd nsz reassoc double %t3, %a5
129bd6bf349SAnton Sidorenko  %t5 = fadd nsz reassoc double %t4, %a6
130bd6bf349SAnton Sidorenko  ret double %t5
131bd6bf349SAnton Sidorenko}
132bd6bf349SAnton Sidorenko
133bd6bf349SAnton Sidorenkodefine double @test_reassoc_big2(double %a0, double %a1, i32 %a2, double %a3, i32 %a4, double %a5) {
134bd6bf349SAnton Sidorenko; CHECK-LABEL: test_reassoc_big2:
135bd6bf349SAnton Sidorenko; CHECK:       # %bb.0:
1367b0c4184SCraig Topper; CHECK-NEXT:    fsub.d fa4, fa3, fa2
137*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa3, fa0, fa1
138*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d ft0, fa2, fa1
139*9122c523SPengcheng Wang; CHECK-NEXT:    fcvt.d.w fa5, a1
140*9122c523SPengcheng Wang; CHECK-NEXT:    fcvt.d.w ft1, a0
141*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa5, fa5, fa1
142*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa2, fa2, ft1
143*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa4, fa4, fa3
144*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa3, fa0, ft0
145*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa5, fa5, fa2
146*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa4, fa4, fa3
147*9122c523SPengcheng Wang; CHECK-NEXT:    fmul.d fa0, fa4, fa5
148bd6bf349SAnton Sidorenko; CHECK-NEXT:    ret
149bd6bf349SAnton Sidorenko  %cvt1 = sitofp i32 %a2 to double
150bd6bf349SAnton Sidorenko  %cvt2 = sitofp i32 %a4 to double
151bd6bf349SAnton Sidorenko  %t5 = fmul nsz reassoc double %a3, %cvt1
152bd6bf349SAnton Sidorenko  %t9 = fmul nsz reassoc double %cvt2, %t5
153bd6bf349SAnton Sidorenko  %t4 = fmul nsz reassoc double %t9, %a1
154bd6bf349SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
155bd6bf349SAnton Sidorenko  %t1 = fadd nsz reassoc double %a3, %t0
156bd6bf349SAnton Sidorenko  %t3 = fadd nsz reassoc double %a3, %a1
157bd6bf349SAnton Sidorenko  %t6 = fmul nsz reassoc double %t4, %a0
158bd6bf349SAnton Sidorenko  %t2 = fsub nsz reassoc double %a5, %t1
159bd6bf349SAnton Sidorenko  %t7 = fmul nsz reassoc double %t6, %t3
160bd6bf349SAnton Sidorenko  %t8 = fmul nsz reassoc double %t2, %t7
161bd6bf349SAnton Sidorenko  ret double %t8
162bd6bf349SAnton Sidorenko}
163bd6bf349SAnton Sidorenko
1641978b4d9SAnton Sidorenko; Negative test
165bd6bf349SAnton Sidorenkodefine double @test_reassoc_fadd_flags_1(double %a0, double %a1, double %a2, double %a3) {
166bd6bf349SAnton Sidorenko; CHECK-LABEL: test_reassoc_fadd_flags_1:
167bd6bf349SAnton Sidorenko; CHECK:       # %bb.0:
1687b0c4184SCraig Topper; CHECK-NEXT:    fadd.d fa5, fa0, fa1
1697b0c4184SCraig Topper; CHECK-NEXT:    fadd.d fa5, fa5, fa2
1707b0c4184SCraig Topper; CHECK-NEXT:    fadd.d fa0, fa5, fa3
171bd6bf349SAnton Sidorenko; CHECK-NEXT:    ret
172bd6bf349SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
173bd6bf349SAnton Sidorenko  %t1 = fadd double %t0, %a2
174bd6bf349SAnton Sidorenko  %t2 = fadd nsz reassoc double %t1, %a3
175bd6bf349SAnton Sidorenko  ret double %t2
176bd6bf349SAnton Sidorenko}
177bd6bf349SAnton Sidorenko
1781978b4d9SAnton Sidorenko; Negative test
179bd6bf349SAnton Sidorenkodefine double @test_reassoc_fadd_flags_2(double %a0, double %a1, double %a2, double %a3) {
180bd6bf349SAnton Sidorenko; CHECK-LABEL: test_reassoc_fadd_flags_2:
181bd6bf349SAnton Sidorenko; CHECK:       # %bb.0:
1827b0c4184SCraig Topper; CHECK-NEXT:    fadd.d fa5, fa0, fa1
1837b0c4184SCraig Topper; CHECK-NEXT:    fadd.d fa5, fa5, fa2
1847b0c4184SCraig Topper; CHECK-NEXT:    fadd.d fa0, fa5, fa3
185bd6bf349SAnton Sidorenko; CHECK-NEXT:    ret
186bd6bf349SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
187bd6bf349SAnton Sidorenko  %t1 = fadd nsz reassoc double %t0, %a2
188bd6bf349SAnton Sidorenko  %t2 = fadd double %t1, %a3
189bd6bf349SAnton Sidorenko  ret double %t2
190bd6bf349SAnton Sidorenko}
191374d0765SAnton Sidorenko
192374d0765SAnton Sidorenkodefine double @test_fmadd1(double %a0, double %a1, double %a2, double %a3) {
193374d0765SAnton Sidorenko; CHECK-LABEL: test_fmadd1:
194374d0765SAnton Sidorenko; CHECK:       # %bb.0:
1957b0c4184SCraig Topper; CHECK-NEXT:    fmadd.d fa5, fa0, fa1, fa2
1967b0c4184SCraig Topper; CHECK-NEXT:    fmadd.d fa4, fa0, fa1, fa3
1977b0c4184SCraig Topper; CHECK-NEXT:    fadd.d fa0, fa5, fa4
198374d0765SAnton Sidorenko; CHECK-NEXT:    ret
199374d0765SAnton Sidorenko  %t0 = fmul contract double %a0, %a1
200374d0765SAnton Sidorenko  %t1 = fadd contract double %t0, %a2
201374d0765SAnton Sidorenko  %t2 = fadd contract double %a3, %t0
202374d0765SAnton Sidorenko  %t3 = fadd double %t1, %t2
203374d0765SAnton Sidorenko  ret double %t3
204374d0765SAnton Sidorenko}
205374d0765SAnton Sidorenko
206374d0765SAnton Sidorenkodefine double @test_fmadd2(double %a0, double %a1, double %a2) {
207374d0765SAnton Sidorenko; CHECK-LABEL: test_fmadd2:
208374d0765SAnton Sidorenko; CHECK:       # %bb.0:
2097b0c4184SCraig Topper; CHECK-NEXT:    fmul.d fa5, fa0, fa1
2107b0c4184SCraig Topper; CHECK-NEXT:    fmadd.d fa4, fa0, fa1, fa2
2117b0c4184SCraig Topper; CHECK-NEXT:    fdiv.d fa0, fa4, fa5
212374d0765SAnton Sidorenko; CHECK-NEXT:    ret
213374d0765SAnton Sidorenko  %t0 = fmul contract double %a0, %a1
214374d0765SAnton Sidorenko  %t1 = fadd contract double %t0, %a2
215374d0765SAnton Sidorenko  %t2 = fdiv double %t1, %t0
216374d0765SAnton Sidorenko  ret double %t2
217374d0765SAnton Sidorenko}
218374d0765SAnton Sidorenko
219374d0765SAnton Sidorenkodefine double @test_fmsub(double %a0, double %a1, double %a2) {
220374d0765SAnton Sidorenko; CHECK-LABEL: test_fmsub:
221374d0765SAnton Sidorenko; CHECK:       # %bb.0:
2227b0c4184SCraig Topper; CHECK-NEXT:    fmul.d fa5, fa0, fa1
2237b0c4184SCraig Topper; CHECK-NEXT:    fmsub.d fa4, fa0, fa1, fa2
2247b0c4184SCraig Topper; CHECK-NEXT:    fdiv.d fa0, fa4, fa5
225374d0765SAnton Sidorenko; CHECK-NEXT:    ret
226374d0765SAnton Sidorenko  %t0 = fmul contract double %a0, %a1
227374d0765SAnton Sidorenko  %t1 = fsub contract double %t0, %a2
228374d0765SAnton Sidorenko  %t2 = fdiv double %t1, %t0
229374d0765SAnton Sidorenko  ret double %t2
230374d0765SAnton Sidorenko}
231374d0765SAnton Sidorenko
232374d0765SAnton Sidorenkodefine double @test_fnmsub(double %a0, double %a1, double %a2) {
233374d0765SAnton Sidorenko; CHECK-LABEL: test_fnmsub:
234374d0765SAnton Sidorenko; CHECK:       # %bb.0:
2357b0c4184SCraig Topper; CHECK-NEXT:    fmul.d fa5, fa0, fa1
2367b0c4184SCraig Topper; CHECK-NEXT:    fnmsub.d fa4, fa0, fa1, fa2
2377b0c4184SCraig Topper; CHECK-NEXT:    fdiv.d fa0, fa4, fa5
238374d0765SAnton Sidorenko; CHECK-NEXT:    ret
239374d0765SAnton Sidorenko  %t0 = fmul contract double %a0, %a1
240374d0765SAnton Sidorenko  %t1 = fsub contract double %a2, %t0
241374d0765SAnton Sidorenko  %t2 = fdiv double %t1, %t0
242374d0765SAnton Sidorenko  ret double %t2
243374d0765SAnton Sidorenko}
2441cdffa35SAnton Sidorenko
2451cdffa35SAnton Sidorenkodefine double @test_reassoc_fsub1(double %a0, double %a1, double %a2, double %a3) {
2461cdffa35SAnton Sidorenko; CHECK-LABEL: test_reassoc_fsub1:
2471cdffa35SAnton Sidorenko; CHECK:       # %bb.0:
248*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa5, fa2, fa3
249*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa0, fa1
250*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa0, fa4, fa5
2511cdffa35SAnton Sidorenko; CHECK-NEXT:    ret
2521cdffa35SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
2531cdffa35SAnton Sidorenko  %t1 = fadd nsz reassoc double %t0, %a2
2541cdffa35SAnton Sidorenko  %t2 = fsub nsz reassoc double %t1, %a3
2551cdffa35SAnton Sidorenko  ret double %t2
2561cdffa35SAnton Sidorenko}
2571cdffa35SAnton Sidorenko
2581cdffa35SAnton Sidorenkodefine double @test_reassoc_fsub2(double %a0, double %a1, double %a2, double %a3) {
2591cdffa35SAnton Sidorenko; CHECK-LABEL: test_reassoc_fsub2:
2601cdffa35SAnton Sidorenko; CHECK:       # %bb.0:
261*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa5, fa2, fa3
262*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa0, fa1
263*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa0, fa4, fa5
2641cdffa35SAnton Sidorenko; CHECK-NEXT:    ret
2651cdffa35SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
2661cdffa35SAnton Sidorenko  %t1 = fsub nsz reassoc double %t0, %a2
2671cdffa35SAnton Sidorenko  %t2 = fadd nsz reassoc double %t1, %a3
2681cdffa35SAnton Sidorenko  ret double %t2
2691cdffa35SAnton Sidorenko}
2701cdffa35SAnton Sidorenko
2711cdffa35SAnton Sidorenkodefine double @test_reassoc_fsub3(double %a0, double %a1, double %a2, double %a3) {
2721cdffa35SAnton Sidorenko; CHECK-LABEL: test_reassoc_fsub3:
2731cdffa35SAnton Sidorenko; CHECK:       # %bb.0:
274*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa5, fa2, fa3
275*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa0, fa1
276*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa0, fa4, fa5
2771cdffa35SAnton Sidorenko; CHECK-NEXT:    ret
2781cdffa35SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
2791cdffa35SAnton Sidorenko  %t1 = fsub nsz reassoc double %t0, %a2
2801cdffa35SAnton Sidorenko  %t2 = fsub nsz reassoc double %t1, %a3
2811cdffa35SAnton Sidorenko  ret double %t2
2821cdffa35SAnton Sidorenko}
2831cdffa35SAnton Sidorenko
2841cdffa35SAnton Sidorenkodefine double @test_reassoc_fsub4(double %a0, double %a1, double %a2, double %a3) {
2851cdffa35SAnton Sidorenko; CHECK-LABEL: test_reassoc_fsub4:
2861cdffa35SAnton Sidorenko; CHECK:       # %bb.0:
287*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa5, fa2, fa3
288*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa0, fa1
289*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa0, fa5, fa4
2901cdffa35SAnton Sidorenko; CHECK-NEXT:    ret
2911cdffa35SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
2921cdffa35SAnton Sidorenko  %t1 = fadd nsz reassoc double %a2, %t0
2931cdffa35SAnton Sidorenko  %t2 = fsub nsz reassoc double %t1, %a3
2941cdffa35SAnton Sidorenko  ret double %t2
2951cdffa35SAnton Sidorenko}
2961cdffa35SAnton Sidorenko
2971cdffa35SAnton Sidorenkodefine double @test_reassoc_fsub5(double %a0, double %a1, double %a2, double %a3) {
2981cdffa35SAnton Sidorenko; CHECK-LABEL: test_reassoc_fsub5:
2991cdffa35SAnton Sidorenko; CHECK:       # %bb.0:
300*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa5, fa2, fa3
301*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa0, fa1
302*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa0, fa5, fa4
3031cdffa35SAnton Sidorenko; CHECK-NEXT:    ret
3041cdffa35SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
3051cdffa35SAnton Sidorenko  %t1 = fsub nsz reassoc double %a2, %t0
3061cdffa35SAnton Sidorenko  %t2 = fadd nsz reassoc double %t1, %a3
3071cdffa35SAnton Sidorenko  ret double %t2
3081cdffa35SAnton Sidorenko}
3091cdffa35SAnton Sidorenko
3101cdffa35SAnton Sidorenkodefine double @test_reassoc_fsub6(double %a0, double %a1, double %a2, double %a3) {
3111cdffa35SAnton Sidorenko; CHECK-LABEL: test_reassoc_fsub6:
3121cdffa35SAnton Sidorenko; CHECK:       # %bb.0:
313*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa5, fa2, fa3
314*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa0, fa1
315*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa0, fa5, fa4
3161cdffa35SAnton Sidorenko; CHECK-NEXT:    ret
3171cdffa35SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
3181cdffa35SAnton Sidorenko  %t1 = fsub nsz reassoc double %a2, %t0
3191cdffa35SAnton Sidorenko  %t2 = fsub nsz reassoc double %t1, %a3
3201cdffa35SAnton Sidorenko  ret double %t2
3211cdffa35SAnton Sidorenko}
3221cdffa35SAnton Sidorenko
3231cdffa35SAnton Sidorenkodefine double @test_reassoc_fsub7(double %a0, double %a1, double %a2, double %a3) {
3241cdffa35SAnton Sidorenko; CHECK-LABEL: test_reassoc_fsub7:
3251cdffa35SAnton Sidorenko; CHECK:       # %bb.0:
326*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa5, fa3, fa2
327*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa0, fa1
328*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa0, fa5, fa4
3291cdffa35SAnton Sidorenko; CHECK-NEXT:    ret
3301cdffa35SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
3311cdffa35SAnton Sidorenko  %t1 = fadd nsz reassoc double %t0, %a2
3321cdffa35SAnton Sidorenko  %t2 = fsub nsz reassoc double %a3, %t1
3331cdffa35SAnton Sidorenko  ret double %t2
3341cdffa35SAnton Sidorenko}
3351cdffa35SAnton Sidorenko
3361cdffa35SAnton Sidorenkodefine double @test_reassoc_fsub8(double %a0, double %a1, double %a2, double %a3) {
3371cdffa35SAnton Sidorenko; CHECK-LABEL: test_reassoc_fsub8:
3381cdffa35SAnton Sidorenko; CHECK:       # %bb.0:
339*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa5, fa3, fa2
340*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa0, fa1
341*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa0, fa5, fa4
3421cdffa35SAnton Sidorenko; CHECK-NEXT:    ret
3431cdffa35SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
3441cdffa35SAnton Sidorenko  %t1 = fsub nsz reassoc double %t0, %a2
3451cdffa35SAnton Sidorenko  %t2 = fadd nsz reassoc double %a3, %t1
3461cdffa35SAnton Sidorenko  ret double %t2
3471cdffa35SAnton Sidorenko}
3481cdffa35SAnton Sidorenko
3491cdffa35SAnton Sidorenkodefine double @test_reassoc_fsub9(double %a0, double %a1, double %a2, double %a3) {
3501cdffa35SAnton Sidorenko; CHECK-LABEL: test_reassoc_fsub9:
3511cdffa35SAnton Sidorenko; CHECK:       # %bb.0:
352*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa5, fa3, fa2
353*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa0, fa1
354*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa0, fa5, fa4
3551cdffa35SAnton Sidorenko; CHECK-NEXT:    ret
3561cdffa35SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
3571cdffa35SAnton Sidorenko  %t1 = fsub nsz reassoc double %t0, %a2
3581cdffa35SAnton Sidorenko  %t2 = fsub nsz reassoc double %a3, %t1
3591cdffa35SAnton Sidorenko  ret double %t2
3601cdffa35SAnton Sidorenko}
3611cdffa35SAnton Sidorenko
3621cdffa35SAnton Sidorenkodefine double @test_reassoc_fsub10(double %a0, double %a1, double %a2, double %a3) {
3631cdffa35SAnton Sidorenko; CHECK-LABEL: test_reassoc_fsub10:
3641cdffa35SAnton Sidorenko; CHECK:       # %bb.0:
365*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa5, fa3, fa2
366*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa0, fa1
367*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa0, fa5, fa4
3681cdffa35SAnton Sidorenko; CHECK-NEXT:    ret
3691cdffa35SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
3701cdffa35SAnton Sidorenko  %t1 = fadd nsz reassoc double %a2, %t0
3711cdffa35SAnton Sidorenko  %t2 = fsub nsz reassoc double %a3, %t1
3721cdffa35SAnton Sidorenko  ret double %t2
3731cdffa35SAnton Sidorenko}
3741cdffa35SAnton Sidorenko
3751cdffa35SAnton Sidorenkodefine double @test_reassoc_fsub11(double %a0, double %a1, double %a2, double %a3) {
3761cdffa35SAnton Sidorenko; CHECK-LABEL: test_reassoc_fsub11:
3771cdffa35SAnton Sidorenko; CHECK:       # %bb.0:
378*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa5, fa3, fa2
379*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa0, fa1
380*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa0, fa5, fa4
3811cdffa35SAnton Sidorenko; CHECK-NEXT:    ret
3821cdffa35SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
3831cdffa35SAnton Sidorenko  %t1 = fsub nsz reassoc double %a2, %t0
3841cdffa35SAnton Sidorenko  %t2 = fadd nsz reassoc double %a3, %t1
3851cdffa35SAnton Sidorenko  ret double %t2
3861cdffa35SAnton Sidorenko}
3871cdffa35SAnton Sidorenko
3881cdffa35SAnton Sidorenkodefine double @test_reassoc_fsub12(double %a0, double %a1, double %a2, double %a3) {
3891cdffa35SAnton Sidorenko; CHECK-LABEL: test_reassoc_fsub12:
3901cdffa35SAnton Sidorenko; CHECK:       # %bb.0:
391*9122c523SPengcheng Wang; CHECK-NEXT:    fsub.d fa5, fa3, fa2
392*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa4, fa0, fa1
393*9122c523SPengcheng Wang; CHECK-NEXT:    fadd.d fa0, fa5, fa4
3941cdffa35SAnton Sidorenko; CHECK-NEXT:    ret
3951cdffa35SAnton Sidorenko  %t0 = fadd nsz reassoc double %a0, %a1
3961cdffa35SAnton Sidorenko  %t1 = fsub nsz reassoc double %a2, %t0
3971cdffa35SAnton Sidorenko  %t2 = fsub nsz reassoc double %a3, %t1
3981cdffa35SAnton Sidorenko  ret double %t2
3991cdffa35SAnton Sidorenko}
400002005e6SHsiangkai Wang
401002005e6SHsiangkai Wangdefine i8 @test_reassoc_add_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {
402002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_add_i8:
403002005e6SHsiangkai Wang; CHECK:       # %bb.0:
404002005e6SHsiangkai Wang; CHECK-NEXT:    add a0, a0, a1
405002005e6SHsiangkai Wang; CHECK-NEXT:    add a2, a2, a3
406002005e6SHsiangkai Wang; CHECK-NEXT:    add a0, a0, a2
407002005e6SHsiangkai Wang; CHECK-NEXT:    ret
408002005e6SHsiangkai Wang  %t0 = add i8 %a0, %a1
409002005e6SHsiangkai Wang  %t1 = add i8 %t0, %a2
410002005e6SHsiangkai Wang  %t2 = add i8 %t1, %a3
411002005e6SHsiangkai Wang  ret i8 %t2
412002005e6SHsiangkai Wang}
413002005e6SHsiangkai Wang
414002005e6SHsiangkai Wangdefine i16 @test_reassoc_add_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {
415002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_add_i16:
416002005e6SHsiangkai Wang; CHECK:       # %bb.0:
417002005e6SHsiangkai Wang; CHECK-NEXT:    add a0, a0, a1
418002005e6SHsiangkai Wang; CHECK-NEXT:    add a2, a2, a3
419002005e6SHsiangkai Wang; CHECK-NEXT:    add a0, a0, a2
420002005e6SHsiangkai Wang; CHECK-NEXT:    ret
421002005e6SHsiangkai Wang  %t0 = add i16 %a0, %a1
422002005e6SHsiangkai Wang  %t1 = add i16 %t0, %a2
423002005e6SHsiangkai Wang  %t2 = add i16 %t1, %a3
424002005e6SHsiangkai Wang  ret i16 %t2
425002005e6SHsiangkai Wang}
426002005e6SHsiangkai Wang
427002005e6SHsiangkai Wangdefine i32 @test_reassoc_add_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {
428002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_add_i32:
429002005e6SHsiangkai Wang; CHECK:       # %bb.0:
430002005e6SHsiangkai Wang; CHECK-NEXT:    add a0, a0, a1
431002005e6SHsiangkai Wang; CHECK-NEXT:    add a2, a2, a3
432002005e6SHsiangkai Wang; CHECK-NEXT:    addw a0, a0, a2
433002005e6SHsiangkai Wang; CHECK-NEXT:    ret
434002005e6SHsiangkai Wang  %t0 = add i32 %a0, %a1
435002005e6SHsiangkai Wang  %t1 = add i32 %t0, %a2
436002005e6SHsiangkai Wang  %t2 = add i32 %t1, %a3
437002005e6SHsiangkai Wang  ret i32 %t2
438002005e6SHsiangkai Wang}
439002005e6SHsiangkai Wang
440002005e6SHsiangkai Wangdefine i64 @test_reassoc_add_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {
441002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_add_i64:
442002005e6SHsiangkai Wang; CHECK:       # %bb.0:
443002005e6SHsiangkai Wang; CHECK-NEXT:    add a0, a0, a1
444002005e6SHsiangkai Wang; CHECK-NEXT:    add a2, a2, a3
445002005e6SHsiangkai Wang; CHECK-NEXT:    add a0, a0, a2
446002005e6SHsiangkai Wang; CHECK-NEXT:    ret
447002005e6SHsiangkai Wang  %t0 = add i64 %a0, %a1
448002005e6SHsiangkai Wang  %t1 = add i64 %t0, %a2
449002005e6SHsiangkai Wang  %t2 = add i64 %t1, %a3
450002005e6SHsiangkai Wang  ret i64 %t2
451002005e6SHsiangkai Wang}
452002005e6SHsiangkai Wang
453002005e6SHsiangkai Wangdefine i32 @test_reassoc_add_sub_i32_1(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {
454002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_add_sub_i32_1:
455002005e6SHsiangkai Wang; CHECK:       # %bb.0:
456002005e6SHsiangkai Wang; CHECK-NEXT:    add a0, a0, a1
457002005e6SHsiangkai Wang; CHECK-NEXT:    subw a2, a2, a3
458002005e6SHsiangkai Wang; CHECK-NEXT:    subw a0, a0, a2
459002005e6SHsiangkai Wang; CHECK-NEXT:    ret
460002005e6SHsiangkai Wang  %t0 = add i32 %a0, %a1
461002005e6SHsiangkai Wang  %t1 = sub i32 %t0, %a2
462002005e6SHsiangkai Wang  %t2 = add i32 %t1, %a3
463002005e6SHsiangkai Wang  ret i32 %t2
464002005e6SHsiangkai Wang}
465002005e6SHsiangkai Wang
466002005e6SHsiangkai Wangdefine i32 @test_reassoc_add_sub_i32_2(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {
467002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_add_sub_i32_2:
468002005e6SHsiangkai Wang; CHECK:       # %bb.0:
469002005e6SHsiangkai Wang; CHECK-NEXT:    add a0, a0, a1
470002005e6SHsiangkai Wang; CHECK-NEXT:    subw a2, a2, a3
471002005e6SHsiangkai Wang; CHECK-NEXT:    addw a0, a0, a2
472002005e6SHsiangkai Wang; CHECK-NEXT:    ret
473002005e6SHsiangkai Wang  %t0 = add i32 %a0, %a1
474002005e6SHsiangkai Wang  %t1 = add i32 %t0, %a2
475002005e6SHsiangkai Wang  %t2 = sub i32 %t1, %a3
476002005e6SHsiangkai Wang  ret i32 %t2
477002005e6SHsiangkai Wang}
478002005e6SHsiangkai Wang
479002005e6SHsiangkai Wangdefine i32 @test_reassoc_add_sub_i32_3(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {
480002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_add_sub_i32_3:
481002005e6SHsiangkai Wang; CHECK:       # %bb.0:
482002005e6SHsiangkai Wang; CHECK-NEXT:    add a0, a0, a1
483002005e6SHsiangkai Wang; CHECK-NEXT:    add a2, a2, a3
484002005e6SHsiangkai Wang; CHECK-NEXT:    subw a0, a0, a2
485002005e6SHsiangkai Wang; CHECK-NEXT:    ret
486002005e6SHsiangkai Wang  %t0 = add i32 %a0, %a1
487002005e6SHsiangkai Wang  %t1 = sub i32 %t0, %a2
488002005e6SHsiangkai Wang  %t2 = sub i32 %t1, %a3
489002005e6SHsiangkai Wang  ret i32 %t2
490002005e6SHsiangkai Wang}
491002005e6SHsiangkai Wang
492002005e6SHsiangkai Wangdefine i64 @test_reassoc_add_sub_i64_1(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {
493002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_add_sub_i64_1:
494002005e6SHsiangkai Wang; CHECK:       # %bb.0:
495002005e6SHsiangkai Wang; CHECK-NEXT:    add a0, a0, a1
496002005e6SHsiangkai Wang; CHECK-NEXT:    sub a2, a2, a3
497002005e6SHsiangkai Wang; CHECK-NEXT:    sub a0, a0, a2
498002005e6SHsiangkai Wang; CHECK-NEXT:    ret
499002005e6SHsiangkai Wang  %t0 = add i64 %a0, %a1
500002005e6SHsiangkai Wang  %t1 = sub i64 %t0, %a2
501002005e6SHsiangkai Wang  %t2 = add i64 %t1, %a3
502002005e6SHsiangkai Wang  ret i64 %t2
503002005e6SHsiangkai Wang}
504002005e6SHsiangkai Wang
505002005e6SHsiangkai Wangdefine i64 @test_reassoc_add_sub_i64_2(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {
506002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_add_sub_i64_2:
507002005e6SHsiangkai Wang; CHECK:       # %bb.0:
508002005e6SHsiangkai Wang; CHECK-NEXT:    add a0, a0, a1
509002005e6SHsiangkai Wang; CHECK-NEXT:    sub a2, a2, a3
510002005e6SHsiangkai Wang; CHECK-NEXT:    add a0, a0, a2
511002005e6SHsiangkai Wang; CHECK-NEXT:    ret
512002005e6SHsiangkai Wang  %t0 = add i64 %a0, %a1
513002005e6SHsiangkai Wang  %t1 = add i64 %t0, %a2
514002005e6SHsiangkai Wang  %t2 = sub i64 %t1, %a3
515002005e6SHsiangkai Wang  ret i64 %t2
516002005e6SHsiangkai Wang}
517002005e6SHsiangkai Wang
518002005e6SHsiangkai Wangdefine i64 @test_reassoc_add_sub_i64_3(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {
519002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_add_sub_i64_3:
520002005e6SHsiangkai Wang; CHECK:       # %bb.0:
521002005e6SHsiangkai Wang; CHECK-NEXT:    add a0, a0, a1
522002005e6SHsiangkai Wang; CHECK-NEXT:    add a2, a2, a3
523002005e6SHsiangkai Wang; CHECK-NEXT:    sub a0, a0, a2
524002005e6SHsiangkai Wang; CHECK-NEXT:    ret
525002005e6SHsiangkai Wang  %t0 = add i64 %a0, %a1
526002005e6SHsiangkai Wang  %t1 = sub i64 %t0, %a2
527002005e6SHsiangkai Wang  %t2 = sub i64 %t1, %a3
528002005e6SHsiangkai Wang  ret i64 %t2
529002005e6SHsiangkai Wang}
530002005e6SHsiangkai Wang
531002005e6SHsiangkai Wangdefine i8 @test_reassoc_and_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {
532002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_and_i8:
533002005e6SHsiangkai Wang; CHECK:       # %bb.0:
534002005e6SHsiangkai Wang; CHECK-NEXT:    and a0, a0, a1
535002005e6SHsiangkai Wang; CHECK-NEXT:    and a2, a2, a3
536002005e6SHsiangkai Wang; CHECK-NEXT:    and a0, a0, a2
537002005e6SHsiangkai Wang; CHECK-NEXT:    ret
538002005e6SHsiangkai Wang  %t0 = and i8 %a0, %a1
539002005e6SHsiangkai Wang  %t1 = and i8 %t0, %a2
540002005e6SHsiangkai Wang  %t2 = and i8 %t1, %a3
541002005e6SHsiangkai Wang  ret i8 %t2
542002005e6SHsiangkai Wang}
543002005e6SHsiangkai Wang
544002005e6SHsiangkai Wangdefine i16 @test_reassoc_and_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {
545002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_and_i16:
546002005e6SHsiangkai Wang; CHECK:       # %bb.0:
547002005e6SHsiangkai Wang; CHECK-NEXT:    and a0, a0, a1
548002005e6SHsiangkai Wang; CHECK-NEXT:    and a2, a2, a3
549002005e6SHsiangkai Wang; CHECK-NEXT:    and a0, a0, a2
550002005e6SHsiangkai Wang; CHECK-NEXT:    ret
551002005e6SHsiangkai Wang  %t0 = and i16 %a0, %a1
552002005e6SHsiangkai Wang  %t1 = and i16 %t0, %a2
553002005e6SHsiangkai Wang  %t2 = and i16 %t1, %a3
554002005e6SHsiangkai Wang  ret i16 %t2
555002005e6SHsiangkai Wang}
556002005e6SHsiangkai Wang
557002005e6SHsiangkai Wangdefine i32 @test_reassoc_and_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {
558002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_and_i32:
559002005e6SHsiangkai Wang; CHECK:       # %bb.0:
560002005e6SHsiangkai Wang; CHECK-NEXT:    and a0, a0, a1
561002005e6SHsiangkai Wang; CHECK-NEXT:    and a2, a2, a3
562002005e6SHsiangkai Wang; CHECK-NEXT:    and a0, a0, a2
563002005e6SHsiangkai Wang; CHECK-NEXT:    ret
564002005e6SHsiangkai Wang  %t0 = and i32 %a0, %a1
565002005e6SHsiangkai Wang  %t1 = and i32 %t0, %a2
566002005e6SHsiangkai Wang  %t2 = and i32 %t1, %a3
567002005e6SHsiangkai Wang  ret i32 %t2
568002005e6SHsiangkai Wang}
569002005e6SHsiangkai Wang
570002005e6SHsiangkai Wangdefine i64 @test_reassoc_and_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {
571002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_and_i64:
572002005e6SHsiangkai Wang; CHECK:       # %bb.0:
573002005e6SHsiangkai Wang; CHECK-NEXT:    and a0, a0, a1
574002005e6SHsiangkai Wang; CHECK-NEXT:    and a2, a2, a3
575002005e6SHsiangkai Wang; CHECK-NEXT:    and a0, a0, a2
576002005e6SHsiangkai Wang; CHECK-NEXT:    ret
577002005e6SHsiangkai Wang  %t0 = and i64 %a0, %a1
578002005e6SHsiangkai Wang  %t1 = and i64 %t0, %a2
579002005e6SHsiangkai Wang  %t2 = and i64 %t1, %a3
580002005e6SHsiangkai Wang  ret i64 %t2
581002005e6SHsiangkai Wang}
582002005e6SHsiangkai Wang
583002005e6SHsiangkai Wangdefine i8 @test_reassoc_or_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {
584002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_or_i8:
585002005e6SHsiangkai Wang; CHECK:       # %bb.0:
586002005e6SHsiangkai Wang; CHECK-NEXT:    or a0, a0, a1
587002005e6SHsiangkai Wang; CHECK-NEXT:    or a2, a2, a3
588002005e6SHsiangkai Wang; CHECK-NEXT:    or a0, a0, a2
589002005e6SHsiangkai Wang; CHECK-NEXT:    ret
590002005e6SHsiangkai Wang  %t0 = or i8 %a0, %a1
591002005e6SHsiangkai Wang  %t1 = or i8 %t0, %a2
592002005e6SHsiangkai Wang  %t2 = or i8 %t1, %a3
593002005e6SHsiangkai Wang  ret i8 %t2
594002005e6SHsiangkai Wang}
595002005e6SHsiangkai Wang
596002005e6SHsiangkai Wangdefine i16 @test_reassoc_or_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {
597002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_or_i16:
598002005e6SHsiangkai Wang; CHECK:       # %bb.0:
599002005e6SHsiangkai Wang; CHECK-NEXT:    or a0, a0, a1
600002005e6SHsiangkai Wang; CHECK-NEXT:    or a2, a2, a3
601002005e6SHsiangkai Wang; CHECK-NEXT:    or a0, a0, a2
602002005e6SHsiangkai Wang; CHECK-NEXT:    ret
603002005e6SHsiangkai Wang  %t0 = or i16 %a0, %a1
604002005e6SHsiangkai Wang  %t1 = or i16 %t0, %a2
605002005e6SHsiangkai Wang  %t2 = or i16 %t1, %a3
606002005e6SHsiangkai Wang  ret i16 %t2
607002005e6SHsiangkai Wang}
608002005e6SHsiangkai Wang
609002005e6SHsiangkai Wangdefine i32 @test_reassoc_or_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {
610002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_or_i32:
611002005e6SHsiangkai Wang; CHECK:       # %bb.0:
612002005e6SHsiangkai Wang; CHECK-NEXT:    or a0, a0, a1
613002005e6SHsiangkai Wang; CHECK-NEXT:    or a2, a2, a3
614002005e6SHsiangkai Wang; CHECK-NEXT:    or a0, a0, a2
615002005e6SHsiangkai Wang; CHECK-NEXT:    ret
616002005e6SHsiangkai Wang  %t0 = or i32 %a0, %a1
617002005e6SHsiangkai Wang  %t1 = or i32 %t0, %a2
618002005e6SHsiangkai Wang  %t2 = or i32 %t1, %a3
619002005e6SHsiangkai Wang  ret i32 %t2
620002005e6SHsiangkai Wang}
621002005e6SHsiangkai Wang
622002005e6SHsiangkai Wangdefine i64 @test_reassoc_or_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {
623002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_or_i64:
624002005e6SHsiangkai Wang; CHECK:       # %bb.0:
625002005e6SHsiangkai Wang; CHECK-NEXT:    or a0, a0, a1
626002005e6SHsiangkai Wang; CHECK-NEXT:    or a2, a2, a3
627002005e6SHsiangkai Wang; CHECK-NEXT:    or a0, a0, a2
628002005e6SHsiangkai Wang; CHECK-NEXT:    ret
629002005e6SHsiangkai Wang  %t0 = or i64 %a0, %a1
630002005e6SHsiangkai Wang  %t1 = or i64 %t0, %a2
631002005e6SHsiangkai Wang  %t2 = or i64 %t1, %a3
632002005e6SHsiangkai Wang  ret i64 %t2
633002005e6SHsiangkai Wang}
634002005e6SHsiangkai Wang
635002005e6SHsiangkai Wangdefine i8 @test_reassoc_xor_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {
636002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_xor_i8:
637002005e6SHsiangkai Wang; CHECK:       # %bb.0:
638002005e6SHsiangkai Wang; CHECK-NEXT:    xor a0, a0, a1
639002005e6SHsiangkai Wang; CHECK-NEXT:    xor a2, a2, a3
640002005e6SHsiangkai Wang; CHECK-NEXT:    xor a0, a0, a2
641002005e6SHsiangkai Wang; CHECK-NEXT:    ret
642002005e6SHsiangkai Wang  %t0 = xor i8 %a0, %a1
643002005e6SHsiangkai Wang  %t1 = xor i8 %t0, %a2
644002005e6SHsiangkai Wang  %t2 = xor i8 %t1, %a3
645002005e6SHsiangkai Wang  ret i8 %t2
646002005e6SHsiangkai Wang}
647002005e6SHsiangkai Wang
648002005e6SHsiangkai Wangdefine i16 @test_reassoc_xor_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {
649002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_xor_i16:
650002005e6SHsiangkai Wang; CHECK:       # %bb.0:
651002005e6SHsiangkai Wang; CHECK-NEXT:    xor a0, a0, a1
652002005e6SHsiangkai Wang; CHECK-NEXT:    xor a2, a2, a3
653002005e6SHsiangkai Wang; CHECK-NEXT:    xor a0, a0, a2
654002005e6SHsiangkai Wang; CHECK-NEXT:    ret
655002005e6SHsiangkai Wang  %t0 = xor i16 %a0, %a1
656002005e6SHsiangkai Wang  %t1 = xor i16 %t0, %a2
657002005e6SHsiangkai Wang  %t2 = xor i16 %t1, %a3
658002005e6SHsiangkai Wang  ret i16 %t2
659002005e6SHsiangkai Wang}
660002005e6SHsiangkai Wang
661002005e6SHsiangkai Wangdefine i32 @test_reassoc_xor_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {
662002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_xor_i32:
663002005e6SHsiangkai Wang; CHECK:       # %bb.0:
664002005e6SHsiangkai Wang; CHECK-NEXT:    xor a0, a0, a1
665002005e6SHsiangkai Wang; CHECK-NEXT:    xor a2, a2, a3
666002005e6SHsiangkai Wang; CHECK-NEXT:    xor a0, a0, a2
667002005e6SHsiangkai Wang; CHECK-NEXT:    ret
668002005e6SHsiangkai Wang  %t0 = xor i32 %a0, %a1
669002005e6SHsiangkai Wang  %t1 = xor i32 %t0, %a2
670002005e6SHsiangkai Wang  %t2 = xor i32 %t1, %a3
671002005e6SHsiangkai Wang  ret i32 %t2
672002005e6SHsiangkai Wang}
673002005e6SHsiangkai Wang
674002005e6SHsiangkai Wangdefine i64 @test_reassoc_xor_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {
675002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_xor_i64:
676002005e6SHsiangkai Wang; CHECK:       # %bb.0:
677002005e6SHsiangkai Wang; CHECK-NEXT:    xor a0, a0, a1
678002005e6SHsiangkai Wang; CHECK-NEXT:    xor a2, a2, a3
679002005e6SHsiangkai Wang; CHECK-NEXT:    xor a0, a0, a2
680002005e6SHsiangkai Wang; CHECK-NEXT:    ret
681002005e6SHsiangkai Wang  %t0 = xor i64 %a0, %a1
682002005e6SHsiangkai Wang  %t1 = xor i64 %t0, %a2
683002005e6SHsiangkai Wang  %t2 = xor i64 %t1, %a3
684002005e6SHsiangkai Wang  ret i64 %t2
685002005e6SHsiangkai Wang}
686002005e6SHsiangkai Wang
687002005e6SHsiangkai Wangdefine i8 @test_reassoc_mul_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {
688002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_mul_i8:
689002005e6SHsiangkai Wang; CHECK:       # %bb.0:
690*9122c523SPengcheng Wang; CHECK-NEXT:    mul a2, a2, a3
691002005e6SHsiangkai Wang; CHECK-NEXT:    mul a0, a0, a1
692*9122c523SPengcheng Wang; CHECK-NEXT:    mul a0, a0, a2
693002005e6SHsiangkai Wang; CHECK-NEXT:    ret
694002005e6SHsiangkai Wang  %t0 = mul i8 %a0, %a1
695002005e6SHsiangkai Wang  %t1 = mul i8 %t0, %a2
696002005e6SHsiangkai Wang  %t2 = mul i8 %t1, %a3
697002005e6SHsiangkai Wang  ret i8 %t2
698002005e6SHsiangkai Wang}
699002005e6SHsiangkai Wang
700002005e6SHsiangkai Wangdefine i16 @test_reassoc_mul_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {
701002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_mul_i16:
702002005e6SHsiangkai Wang; CHECK:       # %bb.0:
703*9122c523SPengcheng Wang; CHECK-NEXT:    mul a2, a2, a3
704002005e6SHsiangkai Wang; CHECK-NEXT:    mul a0, a0, a1
705*9122c523SPengcheng Wang; CHECK-NEXT:    mul a0, a0, a2
706002005e6SHsiangkai Wang; CHECK-NEXT:    ret
707002005e6SHsiangkai Wang  %t0 = mul i16 %a0, %a1
708002005e6SHsiangkai Wang  %t1 = mul i16 %t0, %a2
709002005e6SHsiangkai Wang  %t2 = mul i16 %t1, %a3
710002005e6SHsiangkai Wang  ret i16 %t2
711002005e6SHsiangkai Wang}
712002005e6SHsiangkai Wang
713002005e6SHsiangkai Wangdefine i32 @test_reassoc_mul_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {
714002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_mul_i32:
715002005e6SHsiangkai Wang; CHECK:       # %bb.0:
716*9122c523SPengcheng Wang; CHECK-NEXT:    mul a2, a2, a3
7174063369fSCraig Topper; CHECK-NEXT:    mul a0, a0, a1
718*9122c523SPengcheng Wang; CHECK-NEXT:    mulw a0, a0, a2
719002005e6SHsiangkai Wang; CHECK-NEXT:    ret
720002005e6SHsiangkai Wang  %t0 = mul i32 %a0, %a1
721002005e6SHsiangkai Wang  %t1 = mul i32 %t0, %a2
722002005e6SHsiangkai Wang  %t2 = mul i32 %t1, %a3
723002005e6SHsiangkai Wang  ret i32 %t2
724002005e6SHsiangkai Wang}
725002005e6SHsiangkai Wang
726002005e6SHsiangkai Wangdefine i64 @test_reassoc_mul_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {
727002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_mul_i64:
728002005e6SHsiangkai Wang; CHECK:       # %bb.0:
729*9122c523SPengcheng Wang; CHECK-NEXT:    mul a2, a2, a3
730002005e6SHsiangkai Wang; CHECK-NEXT:    mul a0, a0, a1
731*9122c523SPengcheng Wang; CHECK-NEXT:    mul a0, a0, a2
732002005e6SHsiangkai Wang; CHECK-NEXT:    ret
733002005e6SHsiangkai Wang  %t0 = mul i64 %a0, %a1
734002005e6SHsiangkai Wang  %t1 = mul i64 %t0, %a2
735002005e6SHsiangkai Wang  %t2 = mul i64 %t1, %a3
736002005e6SHsiangkai Wang  ret i64 %t2
737002005e6SHsiangkai Wang}
738002005e6SHsiangkai Wang
739002005e6SHsiangkai Wangdefine i8 @test_reassoc_minu_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {
740002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_minu_i8:
741002005e6SHsiangkai Wang; CHECK:       # %bb.0:
742002005e6SHsiangkai Wang; CHECK-NEXT:    andi a3, a3, 255
743002005e6SHsiangkai Wang; CHECK-NEXT:    andi a1, a1, 255
744002005e6SHsiangkai Wang; CHECK-NEXT:    andi a0, a0, 255
745818e0272SMichael Maitland; CHECK-NEXT:    andi a2, a2, 255
746002005e6SHsiangkai Wang; CHECK-NEXT:    minu a0, a0, a1
747002005e6SHsiangkai Wang; CHECK-NEXT:    minu a1, a2, a3
748002005e6SHsiangkai Wang; CHECK-NEXT:    minu a0, a0, a1
749002005e6SHsiangkai Wang; CHECK-NEXT:    ret
750002005e6SHsiangkai Wang  %t0 = call i8 @llvm.umin.i8(i8 %a0, i8 %a1)
751002005e6SHsiangkai Wang  %t1 = call i8 @llvm.umin.i8(i8 %t0, i8 %a2)
752002005e6SHsiangkai Wang  %t2 = call i8 @llvm.umin.i8(i8 %t1, i8 %a3)
753002005e6SHsiangkai Wang  ret i8 %t2
754002005e6SHsiangkai Wang}
755002005e6SHsiangkai Wang
756002005e6SHsiangkai Wangdefine i16 @test_reassoc_minu_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {
757002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_minu_i16:
758002005e6SHsiangkai Wang; CHECK:       # %bb.0:
759002005e6SHsiangkai Wang; CHECK-NEXT:    zext.h a3, a3
760002005e6SHsiangkai Wang; CHECK-NEXT:    zext.h a1, a1
761002005e6SHsiangkai Wang; CHECK-NEXT:    zext.h a0, a0
762818e0272SMichael Maitland; CHECK-NEXT:    zext.h a2, a2
763002005e6SHsiangkai Wang; CHECK-NEXT:    minu a0, a0, a1
764002005e6SHsiangkai Wang; CHECK-NEXT:    minu a1, a2, a3
765002005e6SHsiangkai Wang; CHECK-NEXT:    minu a0, a0, a1
766002005e6SHsiangkai Wang; CHECK-NEXT:    ret
767002005e6SHsiangkai Wang  %t0 = call i16 @llvm.umin.i16(i16 %a0, i16 %a1)
768002005e6SHsiangkai Wang  %t1 = call i16 @llvm.umin.i16(i16 %t0, i16 %a2)
769002005e6SHsiangkai Wang  %t2 = call i16 @llvm.umin.i16(i16 %t1, i16 %a3)
770002005e6SHsiangkai Wang  ret i16 %t2
771002005e6SHsiangkai Wang}
772002005e6SHsiangkai Wang
773002005e6SHsiangkai Wangdefine i32 @test_reassoc_minu_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {
774002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_minu_i32:
775002005e6SHsiangkai Wang; CHECK:       # %bb.0:
776002005e6SHsiangkai Wang; CHECK-NEXT:    sext.w a3, a3
777002005e6SHsiangkai Wang; CHECK-NEXT:    sext.w a1, a1
778002005e6SHsiangkai Wang; CHECK-NEXT:    sext.w a0, a0
779818e0272SMichael Maitland; CHECK-NEXT:    sext.w a2, a2
780002005e6SHsiangkai Wang; CHECK-NEXT:    minu a0, a0, a1
781002005e6SHsiangkai Wang; CHECK-NEXT:    minu a1, a2, a3
782002005e6SHsiangkai Wang; CHECK-NEXT:    minu a0, a0, a1
783002005e6SHsiangkai Wang; CHECK-NEXT:    ret
784002005e6SHsiangkai Wang  %t0 = call i32 @llvm.umin.i32(i32 %a0, i32 %a1)
785002005e6SHsiangkai Wang  %t1 = call i32 @llvm.umin.i32(i32 %t0, i32 %a2)
786002005e6SHsiangkai Wang  %t2 = call i32 @llvm.umin.i32(i32 %t1, i32 %a3)
787002005e6SHsiangkai Wang  ret i32 %t2
788002005e6SHsiangkai Wang}
789002005e6SHsiangkai Wang
790002005e6SHsiangkai Wangdefine i64 @test_reassoc_minu_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {
791002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_minu_i64:
792002005e6SHsiangkai Wang; CHECK:       # %bb.0:
793002005e6SHsiangkai Wang; CHECK-NEXT:    minu a0, a0, a1
794002005e6SHsiangkai Wang; CHECK-NEXT:    minu a1, a2, a3
795002005e6SHsiangkai Wang; CHECK-NEXT:    minu a0, a0, a1
796002005e6SHsiangkai Wang; CHECK-NEXT:    ret
797002005e6SHsiangkai Wang  %t0 = call i64 @llvm.umin.i64(i64 %a0, i64 %a1)
798002005e6SHsiangkai Wang  %t1 = call i64 @llvm.umin.i64(i64 %t0, i64 %a2)
799002005e6SHsiangkai Wang  %t2 = call i64 @llvm.umin.i64(i64 %t1, i64 %a3)
800002005e6SHsiangkai Wang  ret i64 %t2
801002005e6SHsiangkai Wang}
802002005e6SHsiangkai Wang
803002005e6SHsiangkai Wangdefine i8 @test_reassoc_min_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {
804002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_min_i8:
805002005e6SHsiangkai Wang; CHECK:       # %bb.0:
806002005e6SHsiangkai Wang; CHECK-NEXT:    sext.b a3, a3
807002005e6SHsiangkai Wang; CHECK-NEXT:    sext.b a1, a1
808002005e6SHsiangkai Wang; CHECK-NEXT:    sext.b a0, a0
809818e0272SMichael Maitland; CHECK-NEXT:    sext.b a2, a2
810002005e6SHsiangkai Wang; CHECK-NEXT:    min a0, a0, a1
811002005e6SHsiangkai Wang; CHECK-NEXT:    min a1, a2, a3
812002005e6SHsiangkai Wang; CHECK-NEXT:    min a0, a0, a1
813002005e6SHsiangkai Wang; CHECK-NEXT:    ret
814002005e6SHsiangkai Wang  %t0 = call i8 @llvm.smin.i8(i8 %a0, i8 %a1)
815002005e6SHsiangkai Wang  %t1 = call i8 @llvm.smin.i8(i8 %t0, i8 %a2)
816002005e6SHsiangkai Wang  %t2 = call i8 @llvm.smin.i8(i8 %t1, i8 %a3)
817002005e6SHsiangkai Wang  ret i8 %t2
818002005e6SHsiangkai Wang}
819002005e6SHsiangkai Wang
820002005e6SHsiangkai Wangdefine i16 @test_reassoc_min_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {
821002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_min_i16:
822002005e6SHsiangkai Wang; CHECK:       # %bb.0:
823002005e6SHsiangkai Wang; CHECK-NEXT:    sext.h a3, a3
824002005e6SHsiangkai Wang; CHECK-NEXT:    sext.h a1, a1
825002005e6SHsiangkai Wang; CHECK-NEXT:    sext.h a0, a0
826818e0272SMichael Maitland; CHECK-NEXT:    sext.h a2, a2
827002005e6SHsiangkai Wang; CHECK-NEXT:    min a0, a0, a1
828002005e6SHsiangkai Wang; CHECK-NEXT:    min a1, a2, a3
829002005e6SHsiangkai Wang; CHECK-NEXT:    min a0, a0, a1
830002005e6SHsiangkai Wang; CHECK-NEXT:    ret
831002005e6SHsiangkai Wang  %t0 = call i16 @llvm.smin.i16(i16 %a0, i16 %a1)
832002005e6SHsiangkai Wang  %t1 = call i16 @llvm.smin.i16(i16 %t0, i16 %a2)
833002005e6SHsiangkai Wang  %t2 = call i16 @llvm.smin.i16(i16 %t1, i16 %a3)
834002005e6SHsiangkai Wang  ret i16 %t2
835002005e6SHsiangkai Wang}
836002005e6SHsiangkai Wang
837002005e6SHsiangkai Wangdefine i32 @test_reassoc_min_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {
838002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_min_i32:
839002005e6SHsiangkai Wang; CHECK:       # %bb.0:
840002005e6SHsiangkai Wang; CHECK-NEXT:    sext.w a3, a3
841002005e6SHsiangkai Wang; CHECK-NEXT:    sext.w a1, a1
842002005e6SHsiangkai Wang; CHECK-NEXT:    sext.w a0, a0
843818e0272SMichael Maitland; CHECK-NEXT:    sext.w a2, a2
844002005e6SHsiangkai Wang; CHECK-NEXT:    min a0, a0, a1
845002005e6SHsiangkai Wang; CHECK-NEXT:    min a1, a2, a3
846002005e6SHsiangkai Wang; CHECK-NEXT:    min a0, a0, a1
847002005e6SHsiangkai Wang; CHECK-NEXT:    ret
848002005e6SHsiangkai Wang  %t0 = call i32 @llvm.smin.i32(i32 %a0, i32 %a1)
849002005e6SHsiangkai Wang  %t1 = call i32 @llvm.smin.i32(i32 %t0, i32 %a2)
850002005e6SHsiangkai Wang  %t2 = call i32 @llvm.smin.i32(i32 %t1, i32 %a3)
851002005e6SHsiangkai Wang  ret i32 %t2
852002005e6SHsiangkai Wang}
853002005e6SHsiangkai Wang
854002005e6SHsiangkai Wangdefine i64 @test_reassoc_min_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {
855002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_min_i64:
856002005e6SHsiangkai Wang; CHECK:       # %bb.0:
857002005e6SHsiangkai Wang; CHECK-NEXT:    min a0, a0, a1
858002005e6SHsiangkai Wang; CHECK-NEXT:    min a1, a2, a3
859002005e6SHsiangkai Wang; CHECK-NEXT:    min a0, a0, a1
860002005e6SHsiangkai Wang; CHECK-NEXT:    ret
861002005e6SHsiangkai Wang  %t0 = call i64 @llvm.smin.i64(i64 %a0, i64 %a1)
862002005e6SHsiangkai Wang  %t1 = call i64 @llvm.smin.i64(i64 %t0, i64 %a2)
863002005e6SHsiangkai Wang  %t2 = call i64 @llvm.smin.i64(i64 %t1, i64 %a3)
864002005e6SHsiangkai Wang  ret i64 %t2
865002005e6SHsiangkai Wang}
866002005e6SHsiangkai Wang
867002005e6SHsiangkai Wangdefine i8 @test_reassoc_maxu_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {
868002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_maxu_i8:
869002005e6SHsiangkai Wang; CHECK:       # %bb.0:
870002005e6SHsiangkai Wang; CHECK-NEXT:    andi a3, a3, 255
871002005e6SHsiangkai Wang; CHECK-NEXT:    andi a1, a1, 255
872002005e6SHsiangkai Wang; CHECK-NEXT:    andi a0, a0, 255
873818e0272SMichael Maitland; CHECK-NEXT:    andi a2, a2, 255
874002005e6SHsiangkai Wang; CHECK-NEXT:    maxu a0, a0, a1
875002005e6SHsiangkai Wang; CHECK-NEXT:    maxu a1, a2, a3
876002005e6SHsiangkai Wang; CHECK-NEXT:    maxu a0, a0, a1
877002005e6SHsiangkai Wang; CHECK-NEXT:    ret
878002005e6SHsiangkai Wang  %t0 = call i8 @llvm.umax.i8(i8 %a0, i8 %a1)
879002005e6SHsiangkai Wang  %t1 = call i8 @llvm.umax.i8(i8 %t0, i8 %a2)
880002005e6SHsiangkai Wang  %t2 = call i8 @llvm.umax.i8(i8 %t1, i8 %a3)
881002005e6SHsiangkai Wang  ret i8 %t2
882002005e6SHsiangkai Wang}
883002005e6SHsiangkai Wang
884002005e6SHsiangkai Wangdefine i16 @test_reassoc_maxu_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {
885002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_maxu_i16:
886002005e6SHsiangkai Wang; CHECK:       # %bb.0:
887002005e6SHsiangkai Wang; CHECK-NEXT:    zext.h a3, a3
888002005e6SHsiangkai Wang; CHECK-NEXT:    zext.h a1, a1
889002005e6SHsiangkai Wang; CHECK-NEXT:    zext.h a0, a0
890818e0272SMichael Maitland; CHECK-NEXT:    zext.h a2, a2
891002005e6SHsiangkai Wang; CHECK-NEXT:    maxu a0, a0, a1
892002005e6SHsiangkai Wang; CHECK-NEXT:    maxu a1, a2, a3
893002005e6SHsiangkai Wang; CHECK-NEXT:    maxu a0, a0, a1
894002005e6SHsiangkai Wang; CHECK-NEXT:    ret
895002005e6SHsiangkai Wang  %t0 = call i16 @llvm.umax.i16(i16 %a0, i16 %a1)
896002005e6SHsiangkai Wang  %t1 = call i16 @llvm.umax.i16(i16 %t0, i16 %a2)
897002005e6SHsiangkai Wang  %t2 = call i16 @llvm.umax.i16(i16 %t1, i16 %a3)
898002005e6SHsiangkai Wang  ret i16 %t2
899002005e6SHsiangkai Wang}
900002005e6SHsiangkai Wang
901002005e6SHsiangkai Wangdefine i32 @test_reassoc_maxu_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {
902002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_maxu_i32:
903002005e6SHsiangkai Wang; CHECK:       # %bb.0:
904002005e6SHsiangkai Wang; CHECK-NEXT:    sext.w a3, a3
905002005e6SHsiangkai Wang; CHECK-NEXT:    sext.w a1, a1
906002005e6SHsiangkai Wang; CHECK-NEXT:    sext.w a0, a0
907818e0272SMichael Maitland; CHECK-NEXT:    sext.w a2, a2
908002005e6SHsiangkai Wang; CHECK-NEXT:    maxu a0, a0, a1
909002005e6SHsiangkai Wang; CHECK-NEXT:    maxu a1, a2, a3
910002005e6SHsiangkai Wang; CHECK-NEXT:    maxu a0, a0, a1
911002005e6SHsiangkai Wang; CHECK-NEXT:    ret
912002005e6SHsiangkai Wang  %t0 = call i32 @llvm.umax.i32(i32 %a0, i32 %a1)
913002005e6SHsiangkai Wang  %t1 = call i32 @llvm.umax.i32(i32 %t0, i32 %a2)
914002005e6SHsiangkai Wang  %t2 = call i32 @llvm.umax.i32(i32 %t1, i32 %a3)
915002005e6SHsiangkai Wang  ret i32 %t2
916002005e6SHsiangkai Wang}
917002005e6SHsiangkai Wang
918002005e6SHsiangkai Wangdefine i64 @test_reassoc_maxu_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {
919002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_maxu_i64:
920002005e6SHsiangkai Wang; CHECK:       # %bb.0:
921002005e6SHsiangkai Wang; CHECK-NEXT:    maxu a0, a0, a1
922002005e6SHsiangkai Wang; CHECK-NEXT:    maxu a1, a2, a3
923002005e6SHsiangkai Wang; CHECK-NEXT:    maxu a0, a0, a1
924002005e6SHsiangkai Wang; CHECK-NEXT:    ret
925002005e6SHsiangkai Wang  %t0 = call i64 @llvm.umax.i64(i64 %a0, i64 %a1)
926002005e6SHsiangkai Wang  %t1 = call i64 @llvm.umax.i64(i64 %t0, i64 %a2)
927002005e6SHsiangkai Wang  %t2 = call i64 @llvm.umax.i64(i64 %t1, i64 %a3)
928002005e6SHsiangkai Wang  ret i64 %t2
929002005e6SHsiangkai Wang}
930002005e6SHsiangkai Wang
931002005e6SHsiangkai Wangdefine i8 @test_reassoc_max_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {
932002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_max_i8:
933002005e6SHsiangkai Wang; CHECK:       # %bb.0:
934002005e6SHsiangkai Wang; CHECK-NEXT:    sext.b a3, a3
935002005e6SHsiangkai Wang; CHECK-NEXT:    sext.b a1, a1
936002005e6SHsiangkai Wang; CHECK-NEXT:    sext.b a0, a0
937818e0272SMichael Maitland; CHECK-NEXT:    sext.b a2, a2
938002005e6SHsiangkai Wang; CHECK-NEXT:    max a0, a0, a1
939002005e6SHsiangkai Wang; CHECK-NEXT:    max a1, a2, a3
940002005e6SHsiangkai Wang; CHECK-NEXT:    max a0, a0, a1
941002005e6SHsiangkai Wang; CHECK-NEXT:    ret
942002005e6SHsiangkai Wang  %t0 = call i8 @llvm.smax.i8(i8 %a0, i8 %a1)
943002005e6SHsiangkai Wang  %t1 = call i8 @llvm.smax.i8(i8 %t0, i8 %a2)
944002005e6SHsiangkai Wang  %t2 = call i8 @llvm.smax.i8(i8 %t1, i8 %a3)
945002005e6SHsiangkai Wang  ret i8 %t2
946002005e6SHsiangkai Wang}
947002005e6SHsiangkai Wang
948002005e6SHsiangkai Wangdefine i16 @test_reassoc_max_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {
949002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_max_i16:
950002005e6SHsiangkai Wang; CHECK:       # %bb.0:
951002005e6SHsiangkai Wang; CHECK-NEXT:    sext.h a3, a3
952002005e6SHsiangkai Wang; CHECK-NEXT:    sext.h a1, a1
953002005e6SHsiangkai Wang; CHECK-NEXT:    sext.h a0, a0
954818e0272SMichael Maitland; CHECK-NEXT:    sext.h a2, a2
955002005e6SHsiangkai Wang; CHECK-NEXT:    max a0, a0, a1
956002005e6SHsiangkai Wang; CHECK-NEXT:    max a1, a2, a3
957002005e6SHsiangkai Wang; CHECK-NEXT:    max a0, a0, a1
958002005e6SHsiangkai Wang; CHECK-NEXT:    ret
959002005e6SHsiangkai Wang  %t0 = call i16 @llvm.smax.i16(i16 %a0, i16 %a1)
960002005e6SHsiangkai Wang  %t1 = call i16 @llvm.smax.i16(i16 %t0, i16 %a2)
961002005e6SHsiangkai Wang  %t2 = call i16 @llvm.smax.i16(i16 %t1, i16 %a3)
962002005e6SHsiangkai Wang  ret i16 %t2
963002005e6SHsiangkai Wang}
964002005e6SHsiangkai Wang
965002005e6SHsiangkai Wangdefine i32 @test_reassoc_max_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {
966002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_max_i32:
967002005e6SHsiangkai Wang; CHECK:       # %bb.0:
968002005e6SHsiangkai Wang; CHECK-NEXT:    sext.w a3, a3
969002005e6SHsiangkai Wang; CHECK-NEXT:    sext.w a1, a1
970002005e6SHsiangkai Wang; CHECK-NEXT:    sext.w a0, a0
971818e0272SMichael Maitland; CHECK-NEXT:    sext.w a2, a2
972002005e6SHsiangkai Wang; CHECK-NEXT:    max a0, a0, a1
973002005e6SHsiangkai Wang; CHECK-NEXT:    max a1, a2, a3
974002005e6SHsiangkai Wang; CHECK-NEXT:    max a0, a0, a1
975002005e6SHsiangkai Wang; CHECK-NEXT:    ret
976002005e6SHsiangkai Wang  %t0 = call i32 @llvm.smax.i32(i32 %a0, i32 %a1)
977002005e6SHsiangkai Wang  %t1 = call i32 @llvm.smax.i32(i32 %t0, i32 %a2)
978002005e6SHsiangkai Wang  %t2 = call i32 @llvm.smax.i32(i32 %t1, i32 %a3)
979002005e6SHsiangkai Wang  ret i32 %t2
980002005e6SHsiangkai Wang}
981002005e6SHsiangkai Wang
982002005e6SHsiangkai Wangdefine i64 @test_reassoc_max_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {
983002005e6SHsiangkai Wang; CHECK-LABEL: test_reassoc_max_i64:
984002005e6SHsiangkai Wang; CHECK:       # %bb.0:
985002005e6SHsiangkai Wang; CHECK-NEXT:    max a0, a0, a1
986002005e6SHsiangkai Wang; CHECK-NEXT:    max a1, a2, a3
987002005e6SHsiangkai Wang; CHECK-NEXT:    max a0, a0, a1
988002005e6SHsiangkai Wang; CHECK-NEXT:    ret
989002005e6SHsiangkai Wang  %t0 = call i64 @llvm.smax.i64(i64 %a0, i64 %a1)
990002005e6SHsiangkai Wang  %t1 = call i64 @llvm.smax.i64(i64 %t0, i64 %a2)
991002005e6SHsiangkai Wang  %t2 = call i64 @llvm.smax.i64(i64 %t1, i64 %a3)
992002005e6SHsiangkai Wang  ret i64 %t2
993002005e6SHsiangkai Wang}
994002005e6SHsiangkai Wang
995af5dd270SHsiangkai Wangdefine half @test_fmin_f16(half %a0, half %a1, half %a2, half %a3) {
996af5dd270SHsiangkai Wang; CHECK-LABEL: test_fmin_f16:
997af5dd270SHsiangkai Wang; CHECK:       # %bb.0:
998*9122c523SPengcheng Wang; CHECK-NEXT:    fmin.h fa5, fa2, fa3
999*9122c523SPengcheng Wang; CHECK-NEXT:    fmin.h fa4, fa0, fa1
1000*9122c523SPengcheng Wang; CHECK-NEXT:    fmin.h fa0, fa4, fa5
1001af5dd270SHsiangkai Wang; CHECK-NEXT:    ret
1002af5dd270SHsiangkai Wang  %t0 = call half @llvm.minnum.f16(half %a0, half %a1)
1003af5dd270SHsiangkai Wang  %t1 = call half @llvm.minnum.f16(half %t0, half %a2)
1004af5dd270SHsiangkai Wang  %t2 = call half @llvm.minnum.f16(half %t1, half %a3)
1005af5dd270SHsiangkai Wang  ret half %t2
1006af5dd270SHsiangkai Wang}
1007af5dd270SHsiangkai Wang
1008af5dd270SHsiangkai Wangdefine float @test_fmin_f32(float %a0, float %a1, float %a2, float %a3) {
1009af5dd270SHsiangkai Wang; CHECK-LABEL: test_fmin_f32:
1010af5dd270SHsiangkai Wang; CHECK:       # %bb.0:
1011*9122c523SPengcheng Wang; CHECK-NEXT:    fmin.s fa5, fa2, fa3
1012*9122c523SPengcheng Wang; CHECK-NEXT:    fmin.s fa4, fa0, fa1
1013*9122c523SPengcheng Wang; CHECK-NEXT:    fmin.s fa0, fa4, fa5
1014af5dd270SHsiangkai Wang; CHECK-NEXT:    ret
1015af5dd270SHsiangkai Wang  %t0 = call float @llvm.minnum.f32(float %a0, float %a1)
1016af5dd270SHsiangkai Wang  %t1 = call float @llvm.minnum.f32(float %t0, float %a2)
1017af5dd270SHsiangkai Wang  %t2 = call float @llvm.minnum.f32(float %t1, float %a3)
1018af5dd270SHsiangkai Wang  ret float %t2
1019af5dd270SHsiangkai Wang}
1020af5dd270SHsiangkai Wang
1021af5dd270SHsiangkai Wangdefine double @test_fmin_f64(double %a0, double %a1, double %a2, double %a3) {
1022af5dd270SHsiangkai Wang; CHECK-LABEL: test_fmin_f64:
1023af5dd270SHsiangkai Wang; CHECK:       # %bb.0:
1024*9122c523SPengcheng Wang; CHECK-NEXT:    fmin.d fa5, fa2, fa3
1025*9122c523SPengcheng Wang; CHECK-NEXT:    fmin.d fa4, fa0, fa1
1026*9122c523SPengcheng Wang; CHECK-NEXT:    fmin.d fa0, fa4, fa5
1027af5dd270SHsiangkai Wang; CHECK-NEXT:    ret
1028af5dd270SHsiangkai Wang  %t0 = call double @llvm.minnum.f64(double %a0, double %a1)
1029af5dd270SHsiangkai Wang  %t1 = call double @llvm.minnum.f64(double %t0, double %a2)
1030af5dd270SHsiangkai Wang  %t2 = call double @llvm.minnum.f64(double %t1, double %a3)
1031af5dd270SHsiangkai Wang  ret double %t2
1032af5dd270SHsiangkai Wang}
1033af5dd270SHsiangkai Wang
1034af5dd270SHsiangkai Wangdefine half @test_fmax_f16(half %a0, half %a1, half %a2, half %a3) {
1035af5dd270SHsiangkai Wang; CHECK-LABEL: test_fmax_f16:
1036af5dd270SHsiangkai Wang; CHECK:       # %bb.0:
1037*9122c523SPengcheng Wang; CHECK-NEXT:    fmax.h fa5, fa2, fa3
1038*9122c523SPengcheng Wang; CHECK-NEXT:    fmax.h fa4, fa0, fa1
1039*9122c523SPengcheng Wang; CHECK-NEXT:    fmax.h fa0, fa4, fa5
1040af5dd270SHsiangkai Wang; CHECK-NEXT:    ret
1041af5dd270SHsiangkai Wang  %t0 = call half @llvm.maxnum.f16(half %a0, half %a1)
1042af5dd270SHsiangkai Wang  %t1 = call half @llvm.maxnum.f16(half %t0, half %a2)
1043af5dd270SHsiangkai Wang  %t2 = call half @llvm.maxnum.f16(half %t1, half %a3)
1044af5dd270SHsiangkai Wang  ret half %t2
1045af5dd270SHsiangkai Wang}
1046af5dd270SHsiangkai Wang
1047af5dd270SHsiangkai Wangdefine float @test_fmax_f32(float %a0, float %a1, float %a2, float %a3) {
1048af5dd270SHsiangkai Wang; CHECK-LABEL: test_fmax_f32:
1049af5dd270SHsiangkai Wang; CHECK:       # %bb.0:
1050*9122c523SPengcheng Wang; CHECK-NEXT:    fmax.s fa5, fa2, fa3
1051*9122c523SPengcheng Wang; CHECK-NEXT:    fmax.s fa4, fa0, fa1
1052*9122c523SPengcheng Wang; CHECK-NEXT:    fmax.s fa0, fa4, fa5
1053af5dd270SHsiangkai Wang; CHECK-NEXT:    ret
1054af5dd270SHsiangkai Wang  %t0 = call float @llvm.maxnum.f32(float %a0, float %a1)
1055af5dd270SHsiangkai Wang  %t1 = call float @llvm.maxnum.f32(float %t0, float %a2)
1056af5dd270SHsiangkai Wang  %t2 = call float @llvm.maxnum.f32(float %t1, float %a3)
1057af5dd270SHsiangkai Wang  ret float %t2
1058af5dd270SHsiangkai Wang}
1059af5dd270SHsiangkai Wang
1060af5dd270SHsiangkai Wangdefine double @test_fmax_f64(double %a0, double %a1, double %a2, double %a3) {
1061af5dd270SHsiangkai Wang; CHECK-LABEL: test_fmax_f64:
1062af5dd270SHsiangkai Wang; CHECK:       # %bb.0:
1063*9122c523SPengcheng Wang; CHECK-NEXT:    fmax.d fa5, fa2, fa3
1064*9122c523SPengcheng Wang; CHECK-NEXT:    fmax.d fa4, fa0, fa1
1065*9122c523SPengcheng Wang; CHECK-NEXT:    fmax.d fa0, fa4, fa5
1066af5dd270SHsiangkai Wang; CHECK-NEXT:    ret
1067af5dd270SHsiangkai Wang  %t0 = call double @llvm.maxnum.f64(double %a0, double %a1)
1068af5dd270SHsiangkai Wang  %t1 = call double @llvm.maxnum.f64(double %t0, double %a2)
1069af5dd270SHsiangkai Wang  %t2 = call double @llvm.maxnum.f64(double %t1, double %a3)
1070af5dd270SHsiangkai Wang  ret double %t2
1071af5dd270SHsiangkai Wang}
1072af5dd270SHsiangkai Wang
1073002005e6SHsiangkai Wangdeclare i8 @llvm.umin.i8(i8 %a, i8 %b)
1074002005e6SHsiangkai Wangdeclare i16 @llvm.umin.i16(i16 %a, i16 %b)
1075002005e6SHsiangkai Wangdeclare i32 @llvm.umin.i32(i32 %a, i32 %b)
1076002005e6SHsiangkai Wangdeclare i64 @llvm.umin.i64(i64 %a, i64 %b)
1077002005e6SHsiangkai Wangdeclare i8 @llvm.smin.i8(i8 %a, i8 %b)
1078002005e6SHsiangkai Wangdeclare i16 @llvm.smin.i16(i16 %a, i16 %b)
1079002005e6SHsiangkai Wangdeclare i32 @llvm.smin.i32(i32 %a, i32 %b)
1080002005e6SHsiangkai Wangdeclare i64 @llvm.smin.i64(i64 %a, i64 %b)
1081002005e6SHsiangkai Wangdeclare i8 @llvm.umax.i8(i8 %a, i8 %b)
1082002005e6SHsiangkai Wangdeclare i16 @llvm.umax.i16(i16 %a, i16 %b)
1083002005e6SHsiangkai Wangdeclare i32 @llvm.umax.i32(i32 %a, i32 %b)
1084002005e6SHsiangkai Wangdeclare i64 @llvm.umax.i64(i64 %a, i64 %b)
1085002005e6SHsiangkai Wangdeclare i8 @llvm.smax.i8(i8 %a, i8 %b)
1086002005e6SHsiangkai Wangdeclare i16 @llvm.smax.i16(i16 %a, i16 %b)
1087002005e6SHsiangkai Wangdeclare i32 @llvm.smax.i32(i32 %a, i32 %b)
1088002005e6SHsiangkai Wangdeclare i64 @llvm.smax.i64(i64 %a, i64 %b)
1089af5dd270SHsiangkai Wangdeclare half @llvm.minnum.f16(half, half)
1090af5dd270SHsiangkai Wangdeclare float @llvm.minnum.f32(float, float)
1091af5dd270SHsiangkai Wangdeclare double @llvm.minnum.f64(double, double)
1092af5dd270SHsiangkai Wangdeclare half @llvm.maxnum.f16(half, half)
1093af5dd270SHsiangkai Wangdeclare float @llvm.maxnum.f32(float, float)
1094af5dd270SHsiangkai Wangdeclare double @llvm.maxnum.f64(double, double)
10952693efa8SAnton Sidorenko
10962693efa8SAnton Sidorenkodefine double @test_fmadd_strategy(double %a0, double %a1, double %a2, double %a3, i64 %flag) {
10972693efa8SAnton Sidorenko; CHECK_LOCAL-LABEL: test_fmadd_strategy:
10982693efa8SAnton Sidorenko; CHECK_LOCAL:       # %bb.0: # %entry
10997b0c4184SCraig Topper; CHECK_LOCAL-NEXT:    fsub.d fa4, fa0, fa1
11002693efa8SAnton Sidorenko; CHECK_LOCAL-NEXT:    andi a0, a0, 1
11014f132dcaSMichael Maitland; CHECK_LOCAL-NEXT:    fmv.d fa5, fa0
11024f132dcaSMichael Maitland; CHECK_LOCAL-NEXT:    fmul.d fa0, fa4, fa2
11032693efa8SAnton Sidorenko; CHECK_LOCAL-NEXT:    beqz a0, .LBB76_2
11042693efa8SAnton Sidorenko; CHECK_LOCAL-NEXT:  # %bb.1: # %entry
11057b0c4184SCraig Topper; CHECK_LOCAL-NEXT:    fmul.d fa4, fa5, fa1
11067b0c4184SCraig Topper; CHECK_LOCAL-NEXT:    fmadd.d fa5, fa5, fa1, fa0
11077b0c4184SCraig Topper; CHECK_LOCAL-NEXT:    fsub.d fa0, fa5, fa4
11082693efa8SAnton Sidorenko; CHECK_LOCAL-NEXT:  .LBB76_2: # %entry
11092693efa8SAnton Sidorenko; CHECK_LOCAL-NEXT:    ret
11102693efa8SAnton Sidorenko;
11112693efa8SAnton Sidorenko; CHECK_GLOBAL-LABEL: test_fmadd_strategy:
11122693efa8SAnton Sidorenko; CHECK_GLOBAL:       # %bb.0: # %entry
11137b0c4184SCraig Topper; CHECK_GLOBAL-NEXT:    fsub.d fa4, fa0, fa1
11142693efa8SAnton Sidorenko; CHECK_GLOBAL-NEXT:    andi a0, a0, 1
11154f132dcaSMichael Maitland; CHECK_GLOBAL-NEXT:    fmv.d fa5, fa0
11164f132dcaSMichael Maitland; CHECK_GLOBAL-NEXT:    fmul.d fa0, fa4, fa2
11172693efa8SAnton Sidorenko; CHECK_GLOBAL-NEXT:    beqz a0, .LBB76_2
11182693efa8SAnton Sidorenko; CHECK_GLOBAL-NEXT:  # %bb.1: # %entry
11197b0c4184SCraig Topper; CHECK_GLOBAL-NEXT:    fmul.d fa5, fa5, fa1
11207b0c4184SCraig Topper; CHECK_GLOBAL-NEXT:    fadd.d fa4, fa5, fa0
11217b0c4184SCraig Topper; CHECK_GLOBAL-NEXT:    fsub.d fa0, fa4, fa5
11222693efa8SAnton Sidorenko; CHECK_GLOBAL-NEXT:  .LBB76_2: # %entry
11232693efa8SAnton Sidorenko; CHECK_GLOBAL-NEXT:    ret
11242693efa8SAnton Sidorenkoentry:
11252693efa8SAnton Sidorenko  %sub = fsub contract double %a0, %a1
11262693efa8SAnton Sidorenko  %mul = fmul contract double %sub, %a2
11272693efa8SAnton Sidorenko  %and = and i64 %flag, 1
11282693efa8SAnton Sidorenko  %tobool.not = icmp eq i64 %and, 0
11292693efa8SAnton Sidorenko  %mul2 = fmul contract double %a0, %a1
11302693efa8SAnton Sidorenko  %add = fadd contract double %mul2, %mul
11312693efa8SAnton Sidorenko  %sub3 = fsub contract double %add, %mul2
11322693efa8SAnton Sidorenko  %retval.0 = select i1 %tobool.not, double %mul, double %sub3
11332693efa8SAnton Sidorenko  ret double %retval.0
11342693efa8SAnton Sidorenko}
1135