1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2;; Test that (mul (add x, c1), c2) can be transformed to 3;; (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 %s 7; RUN: llc -mtriple=riscv64 -mattr=+m,+zba -verify-machineinstrs < %s \ 8; RUN: | FileCheck -check-prefix=RV64IMB %s 9 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, a0 14; RV32IMB-NEXT: slli a0, a0, 5 15; RV32IMB-NEXT: sub a0, a0, a1 16; RV32IMB-NEXT: addi a0, a0, 1073 17; RV32IMB-NEXT: ret 18; 19; RV64IMB-LABEL: add_mul_combine_accept_a1: 20; RV64IMB: # %bb.0: 21; RV64IMB-NEXT: sh1add a1, a0, a0 22; RV64IMB-NEXT: slli a0, a0, 5 23; RV64IMB-NEXT: subw a0, a0, a1 24; RV64IMB-NEXT: addiw a0, a0, 1073 25; RV64IMB-NEXT: ret 26 %tmp0 = add i32 %x, 37 27 %tmp1 = mul i32 %tmp0, 29 28 ret i32 %tmp1 29} 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, a0 35; RV32IMB-NEXT: slli a0, a0, 5 36; RV32IMB-NEXT: sub a0, a0, a1 37; RV32IMB-NEXT: addi a0, a0, 1073 38; RV32IMB-NEXT: ret 39; 40; RV64IMB-LABEL: add_mul_combine_accept_a2: 41; RV64IMB: # %bb.0: 42; RV64IMB-NEXT: sh1add a1, a0, a0 43; RV64IMB-NEXT: slli a0, a0, 5 44; RV64IMB-NEXT: subw a0, a0, a1 45; RV64IMB-NEXT: addiw a0, a0, 1073 46; RV64IMB-NEXT: ret 47 %tmp0 = add i32 %x, 37 48 %tmp1 = mul i32 %tmp0, 29 49 ret i32 %tmp1 50} 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, 29 56; RV32IMB-NEXT: sh1add a3, a1, a1 57; RV32IMB-NEXT: slli a1, a1, 5 58; RV32IMB-NEXT: sub a1, a1, a3 59; RV32IMB-NEXT: sh1add a3, a0, a0 60; RV32IMB-NEXT: mulhu a2, a0, a2 61; RV32IMB-NEXT: slli a0, a0, 5 62; RV32IMB-NEXT: sub a3, a0, a3 63; RV32IMB-NEXT: add a1, a2, a1 64; RV32IMB-NEXT: addi a0, a3, 1073 65; RV32IMB-NEXT: sltu a2, a0, a3 66; RV32IMB-NEXT: add a1, a1, a2 67; RV32IMB-NEXT: ret 68; 69; RV64IMB-LABEL: add_mul_combine_accept_a3: 70; RV64IMB: # %bb.0: 71; RV64IMB-NEXT: sh1add a1, a0, a0 72; RV64IMB-NEXT: slli a0, a0, 5 73; RV64IMB-NEXT: sub a0, a0, a1 74; RV64IMB-NEXT: addi a0, a0, 1073 75; RV64IMB-NEXT: ret 76 %tmp0 = add i64 %x, 37 77 %tmp1 = mul i64 %tmp0, 29 78 ret i64 %tmp1 79} 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, a0 85; RV32IMB-NEXT: slli a0, a0, 5 86; RV32IMB-NEXT: sub a0, a0, a1 87; RV32IMB-NEXT: lui a1, 50 88; RV32IMB-NEXT: addi a1, a1, 1119 89; RV32IMB-NEXT: add a0, a0, a1 90; RV32IMB-NEXT: ret 91; 92; RV64IMB-LABEL: add_mul_combine_accept_b1: 93; RV64IMB: # %bb.0: 94; RV64IMB-NEXT: sh3add a1, a0, a0 95; RV64IMB-NEXT: slli a0, a0, 5 96; RV64IMB-NEXT: subw a0, a0, a1 97; RV64IMB-NEXT: lui a1, 50 98; RV64IMB-NEXT: addi a1, a1, 1119 99; RV64IMB-NEXT: addw a0, a0, a1 100; RV64IMB-NEXT: ret 101 %tmp0 = add i32 %x, 8953 102 %tmp1 = mul i32 %tmp0, 23 103 ret i32 %tmp1 104} 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, a0 110; RV32IMB-NEXT: slli a0, a0, 5 111; RV32IMB-NEXT: sub a0, a0, a1 112; RV32IMB-NEXT: lui a1, 50 113; RV32IMB-NEXT: addi a1, a1, 1119 114; RV32IMB-NEXT: add a0, a0, a1 115; RV32IMB-NEXT: ret 116; 117; RV64IMB-LABEL: add_mul_combine_accept_b2: 118; RV64IMB: # %bb.0: 119; RV64IMB-NEXT: sh3add a1, a0, a0 120; RV64IMB-NEXT: slli a0, a0, 5 121; RV64IMB-NEXT: subw a0, a0, a1 122; RV64IMB-NEXT: lui a1, 50 123; RV64IMB-NEXT: addi a1, a1, 1119 124; RV64IMB-NEXT: addw a0, a0, a1 125; RV64IMB-NEXT: ret 126 %tmp0 = add i32 %x, 8953 127 %tmp1 = mul i32 %tmp0, 23 128 ret i32 %tmp1 129} 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, 23 135; RV32IMB-NEXT: sh3add a3, a1, a1 136; RV32IMB-NEXT: slli a1, a1, 5 137; RV32IMB-NEXT: sub a1, a1, a3 138; RV32IMB-NEXT: sh3add a3, a0, a0 139; RV32IMB-NEXT: mulhu a2, a0, a2 140; RV32IMB-NEXT: slli a0, a0, 5 141; RV32IMB-NEXT: sub a3, a0, a3 142; RV32IMB-NEXT: lui a0, 50 143; RV32IMB-NEXT: addi a0, a0, 1119 144; RV32IMB-NEXT: add a1, a2, a1 145; RV32IMB-NEXT: add a0, a3, a0 146; RV32IMB-NEXT: sltu a2, a0, a3 147; RV32IMB-NEXT: add a1, a1, a2 148; RV32IMB-NEXT: ret 149; 150; RV64IMB-LABEL: add_mul_combine_accept_b3: 151; RV64IMB: # %bb.0: 152; RV64IMB-NEXT: sh3add a1, a0, a0 153; RV64IMB-NEXT: slli a0, a0, 5 154; RV64IMB-NEXT: sub a0, a0, a1 155; RV64IMB-NEXT: lui a1, 50 156; RV64IMB-NEXT: addiw a1, a1, 1119 157; RV64IMB-NEXT: add a0, a0, a1 158; RV64IMB-NEXT: ret 159 %tmp0 = add i64 %x, 8953 160 %tmp1 = mul i64 %tmp0, 23 161 ret i64 %tmp1 162} 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, 1971 168; RV32IMB-NEXT: sh1add a1, a0, a0 169; RV32IMB-NEXT: slli a0, a0, 5 170; RV32IMB-NEXT: sub a0, a0, a1 171; RV32IMB-NEXT: ret 172; 173; RV64IMB-LABEL: add_mul_combine_reject_a1: 174; RV64IMB: # %bb.0: 175; RV64IMB-NEXT: addi a0, a0, 1971 176; RV64IMB-NEXT: sh1add a1, a0, a0 177; RV64IMB-NEXT: slli a0, a0, 5 178; RV64IMB-NEXT: subw a0, a0, a1 179; RV64IMB-NEXT: ret 180 %tmp0 = add i32 %x, 1971 181 %tmp1 = mul i32 %tmp0, 29 182 ret i32 %tmp1 183} 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, 1971 189; RV32IMB-NEXT: sh1add a1, a0, a0 190; RV32IMB-NEXT: slli a0, a0, 5 191; RV32IMB-NEXT: sub a0, a0, a1 192; RV32IMB-NEXT: ret 193; 194; RV64IMB-LABEL: add_mul_combine_reject_a2: 195; RV64IMB: # %bb.0: 196; RV64IMB-NEXT: addi a0, a0, 1971 197; RV64IMB-NEXT: sh1add a1, a0, a0 198; RV64IMB-NEXT: slli a0, a0, 5 199; RV64IMB-NEXT: subw a0, a0, a1 200; RV64IMB-NEXT: ret 201 %tmp0 = add i32 %x, 1971 202 %tmp1 = mul i32 %tmp0, 29 203 ret i32 %tmp1 204} 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, 29 210; RV32IMB-NEXT: sh1add a3, a1, a1 211; RV32IMB-NEXT: slli a1, a1, 5 212; RV32IMB-NEXT: sub a1, a1, a3 213; RV32IMB-NEXT: sh1add a3, a0, a0 214; RV32IMB-NEXT: mulhu a2, a0, a2 215; RV32IMB-NEXT: slli a0, a0, 5 216; RV32IMB-NEXT: sub a3, a0, a3 217; RV32IMB-NEXT: lui a0, 14 218; RV32IMB-NEXT: addi a0, a0, -185 219; RV32IMB-NEXT: add a1, a2, a1 220; RV32IMB-NEXT: add a0, a3, a0 221; RV32IMB-NEXT: sltu a2, a0, a3 222; RV32IMB-NEXT: add a1, a1, a2 223; RV32IMB-NEXT: ret 224; 225; RV64IMB-LABEL: add_mul_combine_reject_a3: 226; RV64IMB: # %bb.0: 227; RV64IMB-NEXT: addi a0, a0, 1971 228; RV64IMB-NEXT: sh1add a1, a0, a0 229; RV64IMB-NEXT: slli a0, a0, 5 230; RV64IMB-NEXT: sub a0, a0, a1 231; RV64IMB-NEXT: ret 232 %tmp0 = add i64 %x, 1971 233 %tmp1 = mul i64 %tmp0, 29 234 ret i64 %tmp1 235} 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, 1000 241; RV32IMB-NEXT: sh3add a1, a0, a0 242; RV32IMB-NEXT: sh3add a0, a1, a0 243; RV32IMB-NEXT: ret 244; 245; RV64IMB-LABEL: add_mul_combine_reject_c1: 246; RV64IMB: # %bb.0: 247; RV64IMB-NEXT: addi a0, a0, 1000 248; RV64IMB-NEXT: sh3add a1, a0, a0 249; RV64IMB-NEXT: sh3add a0, a1, a0 250; RV64IMB-NEXT: sext.w a0, a0 251; RV64IMB-NEXT: ret 252 %tmp0 = add i32 %x, 1000 253 %tmp1 = mul i32 %tmp0, 73 254 ret i32 %tmp1 255} 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, 1000 261; RV32IMB-NEXT: sh3add a1, a0, a0 262; RV32IMB-NEXT: sh3add a0, a1, a0 263; RV32IMB-NEXT: ret 264; 265; RV64IMB-LABEL: add_mul_combine_reject_c2: 266; RV64IMB: # %bb.0: 267; RV64IMB-NEXT: addi a0, a0, 1000 268; RV64IMB-NEXT: sh3add a1, a0, a0 269; RV64IMB-NEXT: sh3add a0, a1, a0 270; RV64IMB-NEXT: sext.w a0, a0 271; RV64IMB-NEXT: ret 272 %tmp0 = add i32 %x, 1000 273 %tmp1 = mul i32 %tmp0, 73 274 ret i32 %tmp1 275} 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, 73 281; RV32IMB-NEXT: sh3add a3, a1, a1 282; RV32IMB-NEXT: sh3add a1, a3, a1 283; RV32IMB-NEXT: sh3add a3, a0, a0 284; RV32IMB-NEXT: mulhu a2, a0, a2 285; RV32IMB-NEXT: sh3add a3, a3, a0 286; RV32IMB-NEXT: lui a0, 18 287; RV32IMB-NEXT: addi a0, a0, -728 288; RV32IMB-NEXT: add a1, a2, a1 289; RV32IMB-NEXT: add a0, a3, a0 290; RV32IMB-NEXT: sltu a2, a0, a3 291; RV32IMB-NEXT: add a1, a1, a2 292; RV32IMB-NEXT: ret 293; 294; RV64IMB-LABEL: add_mul_combine_reject_c3: 295; RV64IMB: # %bb.0: 296; RV64IMB-NEXT: addi a0, a0, 1000 297; RV64IMB-NEXT: sh3add a1, a0, a0 298; RV64IMB-NEXT: sh3add a0, a1, a0 299; RV64IMB-NEXT: ret 300 %tmp0 = add i64 %x, 1000 301 %tmp1 = mul i64 %tmp0, 73 302 ret i64 %tmp1 303} 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, 1000 309; RV32IMB-NEXT: sh1add a0, a0, a0 310; RV32IMB-NEXT: slli a0, a0, 6 311; RV32IMB-NEXT: ret 312; 313; RV64IMB-LABEL: add_mul_combine_reject_d1: 314; RV64IMB: # %bb.0: 315; RV64IMB-NEXT: addi a0, a0, 1000 316; RV64IMB-NEXT: sh1add a0, a0, a0 317; RV64IMB-NEXT: slliw a0, a0, 6 318; RV64IMB-NEXT: ret 319 %tmp0 = add i32 %x, 1000 320 %tmp1 = mul i32 %tmp0, 192 321 ret i32 %tmp1 322} 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, 1000 328; RV32IMB-NEXT: sh1add a0, a0, a0 329; RV32IMB-NEXT: slli a0, a0, 6 330; RV32IMB-NEXT: ret 331; 332; RV64IMB-LABEL: add_mul_combine_reject_d2: 333; RV64IMB: # %bb.0: 334; RV64IMB-NEXT: addi a0, a0, 1000 335; RV64IMB-NEXT: sh1add a0, a0, a0 336; RV64IMB-NEXT: slliw a0, a0, 6 337; RV64IMB-NEXT: ret 338 %tmp0 = add i32 %x, 1000 339 %tmp1 = mul i32 %tmp0, 192 340 ret i32 %tmp1 341} 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, 192 347; RV32IMB-NEXT: sh1add a1, a1, a1 348; RV32IMB-NEXT: mulhu a2, a0, a2 349; RV32IMB-NEXT: sh1add a0, a0, a0 350; RV32IMB-NEXT: slli a1, a1, 6 351; RV32IMB-NEXT: add a1, a2, a1 352; RV32IMB-NEXT: lui a2, 47 353; RV32IMB-NEXT: slli a3, a0, 6 354; RV32IMB-NEXT: addi a0, a2, -512 355; RV32IMB-NEXT: add a0, a3, a0 356; RV32IMB-NEXT: sltu a2, a0, a3 357; RV32IMB-NEXT: add a1, a1, a2 358; RV32IMB-NEXT: ret 359; 360; RV64IMB-LABEL: add_mul_combine_reject_d3: 361; RV64IMB: # %bb.0: 362; RV64IMB-NEXT: addi a0, a0, 1000 363; RV64IMB-NEXT: sh1add a0, a0, a0 364; RV64IMB-NEXT: slli a0, a0, 6 365; RV64IMB-NEXT: ret 366 %tmp0 = add i64 %x, 1000 367 %tmp1 = mul i64 %tmp0, 192 368 ret i64 %tmp1 369} 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, 1971 375; RV32IMB-NEXT: sh1add a1, a0, a0 376; RV32IMB-NEXT: slli a0, a0, 5 377; RV32IMB-NEXT: sub a0, a0, a1 378; RV32IMB-NEXT: ret 379; 380; RV64IMB-LABEL: add_mul_combine_reject_e1: 381; RV64IMB: # %bb.0: 382; RV64IMB-NEXT: addi a0, a0, 1971 383; RV64IMB-NEXT: sh1add a1, a0, a0 384; RV64IMB-NEXT: slli a0, a0, 5 385; RV64IMB-NEXT: subw a0, a0, a1 386; RV64IMB-NEXT: ret 387 %tmp0 = mul i32 %x, 29 388 %tmp1 = add i32 %tmp0, 57159 389 ret i32 %tmp1 390} 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, 1971 396; RV32IMB-NEXT: sh1add a1, a0, a0 397; RV32IMB-NEXT: slli a0, a0, 5 398; RV32IMB-NEXT: sub a0, a0, a1 399; RV32IMB-NEXT: ret 400; 401; RV64IMB-LABEL: add_mul_combine_reject_e2: 402; RV64IMB: # %bb.0: 403; RV64IMB-NEXT: addi a0, a0, 1971 404; RV64IMB-NEXT: sh1add a1, a0, a0 405; RV64IMB-NEXT: slli a0, a0, 5 406; RV64IMB-NEXT: subw a0, a0, a1 407; RV64IMB-NEXT: ret 408 %tmp0 = mul i32 %x, 29 409 %tmp1 = add i32 %tmp0, 57159 410 ret i32 %tmp1 411} 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, 29 417; RV32IMB-NEXT: sh1add a3, a1, a1 418; RV32IMB-NEXT: slli a1, a1, 5 419; RV32IMB-NEXT: sub a1, a1, a3 420; RV32IMB-NEXT: sh1add a3, a0, a0 421; RV32IMB-NEXT: mulhu a2, a0, a2 422; RV32IMB-NEXT: slli a0, a0, 5 423; RV32IMB-NEXT: sub a3, a0, a3 424; RV32IMB-NEXT: lui a0, 14 425; RV32IMB-NEXT: addi a0, a0, -185 426; RV32IMB-NEXT: add a1, a2, a1 427; RV32IMB-NEXT: add a0, a3, a0 428; RV32IMB-NEXT: sltu a2, a0, a3 429; RV32IMB-NEXT: add a1, a1, a2 430; RV32IMB-NEXT: ret 431; 432; RV64IMB-LABEL: add_mul_combine_reject_e3: 433; RV64IMB: # %bb.0: 434; RV64IMB-NEXT: addi a0, a0, 1971 435; RV64IMB-NEXT: sh1add a1, a0, a0 436; RV64IMB-NEXT: slli a0, a0, 5 437; RV64IMB-NEXT: sub a0, a0, a1 438; RV64IMB-NEXT: ret 439 %tmp0 = mul i64 %x, 29 440 %tmp1 = add i64 %tmp0, 57159 441 ret i64 %tmp1 442} 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, 1972 448; RV32IMB-NEXT: sh1add a1, a0, a0 449; RV32IMB-NEXT: slli a0, a0, 5 450; RV32IMB-NEXT: sub a0, a0, a1 451; RV32IMB-NEXT: addi a0, a0, 11 452; RV32IMB-NEXT: ret 453; 454; RV64IMB-LABEL: add_mul_combine_reject_f1: 455; RV64IMB: # %bb.0: 456; RV64IMB-NEXT: addi a0, a0, 1972 457; RV64IMB-NEXT: sh1add a1, a0, a0 458; RV64IMB-NEXT: slli a0, a0, 5 459; RV64IMB-NEXT: subw a0, a0, a1 460; RV64IMB-NEXT: addiw a0, a0, 11 461; RV64IMB-NEXT: ret 462 %tmp0 = mul i32 %x, 29 463 %tmp1 = add i32 %tmp0, 57199 464 ret i32 %tmp1 465} 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, 1972 471; RV32IMB-NEXT: sh1add a1, a0, a0 472; RV32IMB-NEXT: slli a0, a0, 5 473; RV32IMB-NEXT: sub a0, a0, a1 474; RV32IMB-NEXT: addi a0, a0, 11 475; RV32IMB-NEXT: ret 476; 477; RV64IMB-LABEL: add_mul_combine_reject_f2: 478; RV64IMB: # %bb.0: 479; RV64IMB-NEXT: addi a0, a0, 1972 480; RV64IMB-NEXT: sh1add a1, a0, a0 481; RV64IMB-NEXT: slli a0, a0, 5 482; RV64IMB-NEXT: subw a0, a0, a1 483; RV64IMB-NEXT: addiw a0, a0, 11 484; RV64IMB-NEXT: ret 485 %tmp0 = mul i32 %x, 29 486 %tmp1 = add i32 %tmp0, 57199 487 ret i32 %tmp1 488} 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, 29 494; RV32IMB-NEXT: sh1add a3, a1, a1 495; RV32IMB-NEXT: slli a1, a1, 5 496; RV32IMB-NEXT: sub a1, a1, a3 497; RV32IMB-NEXT: sh1add a3, a0, a0 498; RV32IMB-NEXT: mulhu a2, a0, a2 499; RV32IMB-NEXT: slli a0, a0, 5 500; RV32IMB-NEXT: sub a3, a0, a3 501; RV32IMB-NEXT: lui a0, 14 502; RV32IMB-NEXT: addi a0, a0, -145 503; RV32IMB-NEXT: add a1, a2, a1 504; RV32IMB-NEXT: add a0, a3, a0 505; RV32IMB-NEXT: sltu a2, a0, a3 506; RV32IMB-NEXT: add a1, a1, a2 507; RV32IMB-NEXT: ret 508; 509; RV64IMB-LABEL: add_mul_combine_reject_f3: 510; RV64IMB: # %bb.0: 511; RV64IMB-NEXT: addi a0, a0, 1972 512; RV64IMB-NEXT: sh1add a1, a0, a0 513; RV64IMB-NEXT: slli a0, a0, 5 514; RV64IMB-NEXT: sub a0, a0, a1 515; RV64IMB-NEXT: addi a0, a0, 11 516; RV64IMB-NEXT: ret 517 %tmp0 = mul i64 %x, 29 518 %tmp1 = add i64 %tmp0, 57199 519 ret i64 %tmp1 520} 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, 100 526; RV32IMB-NEXT: sh3add a1, a0, a0 527; RV32IMB-NEXT: sh3add a0, a1, a0 528; RV32IMB-NEXT: addi a0, a0, 10 529; RV32IMB-NEXT: ret 530; 531; RV64IMB-LABEL: add_mul_combine_reject_g1: 532; RV64IMB: # %bb.0: 533; RV64IMB-NEXT: addi a0, a0, 100 534; RV64IMB-NEXT: sh3add a1, a0, a0 535; RV64IMB-NEXT: sh3add a0, a1, a0 536; RV64IMB-NEXT: addiw a0, a0, 10 537; RV64IMB-NEXT: ret 538 %tmp0 = mul i32 %x, 73 539 %tmp1 = add i32 %tmp0, 7310 540 ret i32 %tmp1 541} 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, 100 547; RV32IMB-NEXT: sh3add a1, a0, a0 548; RV32IMB-NEXT: sh3add a0, a1, a0 549; RV32IMB-NEXT: addi a0, a0, 10 550; RV32IMB-NEXT: ret 551; 552; RV64IMB-LABEL: add_mul_combine_reject_g2: 553; RV64IMB: # %bb.0: 554; RV64IMB-NEXT: addi a0, a0, 100 555; RV64IMB-NEXT: sh3add a1, a0, a0 556; RV64IMB-NEXT: sh3add a0, a1, a0 557; RV64IMB-NEXT: addiw a0, a0, 10 558; RV64IMB-NEXT: ret 559 %tmp0 = mul i32 %x, 73 560 %tmp1 = add i32 %tmp0, 7310 561 ret i32 %tmp1 562} 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, 73 568; RV32IMB-NEXT: sh3add a3, a1, a1 569; RV32IMB-NEXT: sh3add a1, a3, a1 570; RV32IMB-NEXT: sh3add a3, a0, a0 571; RV32IMB-NEXT: mulhu a2, a0, a2 572; RV32IMB-NEXT: sh3add a3, a3, a0 573; RV32IMB-NEXT: lui a0, 2 574; RV32IMB-NEXT: addi a0, a0, -882 575; RV32IMB-NEXT: add a1, a2, a1 576; RV32IMB-NEXT: add a0, a3, a0 577; RV32IMB-NEXT: sltu a2, a0, a3 578; RV32IMB-NEXT: add a1, a1, a2 579; RV32IMB-NEXT: ret 580; 581; RV64IMB-LABEL: add_mul_combine_reject_g3: 582; RV64IMB: # %bb.0: 583; RV64IMB-NEXT: addi a0, a0, 100 584; RV64IMB-NEXT: sh3add a1, a0, a0 585; RV64IMB-NEXT: sh3add a0, a1, a0 586; RV64IMB-NEXT: addi a0, a0, 10 587; RV64IMB-NEXT: ret 588 %tmp0 = mul i64 %x, 73 589 %tmp1 = add i64 %tmp0, 7310 590 ret i64 %tmp1 591} 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, 24 598; RV32IMB-NEXT: sh1add a1, a1, a1 599; RV32IMB-NEXT: sh1add a3, a0, a0 600; RV32IMB-NEXT: mulhu a0, a0, a2 601; RV32IMB-NEXT: li a2, 1 602; RV32IMB-NEXT: sh3add a1, a1, a0 603; RV32IMB-NEXT: slli a4, a3, 3 604; RV32IMB-NEXT: slli a2, a2, 11 605; RV32IMB-NEXT: sh3add a0, a3, a2 606; RV32IMB-NEXT: sltu a2, a0, a4 607; RV32IMB-NEXT: add a1, a1, a2 608; RV32IMB-NEXT: ret 609; 610; RV64IMB-LABEL: add_mul_combine_infinite_loop: 611; RV64IMB: # %bb.0: 612; RV64IMB-NEXT: addi a0, a0, 86 613; RV64IMB-NEXT: sh1add a0, a0, a0 614; RV64IMB-NEXT: slli a0, a0, 3 615; RV64IMB-NEXT: addi a0, a0, -16 616; RV64IMB-NEXT: ret 617 %tmp0 = mul i64 %x, 24 618 %tmp1 = add i64 %tmp0, 2048 619 ret i64 %tmp1 620} 621 622define i32 @mul3000_add8990_a(i32 %x) { 623; RV32IMB-LABEL: mul3000_add8990_a: 624; RV32IMB: # %bb.0: 625; RV32IMB-NEXT: addi a0, a0, 3 626; RV32IMB-NEXT: lui a1, 1 627; RV32IMB-NEXT: addi a1, a1, -1096 628; RV32IMB-NEXT: mul a0, a0, a1 629; RV32IMB-NEXT: addi a0, a0, -10 630; RV32IMB-NEXT: ret 631; 632; RV64IMB-LABEL: mul3000_add8990_a: 633; RV64IMB: # %bb.0: 634; RV64IMB-NEXT: addi a0, a0, 3 635; RV64IMB-NEXT: lui a1, 1 636; RV64IMB-NEXT: addi a1, a1, -1096 637; RV64IMB-NEXT: mul a0, a0, a1 638; RV64IMB-NEXT: addiw a0, a0, -10 639; RV64IMB-NEXT: ret 640 %tmp0 = mul i32 %x, 3000 641 %tmp1 = add i32 %tmp0, 8990 642 ret i32 %tmp1 643} 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, 3 649; RV32IMB-NEXT: lui a1, 1 650; RV32IMB-NEXT: addi a1, a1, -1096 651; RV32IMB-NEXT: mul a0, a0, a1 652; RV32IMB-NEXT: addi a0, a0, -10 653; RV32IMB-NEXT: ret 654; 655; RV64IMB-LABEL: mul3000_add8990_b: 656; RV64IMB: # %bb.0: 657; RV64IMB-NEXT: addi a0, a0, 3 658; RV64IMB-NEXT: lui a1, 1 659; RV64IMB-NEXT: addi a1, a1, -1096 660; RV64IMB-NEXT: mul a0, a0, a1 661; RV64IMB-NEXT: addiw a0, a0, -10 662; RV64IMB-NEXT: ret 663 %tmp0 = mul i32 %x, 3000 664 %tmp1 = add i32 %tmp0, 8990 665 ret i32 %tmp1 666} 667 668define i64 @mul3000_add8990_c(i64 %x) { 669; RV32IMB-LABEL: mul3000_add8990_c: 670; RV32IMB: # %bb.0: 671; RV32IMB-NEXT: lui a2, 1 672; RV32IMB-NEXT: addi a2, a2, -1096 673; RV32IMB-NEXT: mul a1, a1, a2 674; RV32IMB-NEXT: mulhu a3, a0, a2 675; RV32IMB-NEXT: mul a2, a0, a2 676; RV32IMB-NEXT: lui a0, 2 677; RV32IMB-NEXT: addi a0, a0, 798 678; RV32IMB-NEXT: add a1, a3, a1 679; RV32IMB-NEXT: add a0, a2, a0 680; RV32IMB-NEXT: sltu a2, a0, a2 681; RV32IMB-NEXT: add a1, a1, a2 682; RV32IMB-NEXT: ret 683; 684; RV64IMB-LABEL: mul3000_add8990_c: 685; RV64IMB: # %bb.0: 686; RV64IMB-NEXT: addi a0, a0, 3 687; RV64IMB-NEXT: lui a1, 1 688; RV64IMB-NEXT: addiw a1, a1, -1096 689; RV64IMB-NEXT: mul a0, a0, a1 690; RV64IMB-NEXT: addi a0, a0, -10 691; RV64IMB-NEXT: ret 692 %tmp0 = mul i64 %x, 3000 693 %tmp1 = add i64 %tmp0, 8990 694 ret i64 %tmp1 695} 696 697define i32 @mul3000_sub8990_a(i32 %x) { 698; RV32IMB-LABEL: mul3000_sub8990_a: 699; RV32IMB: # %bb.0: 700; RV32IMB-NEXT: addi a0, a0, -3 701; RV32IMB-NEXT: lui a1, 1 702; RV32IMB-NEXT: addi a1, a1, -1096 703; RV32IMB-NEXT: mul a0, a0, a1 704; RV32IMB-NEXT: addi a0, a0, 10 705; RV32IMB-NEXT: ret 706; 707; RV64IMB-LABEL: mul3000_sub8990_a: 708; RV64IMB: # %bb.0: 709; RV64IMB-NEXT: addi a0, a0, -3 710; RV64IMB-NEXT: lui a1, 1 711; RV64IMB-NEXT: addi a1, a1, -1096 712; RV64IMB-NEXT: mul a0, a0, a1 713; RV64IMB-NEXT: addiw a0, a0, 10 714; RV64IMB-NEXT: ret 715 %tmp0 = mul i32 %x, 3000 716 %tmp1 = add i32 %tmp0, -8990 717 ret i32 %tmp1 718} 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, -3 724; RV32IMB-NEXT: lui a1, 1 725; RV32IMB-NEXT: addi a1, a1, -1096 726; RV32IMB-NEXT: mul a0, a0, a1 727; RV32IMB-NEXT: addi a0, a0, 10 728; RV32IMB-NEXT: ret 729; 730; RV64IMB-LABEL: mul3000_sub8990_b: 731; RV64IMB: # %bb.0: 732; RV64IMB-NEXT: addi a0, a0, -3 733; RV64IMB-NEXT: lui a1, 1 734; RV64IMB-NEXT: addi a1, a1, -1096 735; RV64IMB-NEXT: mul a0, a0, a1 736; RV64IMB-NEXT: addiw a0, a0, 10 737; RV64IMB-NEXT: ret 738 %tmp0 = mul i32 %x, 3000 739 %tmp1 = add i32 %tmp0, -8990 740 ret i32 %tmp1 741} 742 743define i64 @mul3000_sub8990_c(i64 %x) { 744; RV32IMB-LABEL: mul3000_sub8990_c: 745; RV32IMB: # %bb.0: 746; RV32IMB-NEXT: lui a2, 1 747; RV32IMB-NEXT: addi a2, a2, -1096 748; RV32IMB-NEXT: mul a1, a1, a2 749; RV32IMB-NEXT: mulhu a3, a0, a2 750; RV32IMB-NEXT: mul a2, a0, a2 751; RV32IMB-NEXT: lui a0, 1048574 752; RV32IMB-NEXT: addi a0, a0, -798 753; RV32IMB-NEXT: add a1, a3, a1 754; RV32IMB-NEXT: add a0, a2, a0 755; RV32IMB-NEXT: sltu a2, a0, a2 756; RV32IMB-NEXT: add a1, a1, a2 757; RV32IMB-NEXT: addi a1, a1, -1 758; RV32IMB-NEXT: ret 759; 760; RV64IMB-LABEL: mul3000_sub8990_c: 761; RV64IMB: # %bb.0: 762; RV64IMB-NEXT: addi a0, a0, -3 763; RV64IMB-NEXT: lui a1, 1 764; RV64IMB-NEXT: addiw a1, a1, -1096 765; RV64IMB-NEXT: mul a0, a0, a1 766; RV64IMB-NEXT: addi a0, a0, 10 767; RV64IMB-NEXT: ret 768 %tmp0 = mul i64 %x, 3000 769 %tmp1 = add i64 %tmp0, -8990 770 ret i64 %tmp1 771} 772 773define i32 @mulneg3000_add8990_a(i32 %x) { 774; RV32IMB-LABEL: mulneg3000_add8990_a: 775; RV32IMB: # %bb.0: 776; RV32IMB-NEXT: addi a0, a0, -3 777; RV32IMB-NEXT: lui a1, 1048575 778; RV32IMB-NEXT: addi a1, a1, 1096 779; RV32IMB-NEXT: mul a0, a0, a1 780; RV32IMB-NEXT: addi a0, a0, -10 781; RV32IMB-NEXT: ret 782; 783; RV64IMB-LABEL: mulneg3000_add8990_a: 784; RV64IMB: # %bb.0: 785; RV64IMB-NEXT: addi a0, a0, -3 786; RV64IMB-NEXT: lui a1, 1048575 787; RV64IMB-NEXT: addi a1, a1, 1096 788; RV64IMB-NEXT: mul a0, a0, a1 789; RV64IMB-NEXT: addiw a0, a0, -10 790; RV64IMB-NEXT: ret 791 %tmp0 = mul i32 %x, -3000 792 %tmp1 = add i32 %tmp0, 8990 793 ret i32 %tmp1 794} 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, -3 800; RV32IMB-NEXT: lui a1, 1048575 801; RV32IMB-NEXT: addi a1, a1, 1096 802; RV32IMB-NEXT: mul a0, a0, a1 803; RV32IMB-NEXT: addi a0, a0, -10 804; RV32IMB-NEXT: ret 805; 806; RV64IMB-LABEL: mulneg3000_add8990_b: 807; RV64IMB: # %bb.0: 808; RV64IMB-NEXT: addi a0, a0, -3 809; RV64IMB-NEXT: lui a1, 1048575 810; RV64IMB-NEXT: addi a1, a1, 1096 811; RV64IMB-NEXT: mul a0, a0, a1 812; RV64IMB-NEXT: addiw a0, a0, -10 813; RV64IMB-NEXT: ret 814 %tmp0 = mul i32 %x, -3000 815 %tmp1 = add i32 %tmp0, 8990 816 ret i32 %tmp1 817} 818 819define i64 @mulneg3000_add8990_c(i64 %x) { 820; RV32IMB-LABEL: mulneg3000_add8990_c: 821; RV32IMB: # %bb.0: 822; RV32IMB-NEXT: lui a2, 1048575 823; RV32IMB-NEXT: addi a2, a2, 1096 824; RV32IMB-NEXT: mul a1, a1, a2 825; RV32IMB-NEXT: mulhu a3, a0, a2 826; RV32IMB-NEXT: mul a2, a0, a2 827; RV32IMB-NEXT: sub a3, a3, a0 828; RV32IMB-NEXT: lui a0, 2 829; RV32IMB-NEXT: addi a0, a0, 798 830; RV32IMB-NEXT: add a0, a2, a0 831; RV32IMB-NEXT: add a1, a3, a1 832; RV32IMB-NEXT: sltu a2, a0, a2 833; RV32IMB-NEXT: add a1, a1, a2 834; RV32IMB-NEXT: ret 835; 836; RV64IMB-LABEL: mulneg3000_add8990_c: 837; RV64IMB: # %bb.0: 838; RV64IMB-NEXT: addi a0, a0, -3 839; RV64IMB-NEXT: lui a1, 1048575 840; RV64IMB-NEXT: addiw a1, a1, 1096 841; RV64IMB-NEXT: mul a0, a0, a1 842; RV64IMB-NEXT: addi a0, a0, -10 843; RV64IMB-NEXT: ret 844 %tmp0 = mul i64 %x, -3000 845 %tmp1 = add i64 %tmp0, 8990 846 ret i64 %tmp1 847} 848 849define i32 @mulneg3000_sub8990_a(i32 %x) { 850; RV32IMB-LABEL: mulneg3000_sub8990_a: 851; RV32IMB: # %bb.0: 852; RV32IMB-NEXT: addi a0, a0, 3 853; RV32IMB-NEXT: lui a1, 1048575 854; RV32IMB-NEXT: addi a1, a1, 1096 855; RV32IMB-NEXT: mul a0, a0, a1 856; RV32IMB-NEXT: addi a0, a0, 10 857; RV32IMB-NEXT: ret 858; 859; RV64IMB-LABEL: mulneg3000_sub8990_a: 860; RV64IMB: # %bb.0: 861; RV64IMB-NEXT: addi a0, a0, 3 862; RV64IMB-NEXT: lui a1, 1048575 863; RV64IMB-NEXT: addi a1, a1, 1096 864; RV64IMB-NEXT: mul a0, a0, a1 865; RV64IMB-NEXT: addiw a0, a0, 10 866; RV64IMB-NEXT: ret 867 %tmp0 = mul i32 %x, -3000 868 %tmp1 = add i32 %tmp0, -8990 869 ret i32 %tmp1 870} 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, 3 876; RV32IMB-NEXT: lui a1, 1048575 877; RV32IMB-NEXT: addi a1, a1, 1096 878; RV32IMB-NEXT: mul a0, a0, a1 879; RV32IMB-NEXT: addi a0, a0, 10 880; RV32IMB-NEXT: ret 881; 882; RV64IMB-LABEL: mulneg3000_sub8990_b: 883; RV64IMB: # %bb.0: 884; RV64IMB-NEXT: addi a0, a0, 3 885; RV64IMB-NEXT: lui a1, 1048575 886; RV64IMB-NEXT: addi a1, a1, 1096 887; RV64IMB-NEXT: mul a0, a0, a1 888; RV64IMB-NEXT: addiw a0, a0, 10 889; RV64IMB-NEXT: ret 890 %tmp0 = mul i32 %x, -3000 891 %tmp1 = add i32 %tmp0, -8990 892 ret i32 %tmp1 893} 894 895define i64 @mulneg3000_sub8990_c(i64 %x) { 896; RV32IMB-LABEL: mulneg3000_sub8990_c: 897; RV32IMB: # %bb.0: 898; RV32IMB-NEXT: lui a2, 1048575 899; RV32IMB-NEXT: addi a2, a2, 1096 900; RV32IMB-NEXT: mul a1, a1, a2 901; RV32IMB-NEXT: mulhu a3, a0, a2 902; RV32IMB-NEXT: mul a2, a0, a2 903; RV32IMB-NEXT: sub a3, a3, a0 904; RV32IMB-NEXT: lui a0, 1048574 905; RV32IMB-NEXT: addi a0, a0, -798 906; RV32IMB-NEXT: add a0, a2, a0 907; RV32IMB-NEXT: add a1, a3, a1 908; RV32IMB-NEXT: sltu a2, a0, a2 909; RV32IMB-NEXT: add a1, a1, a2 910; RV32IMB-NEXT: addi a1, a1, -1 911; RV32IMB-NEXT: ret 912; 913; RV64IMB-LABEL: mulneg3000_sub8990_c: 914; RV64IMB: # %bb.0: 915; RV64IMB-NEXT: addi a0, a0, 3 916; RV64IMB-NEXT: lui a1, 1048575 917; RV64IMB-NEXT: addiw a1, a1, 1096 918; RV64IMB-NEXT: mul a0, a0, a1 919; RV64IMB-NEXT: addi a0, a0, 10 920; RV64IMB-NEXT: ret 921 %tmp0 = mul i64 %x, -3000 922 %tmp1 = add i64 %tmp0, -8990 923 ret i64 %tmp1 924} 925 926; This test case previously caused an infinite loop between transformations 927; performed in RISCVISelLowering;:transformAddImmMulImm and 928; DAGCombiner::visitMUL. 929define i1 @pr53831(i32 %x) { 930; RV32IMB-LABEL: pr53831: 931; RV32IMB: # %bb.0: 932; RV32IMB-NEXT: li a0, 0 933; RV32IMB-NEXT: ret 934; 935; RV64IMB-LABEL: pr53831: 936; RV64IMB: # %bb.0: 937; RV64IMB-NEXT: li a0, 0 938; RV64IMB-NEXT: ret 939 %tmp0 = add i32 %x, 1 940 %tmp1 = mul i32 %tmp0, 24 941 %tmp2 = add i32 %tmp1, 1 942 %tmp3 = mul i32 %x, 24 943 %tmp4 = add i32 %tmp3, 2048 944 %tmp5 = icmp eq i32 %tmp4, %tmp2 945 ret i1 %tmp5 946} 947 948define i64 @sh2add_uw(i64 signext %0, i32 signext %1) { 949; RV32IMB-LABEL: sh2add_uw: 950; RV32IMB: # %bb.0: # %entry 951; RV32IMB-NEXT: srli a3, a2, 27 952; RV32IMB-NEXT: slli a2, a2, 5 953; RV32IMB-NEXT: srli a4, a0, 29 954; RV32IMB-NEXT: sh3add a1, a1, a4 955; RV32IMB-NEXT: sh3add a0, a0, a2 956; RV32IMB-NEXT: sltu a2, a0, a2 957; RV32IMB-NEXT: add a1, a3, a1 958; RV32IMB-NEXT: add a1, a1, a2 959; RV32IMB-NEXT: ret 960; 961; RV64IMB-LABEL: sh2add_uw: 962; RV64IMB: # %bb.0: # %entry 963; RV64IMB-NEXT: sh2add.uw a0, a1, a0 964; RV64IMB-NEXT: slli a0, a0, 3 965; RV64IMB-NEXT: ret 966entry: 967 %2 = zext i32 %1 to i64 968 %3 = shl i64 %2, 5 969 %4 = shl i64 %0, 3 970 %5 = add i64 %3, %4 971 ret i64 %5 972} 973