brintos

brintos / llvm-project-archived public Read only

0
0
Text · 27.7 KiB · 3b2cab2 Raw
973 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2;; Test that (mul (add x, c1), c2) can be transformed to3;; (add (mul x, c2), c1*c2) if profitable.4 5; RUN: llc -mtriple=riscv32 -mattr=+m,+zba -verify-machineinstrs < %s \6; RUN:   | FileCheck -check-prefix=RV32IMB %s7; RUN: llc -mtriple=riscv64 -mattr=+m,+zba -verify-machineinstrs < %s \8; RUN:   | FileCheck -check-prefix=RV64IMB %s9 10define i32 @add_mul_combine_accept_a1(i32 %x) {11; RV32IMB-LABEL: add_mul_combine_accept_a1:12; RV32IMB:       # %bb.0:13; RV32IMB-NEXT:    sh1add a1, a0, a014; RV32IMB-NEXT:    slli a0, a0, 515; RV32IMB-NEXT:    sub a0, a0, a116; RV32IMB-NEXT:    addi a0, a0, 107317; RV32IMB-NEXT:    ret18;19; RV64IMB-LABEL: add_mul_combine_accept_a1:20; RV64IMB:       # %bb.0:21; RV64IMB-NEXT:    sh1add a1, a0, a022; RV64IMB-NEXT:    slli a0, a0, 523; RV64IMB-NEXT:    sub a0, a0, a124; RV64IMB-NEXT:    addiw a0, a0, 107325; RV64IMB-NEXT:    ret26  %tmp0 = add i32 %x, 3727  %tmp1 = mul i32 %tmp0, 2928  ret i32 %tmp129}30 31define signext i32 @add_mul_combine_accept_a2(i32 signext %x) {32; RV32IMB-LABEL: add_mul_combine_accept_a2:33; RV32IMB:       # %bb.0:34; RV32IMB-NEXT:    sh1add a1, a0, a035; RV32IMB-NEXT:    slli a0, a0, 536; RV32IMB-NEXT:    sub a0, a0, a137; RV32IMB-NEXT:    addi a0, a0, 107338; RV32IMB-NEXT:    ret39;40; RV64IMB-LABEL: add_mul_combine_accept_a2:41; RV64IMB:       # %bb.0:42; RV64IMB-NEXT:    sh1add a1, a0, a043; RV64IMB-NEXT:    slli a0, a0, 544; RV64IMB-NEXT:    sub a0, a0, a145; RV64IMB-NEXT:    addiw a0, a0, 107346; RV64IMB-NEXT:    ret47  %tmp0 = add i32 %x, 3748  %tmp1 = mul i32 %tmp0, 2949  ret i32 %tmp150}51 52define i64 @add_mul_combine_accept_a3(i64 %x) {53; RV32IMB-LABEL: add_mul_combine_accept_a3:54; RV32IMB:       # %bb.0:55; RV32IMB-NEXT:    li a2, 2956; RV32IMB-NEXT:    sh1add a3, a1, a157; RV32IMB-NEXT:    slli a1, a1, 558; RV32IMB-NEXT:    sub a1, a1, a359; RV32IMB-NEXT:    sh1add a3, a0, a060; RV32IMB-NEXT:    mulhu a2, a0, a261; RV32IMB-NEXT:    slli a0, a0, 562; RV32IMB-NEXT:    sub a3, a0, a363; RV32IMB-NEXT:    add a1, a2, a164; RV32IMB-NEXT:    addi a0, a3, 107365; RV32IMB-NEXT:    sltu a2, a0, a366; RV32IMB-NEXT:    add a1, a1, a267; RV32IMB-NEXT:    ret68;69; RV64IMB-LABEL: add_mul_combine_accept_a3:70; RV64IMB:       # %bb.0:71; RV64IMB-NEXT:    sh1add a1, a0, a072; RV64IMB-NEXT:    slli a0, a0, 573; RV64IMB-NEXT:    sub a0, a0, a174; RV64IMB-NEXT:    addi a0, a0, 107375; RV64IMB-NEXT:    ret76  %tmp0 = add i64 %x, 3777  %tmp1 = mul i64 %tmp0, 2978  ret i64 %tmp179}80 81define i32 @add_mul_combine_accept_b1(i32 %x) {82; RV32IMB-LABEL: add_mul_combine_accept_b1:83; RV32IMB:       # %bb.0:84; RV32IMB-NEXT:    sh3add a1, a0, a085; RV32IMB-NEXT:    slli a0, a0, 586; RV32IMB-NEXT:    sub a0, a0, a187; RV32IMB-NEXT:    lui a1, 5088; RV32IMB-NEXT:    addi a1, a1, 111989; RV32IMB-NEXT:    add a0, a0, a190; RV32IMB-NEXT:    ret91;92; RV64IMB-LABEL: add_mul_combine_accept_b1:93; RV64IMB:       # %bb.0:94; RV64IMB-NEXT:    sh3add a1, a0, a095; RV64IMB-NEXT:    slli a0, a0, 596; RV64IMB-NEXT:    sub a0, a0, a197; RV64IMB-NEXT:    lui a1, 5098; RV64IMB-NEXT:    addi a1, a1, 111999; RV64IMB-NEXT:    addw a0, a0, a1100; RV64IMB-NEXT:    ret101  %tmp0 = add i32 %x, 8953102  %tmp1 = mul i32 %tmp0, 23103  ret i32 %tmp1104}105 106define signext i32 @add_mul_combine_accept_b2(i32 signext %x) {107; RV32IMB-LABEL: add_mul_combine_accept_b2:108; RV32IMB:       # %bb.0:109; RV32IMB-NEXT:    sh3add a1, a0, a0110; RV32IMB-NEXT:    slli a0, a0, 5111; RV32IMB-NEXT:    sub a0, a0, a1112; RV32IMB-NEXT:    lui a1, 50113; RV32IMB-NEXT:    addi a1, a1, 1119114; RV32IMB-NEXT:    add a0, a0, a1115; RV32IMB-NEXT:    ret116;117; RV64IMB-LABEL: add_mul_combine_accept_b2:118; RV64IMB:       # %bb.0:119; RV64IMB-NEXT:    sh3add a1, a0, a0120; RV64IMB-NEXT:    slli a0, a0, 5121; RV64IMB-NEXT:    sub a0, a0, a1122; RV64IMB-NEXT:    lui a1, 50123; RV64IMB-NEXT:    addi a1, a1, 1119124; RV64IMB-NEXT:    addw a0, a0, a1125; RV64IMB-NEXT:    ret126  %tmp0 = add i32 %x, 8953127  %tmp1 = mul i32 %tmp0, 23128  ret i32 %tmp1129}130 131define i64 @add_mul_combine_accept_b3(i64 %x) {132; RV32IMB-LABEL: add_mul_combine_accept_b3:133; RV32IMB:       # %bb.0:134; RV32IMB-NEXT:    li a2, 23135; RV32IMB-NEXT:    sh3add a3, a1, a1136; RV32IMB-NEXT:    slli a1, a1, 5137; RV32IMB-NEXT:    sub a1, a1, a3138; RV32IMB-NEXT:    sh3add a3, a0, a0139; RV32IMB-NEXT:    mulhu a2, a0, a2140; RV32IMB-NEXT:    slli a0, a0, 5141; RV32IMB-NEXT:    sub a3, a0, a3142; RV32IMB-NEXT:    lui a0, 50143; RV32IMB-NEXT:    addi a0, a0, 1119144; RV32IMB-NEXT:    add a1, a2, a1145; RV32IMB-NEXT:    add a0, a3, a0146; RV32IMB-NEXT:    sltu a2, a0, a3147; RV32IMB-NEXT:    add a1, a1, a2148; RV32IMB-NEXT:    ret149;150; RV64IMB-LABEL: add_mul_combine_accept_b3:151; RV64IMB:       # %bb.0:152; RV64IMB-NEXT:    sh3add a1, a0, a0153; RV64IMB-NEXT:    slli a0, a0, 5154; RV64IMB-NEXT:    sub a0, a0, a1155; RV64IMB-NEXT:    lui a1, 50156; RV64IMB-NEXT:    addi a1, a1, 1119157; RV64IMB-NEXT:    add a0, a0, a1158; RV64IMB-NEXT:    ret159  %tmp0 = add i64 %x, 8953160  %tmp1 = mul i64 %tmp0, 23161  ret i64 %tmp1162}163 164define i32 @add_mul_combine_reject_a1(i32 %x) {165; RV32IMB-LABEL: add_mul_combine_reject_a1:166; RV32IMB:       # %bb.0:167; RV32IMB-NEXT:    addi a0, a0, 1971168; RV32IMB-NEXT:    sh1add a1, a0, a0169; RV32IMB-NEXT:    slli a0, a0, 5170; RV32IMB-NEXT:    sub a0, a0, a1171; RV32IMB-NEXT:    ret172;173; RV64IMB-LABEL: add_mul_combine_reject_a1:174; RV64IMB:       # %bb.0:175; RV64IMB-NEXT:    addi a0, a0, 1971176; RV64IMB-NEXT:    sh1add a1, a0, a0177; RV64IMB-NEXT:    slli a0, a0, 5178; RV64IMB-NEXT:    subw a0, a0, a1179; RV64IMB-NEXT:    ret180  %tmp0 = add i32 %x, 1971181  %tmp1 = mul i32 %tmp0, 29182  ret i32 %tmp1183}184 185define signext i32 @add_mul_combine_reject_a2(i32 signext %x) {186; RV32IMB-LABEL: add_mul_combine_reject_a2:187; RV32IMB:       # %bb.0:188; RV32IMB-NEXT:    addi a0, a0, 1971189; RV32IMB-NEXT:    sh1add a1, a0, a0190; RV32IMB-NEXT:    slli a0, a0, 5191; RV32IMB-NEXT:    sub a0, a0, a1192; RV32IMB-NEXT:    ret193;194; RV64IMB-LABEL: add_mul_combine_reject_a2:195; RV64IMB:       # %bb.0:196; RV64IMB-NEXT:    addi a0, a0, 1971197; RV64IMB-NEXT:    sh1add a1, a0, a0198; RV64IMB-NEXT:    slli a0, a0, 5199; RV64IMB-NEXT:    subw a0, a0, a1200; RV64IMB-NEXT:    ret201  %tmp0 = add i32 %x, 1971202  %tmp1 = mul i32 %tmp0, 29203  ret i32 %tmp1204}205 206define i64 @add_mul_combine_reject_a3(i64 %x) {207; RV32IMB-LABEL: add_mul_combine_reject_a3:208; RV32IMB:       # %bb.0:209; RV32IMB-NEXT:    li a2, 29210; RV32IMB-NEXT:    sh1add a3, a1, a1211; RV32IMB-NEXT:    slli a1, a1, 5212; RV32IMB-NEXT:    sub a1, a1, a3213; RV32IMB-NEXT:    sh1add a3, a0, a0214; RV32IMB-NEXT:    mulhu a2, a0, a2215; RV32IMB-NEXT:    slli a0, a0, 5216; RV32IMB-NEXT:    sub a3, a0, a3217; RV32IMB-NEXT:    lui a0, 14218; RV32IMB-NEXT:    addi a0, a0, -185219; RV32IMB-NEXT:    add a1, a2, a1220; RV32IMB-NEXT:    add a0, a3, a0221; RV32IMB-NEXT:    sltu a2, a0, a3222; RV32IMB-NEXT:    add a1, a1, a2223; RV32IMB-NEXT:    ret224;225; RV64IMB-LABEL: add_mul_combine_reject_a3:226; RV64IMB:       # %bb.0:227; RV64IMB-NEXT:    addi a0, a0, 1971228; RV64IMB-NEXT:    sh1add a1, a0, a0229; RV64IMB-NEXT:    slli a0, a0, 5230; RV64IMB-NEXT:    sub a0, a0, a1231; RV64IMB-NEXT:    ret232  %tmp0 = add i64 %x, 1971233  %tmp1 = mul i64 %tmp0, 29234  ret i64 %tmp1235}236 237define i32 @add_mul_combine_reject_c1(i32 %x) {238; RV32IMB-LABEL: add_mul_combine_reject_c1:239; RV32IMB:       # %bb.0:240; RV32IMB-NEXT:    addi a0, a0, 1000241; RV32IMB-NEXT:    sh3add a1, a0, a0242; RV32IMB-NEXT:    sh3add a0, a1, a0243; RV32IMB-NEXT:    ret244;245; RV64IMB-LABEL: add_mul_combine_reject_c1:246; RV64IMB:       # %bb.0:247; RV64IMB-NEXT:    addi a0, a0, 1000248; RV64IMB-NEXT:    sh3add a1, a0, a0249; RV64IMB-NEXT:    sh3add a0, a1, a0250; RV64IMB-NEXT:    sext.w a0, a0251; RV64IMB-NEXT:    ret252  %tmp0 = add i32 %x, 1000253  %tmp1 = mul i32 %tmp0, 73254  ret i32 %tmp1255}256 257define signext i32 @add_mul_combine_reject_c2(i32 signext %x) {258; RV32IMB-LABEL: add_mul_combine_reject_c2:259; RV32IMB:       # %bb.0:260; RV32IMB-NEXT:    addi a0, a0, 1000261; RV32IMB-NEXT:    sh3add a1, a0, a0262; RV32IMB-NEXT:    sh3add a0, a1, a0263; RV32IMB-NEXT:    ret264;265; RV64IMB-LABEL: add_mul_combine_reject_c2:266; RV64IMB:       # %bb.0:267; RV64IMB-NEXT:    addi a0, a0, 1000268; RV64IMB-NEXT:    sh3add a1, a0, a0269; RV64IMB-NEXT:    sh3add a0, a1, a0270; RV64IMB-NEXT:    sext.w a0, a0271; RV64IMB-NEXT:    ret272  %tmp0 = add i32 %x, 1000273  %tmp1 = mul i32 %tmp0, 73274  ret i32 %tmp1275}276 277define i64 @add_mul_combine_reject_c3(i64 %x) {278; RV32IMB-LABEL: add_mul_combine_reject_c3:279; RV32IMB:       # %bb.0:280; RV32IMB-NEXT:    li a2, 73281; RV32IMB-NEXT:    sh3add a3, a1, a1282; RV32IMB-NEXT:    sh3add a1, a3, a1283; RV32IMB-NEXT:    sh3add a3, a0, a0284; RV32IMB-NEXT:    mulhu a2, a0, a2285; RV32IMB-NEXT:    sh3add a3, a3, a0286; RV32IMB-NEXT:    lui a0, 18287; RV32IMB-NEXT:    addi a0, a0, -728288; RV32IMB-NEXT:    add a1, a2, a1289; RV32IMB-NEXT:    add a0, a3, a0290; RV32IMB-NEXT:    sltu a2, a0, a3291; RV32IMB-NEXT:    add a1, a1, a2292; RV32IMB-NEXT:    ret293;294; RV64IMB-LABEL: add_mul_combine_reject_c3:295; RV64IMB:       # %bb.0:296; RV64IMB-NEXT:    addi a0, a0, 1000297; RV64IMB-NEXT:    sh3add a1, a0, a0298; RV64IMB-NEXT:    sh3add a0, a1, a0299; RV64IMB-NEXT:    ret300  %tmp0 = add i64 %x, 1000301  %tmp1 = mul i64 %tmp0, 73302  ret i64 %tmp1303}304 305define i32 @add_mul_combine_reject_d1(i32 %x) {306; RV32IMB-LABEL: add_mul_combine_reject_d1:307; RV32IMB:       # %bb.0:308; RV32IMB-NEXT:    addi a0, a0, 1000309; RV32IMB-NEXT:    sh1add a0, a0, a0310; RV32IMB-NEXT:    slli a0, a0, 6311; RV32IMB-NEXT:    ret312;313; RV64IMB-LABEL: add_mul_combine_reject_d1:314; RV64IMB:       # %bb.0:315; RV64IMB-NEXT:    addi a0, a0, 1000316; RV64IMB-NEXT:    sh1add a0, a0, a0317; RV64IMB-NEXT:    slliw a0, a0, 6318; RV64IMB-NEXT:    ret319  %tmp0 = add i32 %x, 1000320  %tmp1 = mul i32 %tmp0, 192321  ret i32 %tmp1322}323 324define signext i32 @add_mul_combine_reject_d2(i32 signext %x) {325; RV32IMB-LABEL: add_mul_combine_reject_d2:326; RV32IMB:       # %bb.0:327; RV32IMB-NEXT:    addi a0, a0, 1000328; RV32IMB-NEXT:    sh1add a0, a0, a0329; RV32IMB-NEXT:    slli a0, a0, 6330; RV32IMB-NEXT:    ret331;332; RV64IMB-LABEL: add_mul_combine_reject_d2:333; RV64IMB:       # %bb.0:334; RV64IMB-NEXT:    addi a0, a0, 1000335; RV64IMB-NEXT:    sh1add a0, a0, a0336; RV64IMB-NEXT:    slliw a0, a0, 6337; RV64IMB-NEXT:    ret338  %tmp0 = add i32 %x, 1000339  %tmp1 = mul i32 %tmp0, 192340  ret i32 %tmp1341}342 343define i64 @add_mul_combine_reject_d3(i64 %x) {344; RV32IMB-LABEL: add_mul_combine_reject_d3:345; RV32IMB:       # %bb.0:346; RV32IMB-NEXT:    li a2, 192347; RV32IMB-NEXT:    sh1add a1, a1, a1348; RV32IMB-NEXT:    mulhu a2, a0, a2349; RV32IMB-NEXT:    sh1add a0, a0, a0350; RV32IMB-NEXT:    slli a1, a1, 6351; RV32IMB-NEXT:    add a1, a2, a1352; RV32IMB-NEXT:    lui a2, 47353; RV32IMB-NEXT:    slli a3, a0, 6354; RV32IMB-NEXT:    addi a0, a2, -512355; RV32IMB-NEXT:    add a0, a3, a0356; RV32IMB-NEXT:    sltu a2, a0, a3357; RV32IMB-NEXT:    add a1, a1, a2358; RV32IMB-NEXT:    ret359;360; RV64IMB-LABEL: add_mul_combine_reject_d3:361; RV64IMB:       # %bb.0:362; RV64IMB-NEXT:    addi a0, a0, 1000363; RV64IMB-NEXT:    sh1add a0, a0, a0364; RV64IMB-NEXT:    slli a0, a0, 6365; RV64IMB-NEXT:    ret366  %tmp0 = add i64 %x, 1000367  %tmp1 = mul i64 %tmp0, 192368  ret i64 %tmp1369}370 371define i32 @add_mul_combine_reject_e1(i32 %x) {372; RV32IMB-LABEL: add_mul_combine_reject_e1:373; RV32IMB:       # %bb.0:374; RV32IMB-NEXT:    addi a0, a0, 1971375; RV32IMB-NEXT:    sh1add a1, a0, a0376; RV32IMB-NEXT:    slli a0, a0, 5377; RV32IMB-NEXT:    sub a0, a0, a1378; RV32IMB-NEXT:    ret379;380; RV64IMB-LABEL: add_mul_combine_reject_e1:381; RV64IMB:       # %bb.0:382; RV64IMB-NEXT:    addi a0, a0, 1971383; RV64IMB-NEXT:    sh1add a1, a0, a0384; RV64IMB-NEXT:    slli a0, a0, 5385; RV64IMB-NEXT:    subw a0, a0, a1386; RV64IMB-NEXT:    ret387  %tmp0 = mul i32 %x, 29388  %tmp1 = add i32 %tmp0, 57159389  ret i32 %tmp1390}391 392define signext i32 @add_mul_combine_reject_e2(i32 signext %x) {393; RV32IMB-LABEL: add_mul_combine_reject_e2:394; RV32IMB:       # %bb.0:395; RV32IMB-NEXT:    addi a0, a0, 1971396; RV32IMB-NEXT:    sh1add a1, a0, a0397; RV32IMB-NEXT:    slli a0, a0, 5398; RV32IMB-NEXT:    sub a0, a0, a1399; RV32IMB-NEXT:    ret400;401; RV64IMB-LABEL: add_mul_combine_reject_e2:402; RV64IMB:       # %bb.0:403; RV64IMB-NEXT:    addi a0, a0, 1971404; RV64IMB-NEXT:    sh1add a1, a0, a0405; RV64IMB-NEXT:    slli a0, a0, 5406; RV64IMB-NEXT:    subw a0, a0, a1407; RV64IMB-NEXT:    ret408  %tmp0 = mul i32 %x, 29409  %tmp1 = add i32 %tmp0, 57159410  ret i32 %tmp1411}412 413define i64 @add_mul_combine_reject_e3(i64 %x) {414; RV32IMB-LABEL: add_mul_combine_reject_e3:415; RV32IMB:       # %bb.0:416; RV32IMB-NEXT:    li a2, 29417; RV32IMB-NEXT:    sh1add a3, a1, a1418; RV32IMB-NEXT:    slli a1, a1, 5419; RV32IMB-NEXT:    sub a1, a1, a3420; RV32IMB-NEXT:    sh1add a3, a0, a0421; RV32IMB-NEXT:    mulhu a2, a0, a2422; RV32IMB-NEXT:    slli a0, a0, 5423; RV32IMB-NEXT:    sub a3, a0, a3424; RV32IMB-NEXT:    lui a0, 14425; RV32IMB-NEXT:    addi a0, a0, -185426; RV32IMB-NEXT:    add a1, a2, a1427; RV32IMB-NEXT:    add a0, a3, a0428; RV32IMB-NEXT:    sltu a2, a0, a3429; RV32IMB-NEXT:    add a1, a1, a2430; RV32IMB-NEXT:    ret431;432; RV64IMB-LABEL: add_mul_combine_reject_e3:433; RV64IMB:       # %bb.0:434; RV64IMB-NEXT:    addi a0, a0, 1971435; RV64IMB-NEXT:    sh1add a1, a0, a0436; RV64IMB-NEXT:    slli a0, a0, 5437; RV64IMB-NEXT:    sub a0, a0, a1438; RV64IMB-NEXT:    ret439  %tmp0 = mul i64 %x, 29440  %tmp1 = add i64 %tmp0, 57159441  ret i64 %tmp1442}443 444define i32 @add_mul_combine_reject_f1(i32 %x) {445; RV32IMB-LABEL: add_mul_combine_reject_f1:446; RV32IMB:       # %bb.0:447; RV32IMB-NEXT:    addi a0, a0, 1972448; RV32IMB-NEXT:    sh1add a1, a0, a0449; RV32IMB-NEXT:    slli a0, a0, 5450; RV32IMB-NEXT:    sub a0, a0, a1451; RV32IMB-NEXT:    addi a0, a0, 11452; RV32IMB-NEXT:    ret453;454; RV64IMB-LABEL: add_mul_combine_reject_f1:455; RV64IMB:       # %bb.0:456; RV64IMB-NEXT:    addi a0, a0, 1972457; RV64IMB-NEXT:    sh1add a1, a0, a0458; RV64IMB-NEXT:    slli a0, a0, 5459; RV64IMB-NEXT:    sub a0, a0, a1460; RV64IMB-NEXT:    addiw a0, a0, 11461; RV64IMB-NEXT:    ret462  %tmp0 = mul i32 %x, 29463  %tmp1 = add i32 %tmp0, 57199464  ret i32 %tmp1465}466 467define signext i32 @add_mul_combine_reject_f2(i32 signext %x) {468; RV32IMB-LABEL: add_mul_combine_reject_f2:469; RV32IMB:       # %bb.0:470; RV32IMB-NEXT:    addi a0, a0, 1972471; RV32IMB-NEXT:    sh1add a1, a0, a0472; RV32IMB-NEXT:    slli a0, a0, 5473; RV32IMB-NEXT:    sub a0, a0, a1474; RV32IMB-NEXT:    addi a0, a0, 11475; RV32IMB-NEXT:    ret476;477; RV64IMB-LABEL: add_mul_combine_reject_f2:478; RV64IMB:       # %bb.0:479; RV64IMB-NEXT:    addi a0, a0, 1972480; RV64IMB-NEXT:    sh1add a1, a0, a0481; RV64IMB-NEXT:    slli a0, a0, 5482; RV64IMB-NEXT:    sub a0, a0, a1483; RV64IMB-NEXT:    addiw a0, a0, 11484; RV64IMB-NEXT:    ret485  %tmp0 = mul i32 %x, 29486  %tmp1 = add i32 %tmp0, 57199487  ret i32 %tmp1488}489 490define i64 @add_mul_combine_reject_f3(i64 %x) {491; RV32IMB-LABEL: add_mul_combine_reject_f3:492; RV32IMB:       # %bb.0:493; RV32IMB-NEXT:    li a2, 29494; RV32IMB-NEXT:    sh1add a3, a1, a1495; RV32IMB-NEXT:    slli a1, a1, 5496; RV32IMB-NEXT:    sub a1, a1, a3497; RV32IMB-NEXT:    sh1add a3, a0, a0498; RV32IMB-NEXT:    mulhu a2, a0, a2499; RV32IMB-NEXT:    slli a0, a0, 5500; RV32IMB-NEXT:    sub a3, a0, a3501; RV32IMB-NEXT:    lui a0, 14502; RV32IMB-NEXT:    addi a0, a0, -145503; RV32IMB-NEXT:    add a1, a2, a1504; RV32IMB-NEXT:    add a0, a3, a0505; RV32IMB-NEXT:    sltu a2, a0, a3506; RV32IMB-NEXT:    add a1, a1, a2507; RV32IMB-NEXT:    ret508;509; RV64IMB-LABEL: add_mul_combine_reject_f3:510; RV64IMB:       # %bb.0:511; RV64IMB-NEXT:    addi a0, a0, 1972512; RV64IMB-NEXT:    sh1add a1, a0, a0513; RV64IMB-NEXT:    slli a0, a0, 5514; RV64IMB-NEXT:    sub a0, a0, a1515; RV64IMB-NEXT:    addi a0, a0, 11516; RV64IMB-NEXT:    ret517  %tmp0 = mul i64 %x, 29518  %tmp1 = add i64 %tmp0, 57199519  ret i64 %tmp1520}521 522define i32 @add_mul_combine_reject_g1(i32 %x) {523; RV32IMB-LABEL: add_mul_combine_reject_g1:524; RV32IMB:       # %bb.0:525; RV32IMB-NEXT:    addi a0, a0, 100526; RV32IMB-NEXT:    sh3add a1, a0, a0527; RV32IMB-NEXT:    sh3add a0, a1, a0528; RV32IMB-NEXT:    addi a0, a0, 10529; RV32IMB-NEXT:    ret530;531; RV64IMB-LABEL: add_mul_combine_reject_g1:532; RV64IMB:       # %bb.0:533; RV64IMB-NEXT:    addi a0, a0, 100534; RV64IMB-NEXT:    sh3add a1, a0, a0535; RV64IMB-NEXT:    sh3add a0, a1, a0536; RV64IMB-NEXT:    addiw a0, a0, 10537; RV64IMB-NEXT:    ret538  %tmp0 = mul i32 %x, 73539  %tmp1 = add i32 %tmp0, 7310540  ret i32 %tmp1541}542 543define signext i32 @add_mul_combine_reject_g2(i32 signext %x) {544; RV32IMB-LABEL: add_mul_combine_reject_g2:545; RV32IMB:       # %bb.0:546; RV32IMB-NEXT:    addi a0, a0, 100547; RV32IMB-NEXT:    sh3add a1, a0, a0548; RV32IMB-NEXT:    sh3add a0, a1, a0549; RV32IMB-NEXT:    addi a0, a0, 10550; RV32IMB-NEXT:    ret551;552; RV64IMB-LABEL: add_mul_combine_reject_g2:553; RV64IMB:       # %bb.0:554; RV64IMB-NEXT:    addi a0, a0, 100555; RV64IMB-NEXT:    sh3add a1, a0, a0556; RV64IMB-NEXT:    sh3add a0, a1, a0557; RV64IMB-NEXT:    addiw a0, a0, 10558; RV64IMB-NEXT:    ret559  %tmp0 = mul i32 %x, 73560  %tmp1 = add i32 %tmp0, 7310561  ret i32 %tmp1562}563 564define i64 @add_mul_combine_reject_g3(i64 %x) {565; RV32IMB-LABEL: add_mul_combine_reject_g3:566; RV32IMB:       # %bb.0:567; RV32IMB-NEXT:    li a2, 73568; RV32IMB-NEXT:    sh3add a3, a1, a1569; RV32IMB-NEXT:    sh3add a1, a3, a1570; RV32IMB-NEXT:    sh3add a3, a0, a0571; RV32IMB-NEXT:    mulhu a2, a0, a2572; RV32IMB-NEXT:    sh3add a3, a3, a0573; RV32IMB-NEXT:    lui a0, 2574; RV32IMB-NEXT:    addi a0, a0, -882575; RV32IMB-NEXT:    add a1, a2, a1576; RV32IMB-NEXT:    add a0, a3, a0577; RV32IMB-NEXT:    sltu a2, a0, a3578; RV32IMB-NEXT:    add a1, a1, a2579; RV32IMB-NEXT:    ret580;581; RV64IMB-LABEL: add_mul_combine_reject_g3:582; RV64IMB:       # %bb.0:583; RV64IMB-NEXT:    addi a0, a0, 100584; RV64IMB-NEXT:    sh3add a1, a0, a0585; RV64IMB-NEXT:    sh3add a0, a1, a0586; RV64IMB-NEXT:    addi a0, a0, 10587; RV64IMB-NEXT:    ret588  %tmp0 = mul i64 %x, 73589  %tmp1 = add i64 %tmp0, 7310590  ret i64 %tmp1591}592 593; This test previously infinite looped in DAG combine.594define i64 @add_mul_combine_infinite_loop(i64 %x) {595; RV32IMB-LABEL: add_mul_combine_infinite_loop:596; RV32IMB:       # %bb.0:597; RV32IMB-NEXT:    li a2, 24598; RV32IMB-NEXT:    sh1add a1, a1, a1599; RV32IMB-NEXT:    sh1add a3, a0, a0600; RV32IMB-NEXT:    mulhu a0, a0, a2601; RV32IMB-NEXT:    li a2, 1602; RV32IMB-NEXT:    sh3add a1, a1, a0603; RV32IMB-NEXT:    slli a4, a3, 3604; RV32IMB-NEXT:    slli a2, a2, 11605; RV32IMB-NEXT:    sh3add a0, a3, a2606; RV32IMB-NEXT:    sltu a2, a0, a4607; RV32IMB-NEXT:    add a1, a1, a2608; RV32IMB-NEXT:    ret609;610; RV64IMB-LABEL: add_mul_combine_infinite_loop:611; RV64IMB:       # %bb.0:612; RV64IMB-NEXT:    addi a0, a0, 86613; RV64IMB-NEXT:    sh1add a0, a0, a0614; RV64IMB-NEXT:    slli a0, a0, 3615; RV64IMB-NEXT:    addi a0, a0, -16616; RV64IMB-NEXT:    ret617  %tmp0 = mul i64 %x, 24618  %tmp1 = add i64 %tmp0, 2048619  ret i64 %tmp1620}621 622define i32 @mul3000_add8990_a(i32 %x) {623; RV32IMB-LABEL: mul3000_add8990_a:624; RV32IMB:       # %bb.0:625; RV32IMB-NEXT:    addi a0, a0, 3626; RV32IMB-NEXT:    lui a1, 1627; RV32IMB-NEXT:    addi a1, a1, -1096628; RV32IMB-NEXT:    mul a0, a0, a1629; RV32IMB-NEXT:    addi a0, a0, -10630; RV32IMB-NEXT:    ret631;632; RV64IMB-LABEL: mul3000_add8990_a:633; RV64IMB:       # %bb.0:634; RV64IMB-NEXT:    addi a0, a0, 3635; RV64IMB-NEXT:    lui a1, 1636; RV64IMB-NEXT:    addi a1, a1, -1096637; RV64IMB-NEXT:    mul a0, a0, a1638; RV64IMB-NEXT:    addiw a0, a0, -10639; RV64IMB-NEXT:    ret640  %tmp0 = mul i32 %x, 3000641  %tmp1 = add i32 %tmp0, 8990642  ret i32 %tmp1643}644 645define signext i32 @mul3000_add8990_b(i32 signext %x) {646; RV32IMB-LABEL: mul3000_add8990_b:647; RV32IMB:       # %bb.0:648; RV32IMB-NEXT:    addi a0, a0, 3649; RV32IMB-NEXT:    lui a1, 1650; RV32IMB-NEXT:    addi a1, a1, -1096651; RV32IMB-NEXT:    mul a0, a0, a1652; RV32IMB-NEXT:    addi a0, a0, -10653; RV32IMB-NEXT:    ret654;655; RV64IMB-LABEL: mul3000_add8990_b:656; RV64IMB:       # %bb.0:657; RV64IMB-NEXT:    addi a0, a0, 3658; RV64IMB-NEXT:    lui a1, 1659; RV64IMB-NEXT:    addi a1, a1, -1096660; RV64IMB-NEXT:    mul a0, a0, a1661; RV64IMB-NEXT:    addiw a0, a0, -10662; RV64IMB-NEXT:    ret663  %tmp0 = mul i32 %x, 3000664  %tmp1 = add i32 %tmp0, 8990665  ret i32 %tmp1666}667 668define i64 @mul3000_add8990_c(i64 %x) {669; RV32IMB-LABEL: mul3000_add8990_c:670; RV32IMB:       # %bb.0:671; RV32IMB-NEXT:    lui a2, 1672; RV32IMB-NEXT:    addi a2, a2, -1096673; RV32IMB-NEXT:    mul a1, a1, a2674; RV32IMB-NEXT:    mulhu a3, a0, a2675; RV32IMB-NEXT:    mul a2, a0, a2676; RV32IMB-NEXT:    lui a0, 2677; RV32IMB-NEXT:    addi a0, a0, 798678; RV32IMB-NEXT:    add a1, a3, a1679; RV32IMB-NEXT:    add a0, a2, a0680; RV32IMB-NEXT:    sltu a2, a0, a2681; RV32IMB-NEXT:    add a1, a1, a2682; RV32IMB-NEXT:    ret683;684; RV64IMB-LABEL: mul3000_add8990_c:685; RV64IMB:       # %bb.0:686; RV64IMB-NEXT:    addi a0, a0, 3687; RV64IMB-NEXT:    lui a1, 1688; RV64IMB-NEXT:    addi a1, a1, -1096689; RV64IMB-NEXT:    mul a0, a0, a1690; RV64IMB-NEXT:    addi a0, a0, -10691; RV64IMB-NEXT:    ret692  %tmp0 = mul i64 %x, 3000693  %tmp1 = add i64 %tmp0, 8990694  ret i64 %tmp1695}696 697define i32 @mul3000_sub8990_a(i32 %x) {698; RV32IMB-LABEL: mul3000_sub8990_a:699; RV32IMB:       # %bb.0:700; RV32IMB-NEXT:    addi a0, a0, -3701; RV32IMB-NEXT:    lui a1, 1702; RV32IMB-NEXT:    addi a1, a1, -1096703; RV32IMB-NEXT:    mul a0, a0, a1704; RV32IMB-NEXT:    addi a0, a0, 10705; RV32IMB-NEXT:    ret706;707; RV64IMB-LABEL: mul3000_sub8990_a:708; RV64IMB:       # %bb.0:709; RV64IMB-NEXT:    addi a0, a0, -3710; RV64IMB-NEXT:    lui a1, 1711; RV64IMB-NEXT:    addi a1, a1, -1096712; RV64IMB-NEXT:    mul a0, a0, a1713; RV64IMB-NEXT:    addiw a0, a0, 10714; RV64IMB-NEXT:    ret715  %tmp0 = mul i32 %x, 3000716  %tmp1 = add i32 %tmp0, -8990717  ret i32 %tmp1718}719 720define signext i32 @mul3000_sub8990_b(i32 signext %x) {721; RV32IMB-LABEL: mul3000_sub8990_b:722; RV32IMB:       # %bb.0:723; RV32IMB-NEXT:    addi a0, a0, -3724; RV32IMB-NEXT:    lui a1, 1725; RV32IMB-NEXT:    addi a1, a1, -1096726; RV32IMB-NEXT:    mul a0, a0, a1727; RV32IMB-NEXT:    addi a0, a0, 10728; RV32IMB-NEXT:    ret729;730; RV64IMB-LABEL: mul3000_sub8990_b:731; RV64IMB:       # %bb.0:732; RV64IMB-NEXT:    addi a0, a0, -3733; RV64IMB-NEXT:    lui a1, 1734; RV64IMB-NEXT:    addi a1, a1, -1096735; RV64IMB-NEXT:    mul a0, a0, a1736; RV64IMB-NEXT:    addiw a0, a0, 10737; RV64IMB-NEXT:    ret738  %tmp0 = mul i32 %x, 3000739  %tmp1 = add i32 %tmp0, -8990740  ret i32 %tmp1741}742 743define i64 @mul3000_sub8990_c(i64 %x) {744; RV32IMB-LABEL: mul3000_sub8990_c:745; RV32IMB:       # %bb.0:746; RV32IMB-NEXT:    lui a2, 1747; RV32IMB-NEXT:    addi a2, a2, -1096748; RV32IMB-NEXT:    mul a1, a1, a2749; RV32IMB-NEXT:    mulhu a3, a0, a2750; RV32IMB-NEXT:    mul a2, a0, a2751; RV32IMB-NEXT:    lui a0, 1048574752; RV32IMB-NEXT:    addi a0, a0, -798753; RV32IMB-NEXT:    add a1, a3, a1754; RV32IMB-NEXT:    add a0, a2, a0755; RV32IMB-NEXT:    sltu a2, a0, a2756; RV32IMB-NEXT:    add a1, a1, a2757; RV32IMB-NEXT:    addi a1, a1, -1758; RV32IMB-NEXT:    ret759;760; RV64IMB-LABEL: mul3000_sub8990_c:761; RV64IMB:       # %bb.0:762; RV64IMB-NEXT:    addi a0, a0, -3763; RV64IMB-NEXT:    lui a1, 1764; RV64IMB-NEXT:    addi a1, a1, -1096765; RV64IMB-NEXT:    mul a0, a0, a1766; RV64IMB-NEXT:    addi a0, a0, 10767; RV64IMB-NEXT:    ret768  %tmp0 = mul i64 %x, 3000769  %tmp1 = add i64 %tmp0, -8990770  ret i64 %tmp1771}772 773define i32 @mulneg3000_add8990_a(i32 %x) {774; RV32IMB-LABEL: mulneg3000_add8990_a:775; RV32IMB:       # %bb.0:776; RV32IMB-NEXT:    addi a0, a0, -3777; RV32IMB-NEXT:    lui a1, 1048575778; RV32IMB-NEXT:    addi a1, a1, 1096779; RV32IMB-NEXT:    mul a0, a0, a1780; RV32IMB-NEXT:    addi a0, a0, -10781; RV32IMB-NEXT:    ret782;783; RV64IMB-LABEL: mulneg3000_add8990_a:784; RV64IMB:       # %bb.0:785; RV64IMB-NEXT:    addi a0, a0, -3786; RV64IMB-NEXT:    lui a1, 1048575787; RV64IMB-NEXT:    addi a1, a1, 1096788; RV64IMB-NEXT:    mul a0, a0, a1789; RV64IMB-NEXT:    addiw a0, a0, -10790; RV64IMB-NEXT:    ret791  %tmp0 = mul i32 %x, -3000792  %tmp1 = add i32 %tmp0, 8990793  ret i32 %tmp1794}795 796define signext i32 @mulneg3000_add8990_b(i32 signext %x) {797; RV32IMB-LABEL: mulneg3000_add8990_b:798; RV32IMB:       # %bb.0:799; RV32IMB-NEXT:    addi a0, a0, -3800; RV32IMB-NEXT:    lui a1, 1048575801; RV32IMB-NEXT:    addi a1, a1, 1096802; RV32IMB-NEXT:    mul a0, a0, a1803; RV32IMB-NEXT:    addi a0, a0, -10804; RV32IMB-NEXT:    ret805;806; RV64IMB-LABEL: mulneg3000_add8990_b:807; RV64IMB:       # %bb.0:808; RV64IMB-NEXT:    addi a0, a0, -3809; RV64IMB-NEXT:    lui a1, 1048575810; RV64IMB-NEXT:    addi a1, a1, 1096811; RV64IMB-NEXT:    mul a0, a0, a1812; RV64IMB-NEXT:    addiw a0, a0, -10813; RV64IMB-NEXT:    ret814  %tmp0 = mul i32 %x, -3000815  %tmp1 = add i32 %tmp0, 8990816  ret i32 %tmp1817}818 819define i64 @mulneg3000_add8990_c(i64 %x) {820; RV32IMB-LABEL: mulneg3000_add8990_c:821; RV32IMB:       # %bb.0:822; RV32IMB-NEXT:    lui a2, 1048575823; RV32IMB-NEXT:    addi a2, a2, 1096824; RV32IMB-NEXT:    mul a1, a1, a2825; RV32IMB-NEXT:    mulhu a3, a0, a2826; RV32IMB-NEXT:    mul a2, a0, a2827; RV32IMB-NEXT:    sub a3, a3, a0828; RV32IMB-NEXT:    lui a0, 2829; RV32IMB-NEXT:    addi a0, a0, 798830; RV32IMB-NEXT:    add a0, a2, a0831; RV32IMB-NEXT:    add a1, a3, a1832; RV32IMB-NEXT:    sltu a2, a0, a2833; RV32IMB-NEXT:    add a1, a1, a2834; RV32IMB-NEXT:    ret835;836; RV64IMB-LABEL: mulneg3000_add8990_c:837; RV64IMB:       # %bb.0:838; RV64IMB-NEXT:    addi a0, a0, -3839; RV64IMB-NEXT:    lui a1, 1048575840; RV64IMB-NEXT:    addi a1, a1, 1096841; RV64IMB-NEXT:    mul a0, a0, a1842; RV64IMB-NEXT:    addi a0, a0, -10843; RV64IMB-NEXT:    ret844  %tmp0 = mul i64 %x, -3000845  %tmp1 = add i64 %tmp0, 8990846  ret i64 %tmp1847}848 849define i32 @mulneg3000_sub8990_a(i32 %x) {850; RV32IMB-LABEL: mulneg3000_sub8990_a:851; RV32IMB:       # %bb.0:852; RV32IMB-NEXT:    addi a0, a0, 3853; RV32IMB-NEXT:    lui a1, 1048575854; RV32IMB-NEXT:    addi a1, a1, 1096855; RV32IMB-NEXT:    mul a0, a0, a1856; RV32IMB-NEXT:    addi a0, a0, 10857; RV32IMB-NEXT:    ret858;859; RV64IMB-LABEL: mulneg3000_sub8990_a:860; RV64IMB:       # %bb.0:861; RV64IMB-NEXT:    addi a0, a0, 3862; RV64IMB-NEXT:    lui a1, 1048575863; RV64IMB-NEXT:    addi a1, a1, 1096864; RV64IMB-NEXT:    mul a0, a0, a1865; RV64IMB-NEXT:    addiw a0, a0, 10866; RV64IMB-NEXT:    ret867  %tmp0 = mul i32 %x, -3000868  %tmp1 = add i32 %tmp0, -8990869  ret i32 %tmp1870}871 872define signext i32 @mulneg3000_sub8990_b(i32 signext %x) {873; RV32IMB-LABEL: mulneg3000_sub8990_b:874; RV32IMB:       # %bb.0:875; RV32IMB-NEXT:    addi a0, a0, 3876; RV32IMB-NEXT:    lui a1, 1048575877; RV32IMB-NEXT:    addi a1, a1, 1096878; RV32IMB-NEXT:    mul a0, a0, a1879; RV32IMB-NEXT:    addi a0, a0, 10880; RV32IMB-NEXT:    ret881;882; RV64IMB-LABEL: mulneg3000_sub8990_b:883; RV64IMB:       # %bb.0:884; RV64IMB-NEXT:    addi a0, a0, 3885; RV64IMB-NEXT:    lui a1, 1048575886; RV64IMB-NEXT:    addi a1, a1, 1096887; RV64IMB-NEXT:    mul a0, a0, a1888; RV64IMB-NEXT:    addiw a0, a0, 10889; RV64IMB-NEXT:    ret890  %tmp0 = mul i32 %x, -3000891  %tmp1 = add i32 %tmp0, -8990892  ret i32 %tmp1893}894 895define i64 @mulneg3000_sub8990_c(i64 %x) {896; RV32IMB-LABEL: mulneg3000_sub8990_c:897; RV32IMB:       # %bb.0:898; RV32IMB-NEXT:    lui a2, 1048575899; RV32IMB-NEXT:    addi a2, a2, 1096900; RV32IMB-NEXT:    mul a1, a1, a2901; RV32IMB-NEXT:    mulhu a3, a0, a2902; RV32IMB-NEXT:    mul a2, a0, a2903; RV32IMB-NEXT:    sub a3, a3, a0904; RV32IMB-NEXT:    lui a0, 1048574905; RV32IMB-NEXT:    addi a0, a0, -798906; RV32IMB-NEXT:    add a0, a2, a0907; RV32IMB-NEXT:    add a1, a3, a1908; RV32IMB-NEXT:    sltu a2, a0, a2909; RV32IMB-NEXT:    add a1, a1, a2910; RV32IMB-NEXT:    addi a1, a1, -1911; RV32IMB-NEXT:    ret912;913; RV64IMB-LABEL: mulneg3000_sub8990_c:914; RV64IMB:       # %bb.0:915; RV64IMB-NEXT:    addi a0, a0, 3916; RV64IMB-NEXT:    lui a1, 1048575917; RV64IMB-NEXT:    addi a1, a1, 1096918; RV64IMB-NEXT:    mul a0, a0, a1919; RV64IMB-NEXT:    addi a0, a0, 10920; RV64IMB-NEXT:    ret921  %tmp0 = mul i64 %x, -3000922  %tmp1 = add i64 %tmp0, -8990923  ret i64 %tmp1924}925 926; This test case previously caused an infinite loop between transformations927; performed in RISCVISelLowering;:transformAddImmMulImm and928; DAGCombiner::visitMUL.929define i1 @pr53831(i32 %x) {930; RV32IMB-LABEL: pr53831:931; RV32IMB:       # %bb.0:932; RV32IMB-NEXT:    li a0, 0933; RV32IMB-NEXT:    ret934;935; RV64IMB-LABEL: pr53831:936; RV64IMB:       # %bb.0:937; RV64IMB-NEXT:    li a0, 0938; RV64IMB-NEXT:    ret939  %tmp0 = add i32 %x, 1940  %tmp1 = mul i32 %tmp0, 24941  %tmp2 = add i32 %tmp1, 1942  %tmp3 = mul i32 %x, 24943  %tmp4 = add i32 %tmp3, 2048944  %tmp5 = icmp eq i32 %tmp4, %tmp2945  ret i1 %tmp5946}947 948define i64 @sh2add_uw(i64 signext %0, i32 signext %1) {949; RV32IMB-LABEL: sh2add_uw:950; RV32IMB:       # %bb.0: # %entry951; RV32IMB-NEXT:    srli a3, a2, 27952; RV32IMB-NEXT:    slli a2, a2, 5953; RV32IMB-NEXT:    srli a4, a0, 29954; RV32IMB-NEXT:    sh3add a1, a1, a4955; RV32IMB-NEXT:    sh3add a0, a0, a2956; RV32IMB-NEXT:    sltu a2, a0, a2957; RV32IMB-NEXT:    add a1, a3, a1958; RV32IMB-NEXT:    add a1, a1, a2959; RV32IMB-NEXT:    ret960;961; RV64IMB-LABEL: sh2add_uw:962; RV64IMB:       # %bb.0: # %entry963; RV64IMB-NEXT:    sh2add.uw a0, a1, a0964; RV64IMB-NEXT:    slli a0, a0, 3965; RV64IMB-NEXT:    ret966entry:967  %2 = zext i32 %1 to i64968  %3 = shl i64 %2, 5969  %4 = shl i64 %0, 3970  %5 = add i64 %3, %4971  ret i64 %5972}973