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