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