brintos

brintos / llvm-project-archived public Read only

0
0
Text · 33.2 KiB · 326cf7b Raw
1101 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv64 -mattr=+d,+zbb,+zfh -verify-machineinstrs -mcpu=sifive-u74 \3; RUN: -O1 -riscv-enable-machine-combiner=true -riscv-force-machine-combiner-strategy=local < %s | \4; RUN: FileCheck %s --check-prefixes=CHECK,CHECK_LOCAL5 6; RUN: llc -mtriple=riscv64 -mattr=+d,+zbb,+zfh -verify-machineinstrs -mcpu=sifive-u74 \7; RUN: -O1 -riscv-enable-machine-combiner=true -riscv-force-machine-combiner-strategy=min-instr < %s | \8; RUN: FileCheck %s --check-prefixes=CHECK,CHECK_GLOBAL9 10define double @test_reassoc_fadd1(double %a0, double %a1, double %a2, double %a3) {11; CHECK-LABEL: test_reassoc_fadd1:12; CHECK:       # %bb.0:13; CHECK-NEXT:    fadd.d fa5, fa2, fa314; CHECK-NEXT:    fadd.d fa4, fa0, fa115; CHECK-NEXT:    fadd.d fa0, fa4, fa516; CHECK-NEXT:    ret17  %t0 = fadd nsz reassoc double %a0, %a118  %t1 = fadd nsz reassoc double %t0, %a219  %t2 = fadd nsz reassoc double %t1, %a320  ret double %t221}22 23define double @test_reassoc_fadd2(double %a0, double %a1, double %a2, double %a3) {24; CHECK-LABEL: test_reassoc_fadd2:25; CHECK:       # %bb.0:26; CHECK-NEXT:    fadd.d fa5, fa2, fa327; CHECK-NEXT:    fadd.d fa4, fa0, fa128; CHECK-NEXT:    fadd.d fa0, fa5, fa429; CHECK-NEXT:    ret30  %t0 = fadd nsz reassoc double %a0, %a131  %t1 = fadd nsz reassoc double %a2, %t032  %t2 = fadd nsz reassoc double %t1, %a333  ret double %t234}35 36define double @test_reassoc_fadd3(double %a0, double %a1, double %a2, double %a3) {37; CHECK-LABEL: test_reassoc_fadd3:38; CHECK:       # %bb.0:39; CHECK-NEXT:    fadd.d fa5, fa3, fa240; CHECK-NEXT:    fadd.d fa4, fa0, fa141; CHECK-NEXT:    fadd.d fa0, fa5, fa442; CHECK-NEXT:    ret43  %t0 = fadd nsz reassoc double %a0, %a144  %t1 = fadd nsz reassoc double %t0, %a245  %t2 = fadd nsz reassoc double %a3, %t146  ret double %t247}48 49define double @test_reassoc_fadd4(double %a0, double %a1, double %a2, double %a3) {50; CHECK-LABEL: test_reassoc_fadd4:51; CHECK:       # %bb.0:52; CHECK-NEXT:    fadd.d fa5, fa3, fa253; CHECK-NEXT:    fadd.d fa4, fa0, fa154; CHECK-NEXT:    fadd.d fa0, fa5, fa455; CHECK-NEXT:    ret56  %t0 = fadd nsz reassoc double %a0, %a157  %t1 = fadd nsz reassoc double %a2, %t058  %t2 = fadd nsz reassoc double %a3, %t159  ret double %t260}61 62define double @test_reassoc_fmul1(double %a0, double %a1, double %a2, double %a3) {63; CHECK-LABEL: test_reassoc_fmul1:64; CHECK:       # %bb.0:65; CHECK-NEXT:    fmul.d fa5, fa2, fa366; CHECK-NEXT:    fmul.d fa4, fa0, fa167; CHECK-NEXT:    fmul.d fa0, fa4, fa568; CHECK-NEXT:    ret69  %t0 = fmul nsz reassoc double %a0, %a170  %t1 = fmul nsz reassoc double %t0, %a271  %t2 = fmul nsz reassoc double %t1, %a372  ret double %t273}74 75define double @test_reassoc_fmul2(double %a0, double %a1, double %a2, double %a3) {76; CHECK-LABEL: test_reassoc_fmul2:77; CHECK:       # %bb.0:78; CHECK-NEXT:    fmul.d fa5, fa2, fa379; CHECK-NEXT:    fmul.d fa4, fa0, fa180; CHECK-NEXT:    fmul.d fa0, fa5, fa481; CHECK-NEXT:    ret82  %t0 = fmul nsz reassoc double %a0, %a183  %t1 = fmul nsz reassoc double %a2, %t084  %t2 = fmul nsz reassoc double %t1, %a385  ret double %t286}87 88define double @test_reassoc_fmul3(double %a0, double %a1, double %a2, double %a3) {89; CHECK-LABEL: test_reassoc_fmul3:90; CHECK:       # %bb.0:91; CHECK-NEXT:    fmul.d fa5, fa3, fa292; CHECK-NEXT:    fmul.d fa4, fa0, fa193; CHECK-NEXT:    fmul.d fa0, fa5, fa494; CHECK-NEXT:    ret95  %t0 = fmul nsz reassoc double %a0, %a196  %t1 = fmul nsz reassoc double %t0, %a297  %t2 = fmul nsz reassoc double %a3, %t198  ret double %t299}100 101define double @test_reassoc_fmul4(double %a0, double %a1, double %a2, double %a3) {102; CHECK-LABEL: test_reassoc_fmul4:103; CHECK:       # %bb.0:104; CHECK-NEXT:    fmul.d fa5, fa3, fa2105; CHECK-NEXT:    fmul.d fa4, fa0, fa1106; CHECK-NEXT:    fmul.d fa0, fa5, fa4107; CHECK-NEXT:    ret108  %t0 = fmul nsz reassoc double %a0, %a1109  %t1 = fmul nsz reassoc double %a2, %t0110  %t2 = fmul nsz reassoc double %a3, %t1111  ret double %t2112}113 114define double @test_reassoc_big1(double %a0, double %a1, double %a2, double %a3, double %a4, double %a5, double %a6) {115; CHECK-LABEL: test_reassoc_big1:116; CHECK:       # %bb.0:117; CHECK-NEXT:    fadd.d fa5, fa4, fa5118; CHECK-NEXT:    fadd.d fa4, fa2, fa3119; CHECK-NEXT:    fadd.d fa3, fa0, fa1120; CHECK-NEXT:    fadd.d fa5, fa5, fa6121; CHECK-NEXT:    fadd.d fa4, fa3, fa4122; CHECK-NEXT:    fadd.d fa0, fa4, fa5123; CHECK-NEXT:    ret124  %t0 = fadd nsz reassoc double %a0, %a1125  %t1 = fadd nsz reassoc double %t0, %a2126  %t2 = fadd nsz reassoc double %t1, %a3127  %t3 = fadd nsz reassoc double %t2, %a4128  %t4 = fadd nsz reassoc double %t3, %a5129  %t5 = fadd nsz reassoc double %t4, %a6130  ret double %t5131}132 133define double @test_reassoc_big2(double %a0, double %a1, i32 %a2, double %a3, i32 %a4, double %a5) {134; CHECK-LABEL: test_reassoc_big2:135; CHECK:       # %bb.0:136; CHECK-NEXT:    fsub.d fa4, fa3, fa2137; CHECK-NEXT:    fadd.d fa3, fa0, fa1138; CHECK-NEXT:    fadd.d ft0, fa2, fa1139; CHECK-NEXT:    fcvt.d.w fa5, a1140; CHECK-NEXT:    fcvt.d.w ft1, a0141; CHECK-NEXT:    fmul.d fa5, fa5, fa1142; CHECK-NEXT:    fmul.d fa2, fa2, ft1143; CHECK-NEXT:    fsub.d fa4, fa4, fa3144; CHECK-NEXT:    fmul.d fa3, fa0, ft0145; CHECK-NEXT:    fmul.d fa5, fa5, fa2146; CHECK-NEXT:    fmul.d fa4, fa4, fa3147; CHECK-NEXT:    fmul.d fa0, fa4, fa5148; CHECK-NEXT:    ret149  %cvt1 = sitofp i32 %a2 to double150  %cvt2 = sitofp i32 %a4 to double151  %t5 = fmul nsz reassoc double %a3, %cvt1152  %t9 = fmul nsz reassoc double %cvt2, %t5153  %t4 = fmul nsz reassoc double %t9, %a1154  %t0 = fadd nsz reassoc double %a0, %a1155  %t1 = fadd nsz reassoc double %a3, %t0156  %t3 = fadd nsz reassoc double %a3, %a1157  %t6 = fmul nsz reassoc double %t4, %a0158  %t2 = fsub nsz reassoc double %a5, %t1159  %t7 = fmul nsz reassoc double %t6, %t3160  %t8 = fmul nsz reassoc double %t2, %t7161  ret double %t8162}163 164; Negative test165define double @test_reassoc_fadd_flags_1(double %a0, double %a1, double %a2, double %a3) {166; CHECK-LABEL: test_reassoc_fadd_flags_1:167; CHECK:       # %bb.0:168; CHECK-NEXT:    fadd.d fa5, fa0, fa1169; CHECK-NEXT:    fadd.d fa5, fa5, fa2170; CHECK-NEXT:    fadd.d fa0, fa5, fa3171; CHECK-NEXT:    ret172  %t0 = fadd nsz reassoc double %a0, %a1173  %t1 = fadd double %t0, %a2174  %t2 = fadd nsz reassoc double %t1, %a3175  ret double %t2176}177 178; Negative test179define double @test_reassoc_fadd_flags_2(double %a0, double %a1, double %a2, double %a3) {180; CHECK-LABEL: test_reassoc_fadd_flags_2:181; CHECK:       # %bb.0:182; CHECK-NEXT:    fadd.d fa5, fa0, fa1183; CHECK-NEXT:    fadd.d fa5, fa5, fa2184; CHECK-NEXT:    fadd.d fa0, fa5, fa3185; CHECK-NEXT:    ret186  %t0 = fadd nsz reassoc double %a0, %a1187  %t1 = fadd nsz reassoc double %t0, %a2188  %t2 = fadd double %t1, %a3189  ret double %t2190}191 192define double @test_fmadd1(double %a0, double %a1, double %a2, double %a3) {193; CHECK-LABEL: test_fmadd1:194; CHECK:       # %bb.0:195; CHECK-NEXT:    fmadd.d fa5, fa0, fa1, fa2196; CHECK-NEXT:    fmadd.d fa4, fa0, fa1, fa3197; CHECK-NEXT:    fadd.d fa0, fa5, fa4198; CHECK-NEXT:    ret199  %t0 = fmul contract double %a0, %a1200  %t1 = fadd contract double %t0, %a2201  %t2 = fadd contract double %a3, %t0202  %t3 = fadd double %t1, %t2203  ret double %t3204}205 206define double @test_fmadd2(double %a0, double %a1, double %a2) {207; CHECK-LABEL: test_fmadd2:208; CHECK:       # %bb.0:209; CHECK-NEXT:    fmul.d fa5, fa0, fa1210; CHECK-NEXT:    fmadd.d fa4, fa0, fa1, fa2211; CHECK-NEXT:    fdiv.d fa0, fa4, fa5212; CHECK-NEXT:    ret213  %t0 = fmul contract double %a0, %a1214  %t1 = fadd contract double %t0, %a2215  %t2 = fdiv double %t1, %t0216  ret double %t2217}218 219define double @test_fmsub(double %a0, double %a1, double %a2) {220; CHECK-LABEL: test_fmsub:221; CHECK:       # %bb.0:222; CHECK-NEXT:    fmul.d fa5, fa0, fa1223; CHECK-NEXT:    fmsub.d fa4, fa0, fa1, fa2224; CHECK-NEXT:    fdiv.d fa0, fa4, fa5225; CHECK-NEXT:    ret226  %t0 = fmul contract double %a0, %a1227  %t1 = fsub contract double %t0, %a2228  %t2 = fdiv double %t1, %t0229  ret double %t2230}231 232define double @test_fnmsub(double %a0, double %a1, double %a2) {233; CHECK-LABEL: test_fnmsub:234; CHECK:       # %bb.0:235; CHECK-NEXT:    fmul.d fa5, fa0, fa1236; CHECK-NEXT:    fnmsub.d fa4, fa0, fa1, fa2237; CHECK-NEXT:    fdiv.d fa0, fa4, fa5238; CHECK-NEXT:    ret239  %t0 = fmul contract double %a0, %a1240  %t1 = fsub contract double %a2, %t0241  %t2 = fdiv double %t1, %t0242  ret double %t2243}244 245define double @test_reassoc_fsub1(double %a0, double %a1, double %a2, double %a3) {246; CHECK-LABEL: test_reassoc_fsub1:247; CHECK:       # %bb.0:248; CHECK-NEXT:    fsub.d fa5, fa2, fa3249; CHECK-NEXT:    fadd.d fa4, fa0, fa1250; CHECK-NEXT:    fadd.d fa0, fa4, fa5251; CHECK-NEXT:    ret252  %t0 = fadd nsz reassoc double %a0, %a1253  %t1 = fadd nsz reassoc double %t0, %a2254  %t2 = fsub nsz reassoc double %t1, %a3255  ret double %t2256}257 258define double @test_reassoc_fsub2(double %a0, double %a1, double %a2, double %a3) {259; CHECK-LABEL: test_reassoc_fsub2:260; CHECK:       # %bb.0:261; CHECK-NEXT:    fsub.d fa5, fa2, fa3262; CHECK-NEXT:    fadd.d fa4, fa0, fa1263; CHECK-NEXT:    fsub.d fa0, fa4, fa5264; CHECK-NEXT:    ret265  %t0 = fadd nsz reassoc double %a0, %a1266  %t1 = fsub nsz reassoc double %t0, %a2267  %t2 = fadd nsz reassoc double %t1, %a3268  ret double %t2269}270 271define double @test_reassoc_fsub3(double %a0, double %a1, double %a2, double %a3) {272; CHECK-LABEL: test_reassoc_fsub3:273; CHECK:       # %bb.0:274; CHECK-NEXT:    fadd.d fa5, fa2, fa3275; CHECK-NEXT:    fadd.d fa4, fa0, fa1276; CHECK-NEXT:    fsub.d fa0, fa4, fa5277; CHECK-NEXT:    ret278  %t0 = fadd nsz reassoc double %a0, %a1279  %t1 = fsub nsz reassoc double %t0, %a2280  %t2 = fsub nsz reassoc double %t1, %a3281  ret double %t2282}283 284define double @test_reassoc_fsub4(double %a0, double %a1, double %a2, double %a3) {285; CHECK-LABEL: test_reassoc_fsub4:286; CHECK:       # %bb.0:287; CHECK-NEXT:    fsub.d fa5, fa2, fa3288; CHECK-NEXT:    fadd.d fa4, fa0, fa1289; CHECK-NEXT:    fadd.d fa0, fa5, fa4290; CHECK-NEXT:    ret291  %t0 = fadd nsz reassoc double %a0, %a1292  %t1 = fadd nsz reassoc double %a2, %t0293  %t2 = fsub nsz reassoc double %t1, %a3294  ret double %t2295}296 297define double @test_reassoc_fsub5(double %a0, double %a1, double %a2, double %a3) {298; CHECK-LABEL: test_reassoc_fsub5:299; CHECK:       # %bb.0:300; CHECK-NEXT:    fadd.d fa5, fa2, fa3301; CHECK-NEXT:    fadd.d fa4, fa0, fa1302; CHECK-NEXT:    fsub.d fa0, fa5, fa4303; CHECK-NEXT:    ret304  %t0 = fadd nsz reassoc double %a0, %a1305  %t1 = fsub nsz reassoc double %a2, %t0306  %t2 = fadd nsz reassoc double %t1, %a3307  ret double %t2308}309 310define double @test_reassoc_fsub6(double %a0, double %a1, double %a2, double %a3) {311; CHECK-LABEL: test_reassoc_fsub6:312; CHECK:       # %bb.0:313; CHECK-NEXT:    fsub.d fa5, fa2, fa3314; CHECK-NEXT:    fadd.d fa4, fa0, fa1315; CHECK-NEXT:    fsub.d fa0, fa5, fa4316; CHECK-NEXT:    ret317  %t0 = fadd nsz reassoc double %a0, %a1318  %t1 = fsub nsz reassoc double %a2, %t0319  %t2 = fsub nsz reassoc double %t1, %a3320  ret double %t2321}322 323define double @test_reassoc_fsub7(double %a0, double %a1, double %a2, double %a3) {324; CHECK-LABEL: test_reassoc_fsub7:325; CHECK:       # %bb.0:326; CHECK-NEXT:    fsub.d fa5, fa3, fa2327; CHECK-NEXT:    fadd.d fa4, fa0, fa1328; CHECK-NEXT:    fsub.d fa0, fa5, fa4329; CHECK-NEXT:    ret330  %t0 = fadd nsz reassoc double %a0, %a1331  %t1 = fadd nsz reassoc double %t0, %a2332  %t2 = fsub nsz reassoc double %a3, %t1333  ret double %t2334}335 336define double @test_reassoc_fsub8(double %a0, double %a1, double %a2, double %a3) {337; CHECK-LABEL: test_reassoc_fsub8:338; CHECK:       # %bb.0:339; CHECK-NEXT:    fsub.d fa5, fa3, fa2340; CHECK-NEXT:    fadd.d fa4, fa0, fa1341; CHECK-NEXT:    fadd.d fa0, fa5, fa4342; CHECK-NEXT:    ret343  %t0 = fadd nsz reassoc double %a0, %a1344  %t1 = fsub nsz reassoc double %t0, %a2345  %t2 = fadd nsz reassoc double %a3, %t1346  ret double %t2347}348 349define double @test_reassoc_fsub9(double %a0, double %a1, double %a2, double %a3) {350; CHECK-LABEL: test_reassoc_fsub9:351; CHECK:       # %bb.0:352; CHECK-NEXT:    fadd.d fa5, fa3, fa2353; CHECK-NEXT:    fadd.d fa4, fa0, fa1354; CHECK-NEXT:    fsub.d fa0, fa5, fa4355; CHECK-NEXT:    ret356  %t0 = fadd nsz reassoc double %a0, %a1357  %t1 = fsub nsz reassoc double %t0, %a2358  %t2 = fsub nsz reassoc double %a3, %t1359  ret double %t2360}361 362define double @test_reassoc_fsub10(double %a0, double %a1, double %a2, double %a3) {363; CHECK-LABEL: test_reassoc_fsub10:364; CHECK:       # %bb.0:365; CHECK-NEXT:    fsub.d fa5, fa3, fa2366; CHECK-NEXT:    fadd.d fa4, fa0, fa1367; CHECK-NEXT:    fsub.d fa0, fa5, fa4368; CHECK-NEXT:    ret369  %t0 = fadd nsz reassoc double %a0, %a1370  %t1 = fadd nsz reassoc double %a2, %t0371  %t2 = fsub nsz reassoc double %a3, %t1372  ret double %t2373}374 375define double @test_reassoc_fsub11(double %a0, double %a1, double %a2, double %a3) {376; CHECK-LABEL: test_reassoc_fsub11:377; CHECK:       # %bb.0:378; CHECK-NEXT:    fadd.d fa5, fa3, fa2379; CHECK-NEXT:    fadd.d fa4, fa0, fa1380; CHECK-NEXT:    fsub.d fa0, fa5, fa4381; CHECK-NEXT:    ret382  %t0 = fadd nsz reassoc double %a0, %a1383  %t1 = fsub nsz reassoc double %a2, %t0384  %t2 = fadd nsz reassoc double %a3, %t1385  ret double %t2386}387 388define double @test_reassoc_fsub12(double %a0, double %a1, double %a2, double %a3) {389; CHECK-LABEL: test_reassoc_fsub12:390; CHECK:       # %bb.0:391; CHECK-NEXT:    fsub.d fa5, fa3, fa2392; CHECK-NEXT:    fadd.d fa4, fa0, fa1393; CHECK-NEXT:    fadd.d fa0, fa5, fa4394; CHECK-NEXT:    ret395  %t0 = fadd nsz reassoc double %a0, %a1396  %t1 = fsub nsz reassoc double %a2, %t0397  %t2 = fsub nsz reassoc double %a3, %t1398  ret double %t2399}400 401define i8 @test_reassoc_add_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {402; CHECK-LABEL: test_reassoc_add_i8:403; CHECK:       # %bb.0:404; CHECK-NEXT:    add a0, a0, a1405; CHECK-NEXT:    add a2, a2, a3406; CHECK-NEXT:    add a0, a0, a2407; CHECK-NEXT:    ret408  %t0 = add i8 %a0, %a1409  %t1 = add i8 %t0, %a2410  %t2 = add i8 %t1, %a3411  ret i8 %t2412}413 414define i16 @test_reassoc_add_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {415; CHECK-LABEL: test_reassoc_add_i16:416; CHECK:       # %bb.0:417; CHECK-NEXT:    add a0, a0, a1418; CHECK-NEXT:    add a2, a2, a3419; CHECK-NEXT:    add a0, a0, a2420; CHECK-NEXT:    ret421  %t0 = add i16 %a0, %a1422  %t1 = add i16 %t0, %a2423  %t2 = add i16 %t1, %a3424  ret i16 %t2425}426 427define i32 @test_reassoc_add_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {428; CHECK-LABEL: test_reassoc_add_i32:429; CHECK:       # %bb.0:430; CHECK-NEXT:    add a0, a0, a1431; CHECK-NEXT:    add a2, a2, a3432; CHECK-NEXT:    addw a0, a0, a2433; CHECK-NEXT:    ret434  %t0 = add i32 %a0, %a1435  %t1 = add i32 %t0, %a2436  %t2 = add i32 %t1, %a3437  ret i32 %t2438}439 440define i64 @test_reassoc_add_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {441; CHECK-LABEL: test_reassoc_add_i64:442; CHECK:       # %bb.0:443; CHECK-NEXT:    add a0, a0, a1444; CHECK-NEXT:    add a2, a2, a3445; CHECK-NEXT:    add a0, a0, a2446; CHECK-NEXT:    ret447  %t0 = add i64 %a0, %a1448  %t1 = add i64 %t0, %a2449  %t2 = add i64 %t1, %a3450  ret i64 %t2451}452 453define i32 @test_reassoc_add_sub_i32_1(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {454; CHECK-LABEL: test_reassoc_add_sub_i32_1:455; CHECK:       # %bb.0:456; CHECK-NEXT:    add a0, a0, a1457; CHECK-NEXT:    sub a2, a2, a3458; CHECK-NEXT:    subw a0, a0, a2459; CHECK-NEXT:    ret460  %t0 = add i32 %a0, %a1461  %t1 = sub i32 %t0, %a2462  %t2 = add i32 %t1, %a3463  ret i32 %t2464}465 466define i32 @test_reassoc_add_sub_i32_2(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {467; CHECK-LABEL: test_reassoc_add_sub_i32_2:468; CHECK:       # %bb.0:469; CHECK-NEXT:    add a0, a0, a1470; CHECK-NEXT:    sub a2, a2, a3471; CHECK-NEXT:    addw a0, a0, a2472; CHECK-NEXT:    ret473  %t0 = add i32 %a0, %a1474  %t1 = add i32 %t0, %a2475  %t2 = sub i32 %t1, %a3476  ret i32 %t2477}478 479define i32 @test_reassoc_add_sub_i32_3(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {480; CHECK-LABEL: test_reassoc_add_sub_i32_3:481; CHECK:       # %bb.0:482; CHECK-NEXT:    add a0, a0, a1483; CHECK-NEXT:    add a2, a2, a3484; CHECK-NEXT:    subw a0, a0, a2485; CHECK-NEXT:    ret486  %t0 = add i32 %a0, %a1487  %t1 = sub i32 %t0, %a2488  %t2 = sub i32 %t1, %a3489  ret i32 %t2490}491 492define i64 @test_reassoc_add_sub_i64_1(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {493; CHECK-LABEL: test_reassoc_add_sub_i64_1:494; CHECK:       # %bb.0:495; CHECK-NEXT:    add a0, a0, a1496; CHECK-NEXT:    sub a2, a2, a3497; CHECK-NEXT:    sub a0, a0, a2498; CHECK-NEXT:    ret499  %t0 = add i64 %a0, %a1500  %t1 = sub i64 %t0, %a2501  %t2 = add i64 %t1, %a3502  ret i64 %t2503}504 505define i64 @test_reassoc_add_sub_i64_2(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {506; CHECK-LABEL: test_reassoc_add_sub_i64_2:507; CHECK:       # %bb.0:508; CHECK-NEXT:    add a0, a0, a1509; CHECK-NEXT:    sub a2, a2, a3510; CHECK-NEXT:    add a0, a0, a2511; CHECK-NEXT:    ret512  %t0 = add i64 %a0, %a1513  %t1 = add i64 %t0, %a2514  %t2 = sub i64 %t1, %a3515  ret i64 %t2516}517 518define i64 @test_reassoc_add_sub_i64_3(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {519; CHECK-LABEL: test_reassoc_add_sub_i64_3:520; CHECK:       # %bb.0:521; CHECK-NEXT:    add a0, a0, a1522; CHECK-NEXT:    add a2, a2, a3523; CHECK-NEXT:    sub a0, a0, a2524; CHECK-NEXT:    ret525  %t0 = add i64 %a0, %a1526  %t1 = sub i64 %t0, %a2527  %t2 = sub i64 %t1, %a3528  ret i64 %t2529}530 531define i8 @test_reassoc_and_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {532; CHECK-LABEL: test_reassoc_and_i8:533; CHECK:       # %bb.0:534; CHECK-NEXT:    and a0, a0, a1535; CHECK-NEXT:    and a2, a2, a3536; CHECK-NEXT:    and a0, a0, a2537; CHECK-NEXT:    ret538  %t0 = and i8 %a0, %a1539  %t1 = and i8 %t0, %a2540  %t2 = and i8 %t1, %a3541  ret i8 %t2542}543 544define i16 @test_reassoc_and_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {545; CHECK-LABEL: test_reassoc_and_i16:546; CHECK:       # %bb.0:547; CHECK-NEXT:    and a0, a0, a1548; CHECK-NEXT:    and a2, a2, a3549; CHECK-NEXT:    and a0, a0, a2550; CHECK-NEXT:    ret551  %t0 = and i16 %a0, %a1552  %t1 = and i16 %t0, %a2553  %t2 = and i16 %t1, %a3554  ret i16 %t2555}556 557define i32 @test_reassoc_and_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {558; CHECK-LABEL: test_reassoc_and_i32:559; CHECK:       # %bb.0:560; CHECK-NEXT:    and a0, a0, a1561; CHECK-NEXT:    and a2, a2, a3562; CHECK-NEXT:    and a0, a0, a2563; CHECK-NEXT:    ret564  %t0 = and i32 %a0, %a1565  %t1 = and i32 %t0, %a2566  %t2 = and i32 %t1, %a3567  ret i32 %t2568}569 570define i64 @test_reassoc_and_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {571; CHECK-LABEL: test_reassoc_and_i64:572; CHECK:       # %bb.0:573; CHECK-NEXT:    and a0, a0, a1574; CHECK-NEXT:    and a2, a2, a3575; CHECK-NEXT:    and a0, a0, a2576; CHECK-NEXT:    ret577  %t0 = and i64 %a0, %a1578  %t1 = and i64 %t0, %a2579  %t2 = and i64 %t1, %a3580  ret i64 %t2581}582 583define i8 @test_reassoc_or_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {584; CHECK-LABEL: test_reassoc_or_i8:585; CHECK:       # %bb.0:586; CHECK-NEXT:    or a0, a0, a1587; CHECK-NEXT:    or a2, a2, a3588; CHECK-NEXT:    or a0, a0, a2589; CHECK-NEXT:    ret590  %t0 = or i8 %a0, %a1591  %t1 = or i8 %t0, %a2592  %t2 = or i8 %t1, %a3593  ret i8 %t2594}595 596define i16 @test_reassoc_or_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {597; CHECK-LABEL: test_reassoc_or_i16:598; CHECK:       # %bb.0:599; CHECK-NEXT:    or a0, a0, a1600; CHECK-NEXT:    or a2, a2, a3601; CHECK-NEXT:    or a0, a0, a2602; CHECK-NEXT:    ret603  %t0 = or i16 %a0, %a1604  %t1 = or i16 %t0, %a2605  %t2 = or i16 %t1, %a3606  ret i16 %t2607}608 609define i32 @test_reassoc_or_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {610; CHECK-LABEL: test_reassoc_or_i32:611; CHECK:       # %bb.0:612; CHECK-NEXT:    or a0, a0, a1613; CHECK-NEXT:    or a2, a2, a3614; CHECK-NEXT:    or a0, a0, a2615; CHECK-NEXT:    ret616  %t0 = or i32 %a0, %a1617  %t1 = or i32 %t0, %a2618  %t2 = or i32 %t1, %a3619  ret i32 %t2620}621 622define i64 @test_reassoc_or_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {623; CHECK-LABEL: test_reassoc_or_i64:624; CHECK:       # %bb.0:625; CHECK-NEXT:    or a0, a0, a1626; CHECK-NEXT:    or a2, a2, a3627; CHECK-NEXT:    or a0, a0, a2628; CHECK-NEXT:    ret629  %t0 = or i64 %a0, %a1630  %t1 = or i64 %t0, %a2631  %t2 = or i64 %t1, %a3632  ret i64 %t2633}634 635define i8 @test_reassoc_xor_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {636; CHECK-LABEL: test_reassoc_xor_i8:637; CHECK:       # %bb.0:638; CHECK-NEXT:    xor a0, a0, a1639; CHECK-NEXT:    xor a2, a2, a3640; CHECK-NEXT:    xor a0, a0, a2641; CHECK-NEXT:    ret642  %t0 = xor i8 %a0, %a1643  %t1 = xor i8 %t0, %a2644  %t2 = xor i8 %t1, %a3645  ret i8 %t2646}647 648define i16 @test_reassoc_xor_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {649; CHECK-LABEL: test_reassoc_xor_i16:650; CHECK:       # %bb.0:651; CHECK-NEXT:    xor a0, a0, a1652; CHECK-NEXT:    xor a2, a2, a3653; CHECK-NEXT:    xor a0, a0, a2654; CHECK-NEXT:    ret655  %t0 = xor i16 %a0, %a1656  %t1 = xor i16 %t0, %a2657  %t2 = xor i16 %t1, %a3658  ret i16 %t2659}660 661define i32 @test_reassoc_xor_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {662; CHECK-LABEL: test_reassoc_xor_i32:663; CHECK:       # %bb.0:664; CHECK-NEXT:    xor a0, a0, a1665; CHECK-NEXT:    xor a2, a2, a3666; CHECK-NEXT:    xor a0, a0, a2667; CHECK-NEXT:    ret668  %t0 = xor i32 %a0, %a1669  %t1 = xor i32 %t0, %a2670  %t2 = xor i32 %t1, %a3671  ret i32 %t2672}673 674define i64 @test_reassoc_xor_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {675; CHECK-LABEL: test_reassoc_xor_i64:676; CHECK:       # %bb.0:677; CHECK-NEXT:    xor a0, a0, a1678; CHECK-NEXT:    xor a2, a2, a3679; CHECK-NEXT:    xor a0, a0, a2680; CHECK-NEXT:    ret681  %t0 = xor i64 %a0, %a1682  %t1 = xor i64 %t0, %a2683  %t2 = xor i64 %t1, %a3684  ret i64 %t2685}686 687define i8 @test_reassoc_mul_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {688; CHECK-LABEL: test_reassoc_mul_i8:689; CHECK:       # %bb.0:690; CHECK-NEXT:    mul a2, a2, a3691; CHECK-NEXT:    mul a0, a0, a1692; CHECK-NEXT:    mul a0, a0, a2693; CHECK-NEXT:    ret694  %t0 = mul i8 %a0, %a1695  %t1 = mul i8 %t0, %a2696  %t2 = mul i8 %t1, %a3697  ret i8 %t2698}699 700define i16 @test_reassoc_mul_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {701; CHECK-LABEL: test_reassoc_mul_i16:702; CHECK:       # %bb.0:703; CHECK-NEXT:    mul a2, a2, a3704; CHECK-NEXT:    mul a0, a0, a1705; CHECK-NEXT:    mul a0, a0, a2706; CHECK-NEXT:    ret707  %t0 = mul i16 %a0, %a1708  %t1 = mul i16 %t0, %a2709  %t2 = mul i16 %t1, %a3710  ret i16 %t2711}712 713define i32 @test_reassoc_mul_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {714; CHECK-LABEL: test_reassoc_mul_i32:715; CHECK:       # %bb.0:716; CHECK-NEXT:    mul a2, a2, a3717; CHECK-NEXT:    mul a0, a0, a1718; CHECK-NEXT:    mulw a0, a0, a2719; CHECK-NEXT:    ret720  %t0 = mul i32 %a0, %a1721  %t1 = mul i32 %t0, %a2722  %t2 = mul i32 %t1, %a3723  ret i32 %t2724}725 726define i64 @test_reassoc_mul_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {727; CHECK-LABEL: test_reassoc_mul_i64:728; CHECK:       # %bb.0:729; CHECK-NEXT:    mul a2, a2, a3730; CHECK-NEXT:    mul a0, a0, a1731; CHECK-NEXT:    mul a0, a0, a2732; CHECK-NEXT:    ret733  %t0 = mul i64 %a0, %a1734  %t1 = mul i64 %t0, %a2735  %t2 = mul i64 %t1, %a3736  ret i64 %t2737}738 739define i8 @test_reassoc_minu_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {740; CHECK-LABEL: test_reassoc_minu_i8:741; CHECK:       # %bb.0:742; CHECK-NEXT:    zext.b a3, a3743; CHECK-NEXT:    zext.b a1, a1744; CHECK-NEXT:    zext.b a0, a0745; CHECK-NEXT:    zext.b a2, a2746; CHECK-NEXT:    minu a0, a0, a1747; CHECK-NEXT:    minu a1, a2, a3748; CHECK-NEXT:    minu a0, a0, a1749; CHECK-NEXT:    ret750  %t0 = call i8 @llvm.umin.i8(i8 %a0, i8 %a1)751  %t1 = call i8 @llvm.umin.i8(i8 %t0, i8 %a2)752  %t2 = call i8 @llvm.umin.i8(i8 %t1, i8 %a3)753  ret i8 %t2754}755 756define i16 @test_reassoc_minu_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {757; CHECK-LABEL: test_reassoc_minu_i16:758; CHECK:       # %bb.0:759; CHECK-NEXT:    zext.h a3, a3760; CHECK-NEXT:    zext.h a1, a1761; CHECK-NEXT:    zext.h a0, a0762; CHECK-NEXT:    zext.h a2, a2763; CHECK-NEXT:    minu a0, a0, a1764; CHECK-NEXT:    minu a1, a2, a3765; CHECK-NEXT:    minu a0, a0, a1766; CHECK-NEXT:    ret767  %t0 = call i16 @llvm.umin.i16(i16 %a0, i16 %a1)768  %t1 = call i16 @llvm.umin.i16(i16 %t0, i16 %a2)769  %t2 = call i16 @llvm.umin.i16(i16 %t1, i16 %a3)770  ret i16 %t2771}772 773define i32 @test_reassoc_minu_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {774; CHECK-LABEL: test_reassoc_minu_i32:775; CHECK:       # %bb.0:776; CHECK-NEXT:    sext.w a3, a3777; CHECK-NEXT:    sext.w a1, a1778; CHECK-NEXT:    sext.w a0, a0779; CHECK-NEXT:    sext.w a2, a2780; CHECK-NEXT:    minu a0, a0, a1781; CHECK-NEXT:    minu a1, a2, a3782; CHECK-NEXT:    minu a0, a0, a1783; CHECK-NEXT:    ret784  %t0 = call i32 @llvm.umin.i32(i32 %a0, i32 %a1)785  %t1 = call i32 @llvm.umin.i32(i32 %t0, i32 %a2)786  %t2 = call i32 @llvm.umin.i32(i32 %t1, i32 %a3)787  ret i32 %t2788}789 790define i64 @test_reassoc_minu_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {791; CHECK-LABEL: test_reassoc_minu_i64:792; CHECK:       # %bb.0:793; CHECK-NEXT:    minu a0, a0, a1794; CHECK-NEXT:    minu a1, a2, a3795; CHECK-NEXT:    minu a0, a0, a1796; CHECK-NEXT:    ret797  %t0 = call i64 @llvm.umin.i64(i64 %a0, i64 %a1)798  %t1 = call i64 @llvm.umin.i64(i64 %t0, i64 %a2)799  %t2 = call i64 @llvm.umin.i64(i64 %t1, i64 %a3)800  ret i64 %t2801}802 803define i8 @test_reassoc_min_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {804; CHECK-LABEL: test_reassoc_min_i8:805; CHECK:       # %bb.0:806; CHECK-NEXT:    sext.b a3, a3807; CHECK-NEXT:    sext.b a1, a1808; CHECK-NEXT:    sext.b a0, a0809; CHECK-NEXT:    sext.b a2, a2810; CHECK-NEXT:    min a0, a0, a1811; CHECK-NEXT:    min a1, a2, a3812; CHECK-NEXT:    min a0, a0, a1813; CHECK-NEXT:    ret814  %t0 = call i8 @llvm.smin.i8(i8 %a0, i8 %a1)815  %t1 = call i8 @llvm.smin.i8(i8 %t0, i8 %a2)816  %t2 = call i8 @llvm.smin.i8(i8 %t1, i8 %a3)817  ret i8 %t2818}819 820define i16 @test_reassoc_min_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {821; CHECK-LABEL: test_reassoc_min_i16:822; CHECK:       # %bb.0:823; CHECK-NEXT:    sext.h a3, a3824; CHECK-NEXT:    sext.h a1, a1825; CHECK-NEXT:    sext.h a0, a0826; CHECK-NEXT:    sext.h a2, a2827; CHECK-NEXT:    min a0, a0, a1828; CHECK-NEXT:    min a1, a2, a3829; CHECK-NEXT:    min a0, a0, a1830; CHECK-NEXT:    ret831  %t0 = call i16 @llvm.smin.i16(i16 %a0, i16 %a1)832  %t1 = call i16 @llvm.smin.i16(i16 %t0, i16 %a2)833  %t2 = call i16 @llvm.smin.i16(i16 %t1, i16 %a3)834  ret i16 %t2835}836 837define i32 @test_reassoc_min_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {838; CHECK-LABEL: test_reassoc_min_i32:839; CHECK:       # %bb.0:840; CHECK-NEXT:    sext.w a3, a3841; CHECK-NEXT:    sext.w a1, a1842; CHECK-NEXT:    sext.w a0, a0843; CHECK-NEXT:    sext.w a2, a2844; CHECK-NEXT:    min a0, a0, a1845; CHECK-NEXT:    min a1, a2, a3846; CHECK-NEXT:    min a0, a0, a1847; CHECK-NEXT:    ret848  %t0 = call i32 @llvm.smin.i32(i32 %a0, i32 %a1)849  %t1 = call i32 @llvm.smin.i32(i32 %t0, i32 %a2)850  %t2 = call i32 @llvm.smin.i32(i32 %t1, i32 %a3)851  ret i32 %t2852}853 854define i64 @test_reassoc_min_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {855; CHECK-LABEL: test_reassoc_min_i64:856; CHECK:       # %bb.0:857; CHECK-NEXT:    min a0, a0, a1858; CHECK-NEXT:    min a1, a2, a3859; CHECK-NEXT:    min a0, a0, a1860; CHECK-NEXT:    ret861  %t0 = call i64 @llvm.smin.i64(i64 %a0, i64 %a1)862  %t1 = call i64 @llvm.smin.i64(i64 %t0, i64 %a2)863  %t2 = call i64 @llvm.smin.i64(i64 %t1, i64 %a3)864  ret i64 %t2865}866 867define i8 @test_reassoc_maxu_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {868; CHECK-LABEL: test_reassoc_maxu_i8:869; CHECK:       # %bb.0:870; CHECK-NEXT:    zext.b a3, a3871; CHECK-NEXT:    zext.b a1, a1872; CHECK-NEXT:    zext.b a0, a0873; CHECK-NEXT:    zext.b a2, a2874; CHECK-NEXT:    maxu a0, a0, a1875; CHECK-NEXT:    maxu a1, a2, a3876; CHECK-NEXT:    maxu a0, a0, a1877; CHECK-NEXT:    ret878  %t0 = call i8 @llvm.umax.i8(i8 %a0, i8 %a1)879  %t1 = call i8 @llvm.umax.i8(i8 %t0, i8 %a2)880  %t2 = call i8 @llvm.umax.i8(i8 %t1, i8 %a3)881  ret i8 %t2882}883 884define i16 @test_reassoc_maxu_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {885; CHECK-LABEL: test_reassoc_maxu_i16:886; CHECK:       # %bb.0:887; CHECK-NEXT:    zext.h a3, a3888; CHECK-NEXT:    zext.h a1, a1889; CHECK-NEXT:    zext.h a0, a0890; CHECK-NEXT:    zext.h a2, a2891; CHECK-NEXT:    maxu a0, a0, a1892; CHECK-NEXT:    maxu a1, a2, a3893; CHECK-NEXT:    maxu a0, a0, a1894; CHECK-NEXT:    ret895  %t0 = call i16 @llvm.umax.i16(i16 %a0, i16 %a1)896  %t1 = call i16 @llvm.umax.i16(i16 %t0, i16 %a2)897  %t2 = call i16 @llvm.umax.i16(i16 %t1, i16 %a3)898  ret i16 %t2899}900 901define i32 @test_reassoc_maxu_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {902; CHECK-LABEL: test_reassoc_maxu_i32:903; CHECK:       # %bb.0:904; CHECK-NEXT:    sext.w a3, a3905; CHECK-NEXT:    sext.w a1, a1906; CHECK-NEXT:    sext.w a0, a0907; CHECK-NEXT:    sext.w a2, a2908; CHECK-NEXT:    maxu a0, a0, a1909; CHECK-NEXT:    maxu a1, a2, a3910; CHECK-NEXT:    maxu a0, a0, a1911; CHECK-NEXT:    ret912  %t0 = call i32 @llvm.umax.i32(i32 %a0, i32 %a1)913  %t1 = call i32 @llvm.umax.i32(i32 %t0, i32 %a2)914  %t2 = call i32 @llvm.umax.i32(i32 %t1, i32 %a3)915  ret i32 %t2916}917 918define i64 @test_reassoc_maxu_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {919; CHECK-LABEL: test_reassoc_maxu_i64:920; CHECK:       # %bb.0:921; CHECK-NEXT:    maxu a0, a0, a1922; CHECK-NEXT:    maxu a1, a2, a3923; CHECK-NEXT:    maxu a0, a0, a1924; CHECK-NEXT:    ret925  %t0 = call i64 @llvm.umax.i64(i64 %a0, i64 %a1)926  %t1 = call i64 @llvm.umax.i64(i64 %t0, i64 %a2)927  %t2 = call i64 @llvm.umax.i64(i64 %t1, i64 %a3)928  ret i64 %t2929}930 931define i8 @test_reassoc_max_i8(i8 %a0, i8 %a1, i8 %a2, i8 %a3) {932; CHECK-LABEL: test_reassoc_max_i8:933; CHECK:       # %bb.0:934; CHECK-NEXT:    sext.b a3, a3935; CHECK-NEXT:    sext.b a1, a1936; CHECK-NEXT:    sext.b a0, a0937; CHECK-NEXT:    sext.b a2, a2938; CHECK-NEXT:    max a0, a0, a1939; CHECK-NEXT:    max a1, a2, a3940; CHECK-NEXT:    max a0, a0, a1941; CHECK-NEXT:    ret942  %t0 = call i8 @llvm.smax.i8(i8 %a0, i8 %a1)943  %t1 = call i8 @llvm.smax.i8(i8 %t0, i8 %a2)944  %t2 = call i8 @llvm.smax.i8(i8 %t1, i8 %a3)945  ret i8 %t2946}947 948define i16 @test_reassoc_max_i16(i16 %a0, i16 %a1, i16 %a2, i16 %a3) {949; CHECK-LABEL: test_reassoc_max_i16:950; CHECK:       # %bb.0:951; CHECK-NEXT:    sext.h a3, a3952; CHECK-NEXT:    sext.h a1, a1953; CHECK-NEXT:    sext.h a0, a0954; CHECK-NEXT:    sext.h a2, a2955; CHECK-NEXT:    max a0, a0, a1956; CHECK-NEXT:    max a1, a2, a3957; CHECK-NEXT:    max a0, a0, a1958; CHECK-NEXT:    ret959  %t0 = call i16 @llvm.smax.i16(i16 %a0, i16 %a1)960  %t1 = call i16 @llvm.smax.i16(i16 %t0, i16 %a2)961  %t2 = call i16 @llvm.smax.i16(i16 %t1, i16 %a3)962  ret i16 %t2963}964 965define i32 @test_reassoc_max_i32(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {966; CHECK-LABEL: test_reassoc_max_i32:967; CHECK:       # %bb.0:968; CHECK-NEXT:    sext.w a3, a3969; CHECK-NEXT:    sext.w a1, a1970; CHECK-NEXT:    sext.w a0, a0971; CHECK-NEXT:    sext.w a2, a2972; CHECK-NEXT:    max a0, a0, a1973; CHECK-NEXT:    max a1, a2, a3974; CHECK-NEXT:    max a0, a0, a1975; CHECK-NEXT:    ret976  %t0 = call i32 @llvm.smax.i32(i32 %a0, i32 %a1)977  %t1 = call i32 @llvm.smax.i32(i32 %t0, i32 %a2)978  %t2 = call i32 @llvm.smax.i32(i32 %t1, i32 %a3)979  ret i32 %t2980}981 982define i64 @test_reassoc_max_i64(i64 %a0, i64 %a1, i64 %a2, i64 %a3) {983; CHECK-LABEL: test_reassoc_max_i64:984; CHECK:       # %bb.0:985; CHECK-NEXT:    max a0, a0, a1986; CHECK-NEXT:    max a1, a2, a3987; CHECK-NEXT:    max a0, a0, a1988; CHECK-NEXT:    ret989  %t0 = call i64 @llvm.smax.i64(i64 %a0, i64 %a1)990  %t1 = call i64 @llvm.smax.i64(i64 %t0, i64 %a2)991  %t2 = call i64 @llvm.smax.i64(i64 %t1, i64 %a3)992  ret i64 %t2993}994 995define half @test_fmin_f16(half %a0, half %a1, half %a2, half %a3) {996; CHECK-LABEL: test_fmin_f16:997; CHECK:       # %bb.0:998; CHECK-NEXT:    fmin.h fa5, fa2, fa3999; CHECK-NEXT:    fmin.h fa4, fa0, fa11000; CHECK-NEXT:    fmin.h fa0, fa4, fa51001; CHECK-NEXT:    ret1002  %t0 = call half @llvm.minnum.f16(half %a0, half %a1)1003  %t1 = call half @llvm.minnum.f16(half %t0, half %a2)1004  %t2 = call half @llvm.minnum.f16(half %t1, half %a3)1005  ret half %t21006}1007 1008define float @test_fmin_f32(float %a0, float %a1, float %a2, float %a3) {1009; CHECK-LABEL: test_fmin_f32:1010; CHECK:       # %bb.0:1011; CHECK-NEXT:    fmin.s fa5, fa2, fa31012; CHECK-NEXT:    fmin.s fa4, fa0, fa11013; CHECK-NEXT:    fmin.s fa0, fa4, fa51014; CHECK-NEXT:    ret1015  %t0 = call float @llvm.minnum.f32(float %a0, float %a1)1016  %t1 = call float @llvm.minnum.f32(float %t0, float %a2)1017  %t2 = call float @llvm.minnum.f32(float %t1, float %a3)1018  ret float %t21019}1020 1021define double @test_fmin_f64(double %a0, double %a1, double %a2, double %a3) {1022; CHECK-LABEL: test_fmin_f64:1023; CHECK:       # %bb.0:1024; CHECK-NEXT:    fmin.d fa5, fa2, fa31025; CHECK-NEXT:    fmin.d fa4, fa0, fa11026; CHECK-NEXT:    fmin.d fa0, fa4, fa51027; CHECK-NEXT:    ret1028  %t0 = call double @llvm.minnum.f64(double %a0, double %a1)1029  %t1 = call double @llvm.minnum.f64(double %t0, double %a2)1030  %t2 = call double @llvm.minnum.f64(double %t1, double %a3)1031  ret double %t21032}1033 1034define half @test_fmax_f16(half %a0, half %a1, half %a2, half %a3) {1035; CHECK-LABEL: test_fmax_f16:1036; CHECK:       # %bb.0:1037; CHECK-NEXT:    fmax.h fa5, fa2, fa31038; CHECK-NEXT:    fmax.h fa4, fa0, fa11039; CHECK-NEXT:    fmax.h fa0, fa4, fa51040; CHECK-NEXT:    ret1041  %t0 = call half @llvm.maxnum.f16(half %a0, half %a1)1042  %t1 = call half @llvm.maxnum.f16(half %t0, half %a2)1043  %t2 = call half @llvm.maxnum.f16(half %t1, half %a3)1044  ret half %t21045}1046 1047define float @test_fmax_f32(float %a0, float %a1, float %a2, float %a3) {1048; CHECK-LABEL: test_fmax_f32:1049; CHECK:       # %bb.0:1050; CHECK-NEXT:    fmax.s fa5, fa2, fa31051; CHECK-NEXT:    fmax.s fa4, fa0, fa11052; CHECK-NEXT:    fmax.s fa0, fa4, fa51053; CHECK-NEXT:    ret1054  %t0 = call float @llvm.maxnum.f32(float %a0, float %a1)1055  %t1 = call float @llvm.maxnum.f32(float %t0, float %a2)1056  %t2 = call float @llvm.maxnum.f32(float %t1, float %a3)1057  ret float %t21058}1059 1060define double @test_fmax_f64(double %a0, double %a1, double %a2, double %a3) {1061; CHECK-LABEL: test_fmax_f64:1062; CHECK:       # %bb.0:1063; CHECK-NEXT:    fmax.d fa5, fa2, fa31064; CHECK-NEXT:    fmax.d fa4, fa0, fa11065; CHECK-NEXT:    fmax.d fa0, fa4, fa51066; CHECK-NEXT:    ret1067  %t0 = call double @llvm.maxnum.f64(double %a0, double %a1)1068  %t1 = call double @llvm.maxnum.f64(double %t0, double %a2)1069  %t2 = call double @llvm.maxnum.f64(double %t1, double %a3)1070  ret double %t21071}1072 1073define double @test_fmadd_strategy(double %a0, double %a1, double %a2, double %a3, i64 %flag) {1074; CHECK-LABEL: test_fmadd_strategy:1075; CHECK:       # %bb.0: # %entry1076; CHECK-NEXT:    fsub.d fa5, fa0, fa11077; CHECK-NEXT:    andi a0, a0, 11078; CHECK-NEXT:    beqz a0, .LBB76_21079; CHECK-NEXT:  # %bb.1: # %entry1080; CHECK-NEXT:    fmul.d fa4, fa0, fa11081; CHECK-NEXT:    fmadd.d fa5, fa5, fa2, fa41082; CHECK-NEXT:    fsub.d fa0, fa5, fa41083; CHECK-NEXT:    ret1084; CHECK-NEXT:  .LBB76_2:1085; CHECK-NEXT:    fmul.d fa0, fa5, fa21086; CHECK-NEXT:    ret1087entry:1088  %sub = fsub contract double %a0, %a11089  %mul = fmul contract double %sub, %a21090  %and = and i64 %flag, 11091  %tobool.not = icmp eq i64 %and, 01092  %mul2 = fmul contract double %a0, %a11093  %add = fadd contract double %mul2, %mul1094  %sub3 = fsub contract double %add, %mul21095  %retval.0 = select i1 %tobool.not, double %mul, double %sub31096  ret double %retval.01097}1098;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:1099; CHECK_GLOBAL: {{.*}}1100; CHECK_LOCAL: {{.*}}1101