1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 3; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 4; RUN: | FileCheck -check-prefix=RV32I %s 5; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 6; RUN: | FileCheck -check-prefix=RV64I %s 7 8;; Test that (add (shl x, c0), c1) can be transformed to 9;; (add (shl (add x, c1>>c0), c0), c1-(c1>>c0<<c0)) or 10;; (shl (add x, c1>>c0), c0) if profitable. 11 12define i32 @shl5_add1184_a(i32 %x) { 13; RV32I-LABEL: shl5_add1184_a: 14; RV32I: # %bb.0: 15; RV32I-NEXT: slli a0, a0, 5 16; RV32I-NEXT: addi a0, a0, 1184 17; RV32I-NEXT: ret 18; 19; RV64I-LABEL: shl5_add1184_a: 20; RV64I: # %bb.0: 21; RV64I-NEXT: slli a0, a0, 5 22; RV64I-NEXT: addiw a0, a0, 1184 23; RV64I-NEXT: ret 24 %tmp0 = shl i32 %x, 5 25 %tmp1 = add i32 %tmp0, 1184 26 ret i32 %tmp1 27} 28 29define signext i32 @shl5_add1184_b(i32 signext %x) { 30; RV32I-LABEL: shl5_add1184_b: 31; RV32I: # %bb.0: 32; RV32I-NEXT: slli a0, a0, 5 33; RV32I-NEXT: addi a0, a0, 1184 34; RV32I-NEXT: ret 35; 36; RV64I-LABEL: shl5_add1184_b: 37; RV64I: # %bb.0: 38; RV64I-NEXT: slli a0, a0, 5 39; RV64I-NEXT: addiw a0, a0, 1184 40; RV64I-NEXT: ret 41 %tmp0 = shl i32 %x, 5 42 %tmp1 = add i32 %tmp0, 1184 43 ret i32 %tmp1 44} 45 46define i64 @shl5_add1184_c(i64 %x) { 47; RV32I-LABEL: shl5_add1184_c: 48; RV32I: # %bb.0: 49; RV32I-NEXT: srli a2, a0, 27 50; RV32I-NEXT: slli a1, a1, 5 51; RV32I-NEXT: slli a3, a0, 5 52; RV32I-NEXT: or a1, a1, a2 53; RV32I-NEXT: addi a0, a3, 1184 54; RV32I-NEXT: sltu a2, a0, a3 55; RV32I-NEXT: add a1, a1, a2 56; RV32I-NEXT: ret 57; 58; RV64I-LABEL: shl5_add1184_c: 59; RV64I: # %bb.0: 60; RV64I-NEXT: slli a0, a0, 5 61; RV64I-NEXT: addi a0, a0, 1184 62; RV64I-NEXT: ret 63 %tmp0 = shl i64 %x, 5 64 %tmp1 = add i64 %tmp0, 1184 65 ret i64 %tmp1 66} 67 68define i32 @shl5_add101024_a(i32 %x) { 69; RV32I-LABEL: shl5_add101024_a: 70; RV32I: # %bb.0: 71; RV32I-NEXT: slli a0, a0, 5 72; RV32I-NEXT: lui a1, 25 73; RV32I-NEXT: addi a1, a1, -1376 74; RV32I-NEXT: add a0, a0, a1 75; RV32I-NEXT: ret 76; 77; RV64I-LABEL: shl5_add101024_a: 78; RV64I: # %bb.0: 79; RV64I-NEXT: slli a0, a0, 5 80; RV64I-NEXT: lui a1, 25 81; RV64I-NEXT: addi a1, a1, -1376 82; RV64I-NEXT: addw a0, a0, a1 83; RV64I-NEXT: ret 84 %tmp0 = shl i32 %x, 5 85 %tmp1 = add i32 %tmp0, 101024 86 ret i32 %tmp1 87} 88 89define signext i32 @shl5_add101024_b(i32 signext %x) { 90; RV32I-LABEL: shl5_add101024_b: 91; RV32I: # %bb.0: 92; RV32I-NEXT: slli a0, a0, 5 93; RV32I-NEXT: lui a1, 25 94; RV32I-NEXT: addi a1, a1, -1376 95; RV32I-NEXT: add a0, a0, a1 96; RV32I-NEXT: ret 97; 98; RV64I-LABEL: shl5_add101024_b: 99; RV64I: # %bb.0: 100; RV64I-NEXT: slli a0, a0, 5 101; RV64I-NEXT: lui a1, 25 102; RV64I-NEXT: addi a1, a1, -1376 103; RV64I-NEXT: addw a0, a0, a1 104; RV64I-NEXT: ret 105 %tmp0 = shl i32 %x, 5 106 %tmp1 = add i32 %tmp0, 101024 107 ret i32 %tmp1 108} 109 110define i64 @shl5_add101024_c(i64 %x) { 111; RV32I-LABEL: shl5_add101024_c: 112; RV32I: # %bb.0: 113; RV32I-NEXT: srli a2, a0, 27 114; RV32I-NEXT: slli a1, a1, 5 115; RV32I-NEXT: slli a3, a0, 5 116; RV32I-NEXT: or a1, a1, a2 117; RV32I-NEXT: lui a0, 25 118; RV32I-NEXT: addi a0, a0, -1376 119; RV32I-NEXT: add a0, a3, a0 120; RV32I-NEXT: sltu a2, a0, a3 121; RV32I-NEXT: add a1, a1, a2 122; RV32I-NEXT: ret 123; 124; RV64I-LABEL: shl5_add101024_c: 125; RV64I: # %bb.0: 126; RV64I-NEXT: slli a0, a0, 5 127; RV64I-NEXT: lui a1, 25 128; RV64I-NEXT: addiw a1, a1, -1376 129; RV64I-NEXT: add a0, a0, a1 130; RV64I-NEXT: ret 131 %tmp0 = shl i64 %x, 5 132 %tmp1 = add i64 %tmp0, 101024 133 ret i64 %tmp1 134} 135 136define i32 @shl5_add47968_a(i32 %x) { 137; RV32I-LABEL: shl5_add47968_a: 138; RV32I: # %bb.0: 139; RV32I-NEXT: slli a0, a0, 5 140; RV32I-NEXT: lui a1, 12 141; RV32I-NEXT: addi a1, a1, -1184 142; RV32I-NEXT: add a0, a0, a1 143; RV32I-NEXT: ret 144; 145; RV64I-LABEL: shl5_add47968_a: 146; RV64I: # %bb.0: 147; RV64I-NEXT: slli a0, a0, 5 148; RV64I-NEXT: lui a1, 12 149; RV64I-NEXT: addi a1, a1, -1184 150; RV64I-NEXT: addw a0, a0, a1 151; RV64I-NEXT: ret 152 %tmp0 = shl i32 %x, 5 153 %tmp1 = add i32 %tmp0, 47968 154 ret i32 %tmp1 155} 156 157define signext i32 @shl5_add47968_b(i32 signext %x) { 158; RV32I-LABEL: shl5_add47968_b: 159; RV32I: # %bb.0: 160; RV32I-NEXT: slli a0, a0, 5 161; RV32I-NEXT: lui a1, 12 162; RV32I-NEXT: addi a1, a1, -1184 163; RV32I-NEXT: add a0, a0, a1 164; RV32I-NEXT: ret 165; 166; RV64I-LABEL: shl5_add47968_b: 167; RV64I: # %bb.0: 168; RV64I-NEXT: slli a0, a0, 5 169; RV64I-NEXT: lui a1, 12 170; RV64I-NEXT: addi a1, a1, -1184 171; RV64I-NEXT: addw a0, a0, a1 172; RV64I-NEXT: ret 173 %tmp0 = shl i32 %x, 5 174 %tmp1 = add i32 %tmp0, 47968 175 ret i32 %tmp1 176} 177 178define i64 @shl5_add47968_c(i64 %x) { 179; RV32I-LABEL: shl5_add47968_c: 180; RV32I: # %bb.0: 181; RV32I-NEXT: srli a2, a0, 27 182; RV32I-NEXT: slli a1, a1, 5 183; RV32I-NEXT: slli a3, a0, 5 184; RV32I-NEXT: or a1, a1, a2 185; RV32I-NEXT: lui a0, 12 186; RV32I-NEXT: addi a0, a0, -1184 187; RV32I-NEXT: add a0, a3, a0 188; RV32I-NEXT: sltu a2, a0, a3 189; RV32I-NEXT: add a1, a1, a2 190; RV32I-NEXT: ret 191; 192; RV64I-LABEL: shl5_add47968_c: 193; RV64I: # %bb.0: 194; RV64I-NEXT: slli a0, a0, 5 195; RV64I-NEXT: lui a1, 12 196; RV64I-NEXT: addiw a1, a1, -1184 197; RV64I-NEXT: add a0, a0, a1 198; RV64I-NEXT: ret 199 %tmp0 = shl i64 %x, 5 200 %tmp1 = add i64 %tmp0, 47968 201 ret i64 %tmp1 202} 203 204define i32 @shl5_add47969_a(i32 %x) { 205; RV32I-LABEL: shl5_add47969_a: 206; RV32I: # %bb.0: 207; RV32I-NEXT: slli a0, a0, 5 208; RV32I-NEXT: lui a1, 12 209; RV32I-NEXT: addi a1, a1, -1183 210; RV32I-NEXT: add a0, a0, a1 211; RV32I-NEXT: ret 212; 213; RV64I-LABEL: shl5_add47969_a: 214; RV64I: # %bb.0: 215; RV64I-NEXT: slli a0, a0, 5 216; RV64I-NEXT: lui a1, 12 217; RV64I-NEXT: addi a1, a1, -1183 218; RV64I-NEXT: addw a0, a0, a1 219; RV64I-NEXT: ret 220 %tmp0 = shl i32 %x, 5 221 %tmp1 = add i32 %tmp0, 47969 222 ret i32 %tmp1 223} 224 225define signext i32 @shl5_add47969_b(i32 signext %x) { 226; RV32I-LABEL: shl5_add47969_b: 227; RV32I: # %bb.0: 228; RV32I-NEXT: slli a0, a0, 5 229; RV32I-NEXT: lui a1, 12 230; RV32I-NEXT: addi a1, a1, -1183 231; RV32I-NEXT: add a0, a0, a1 232; RV32I-NEXT: ret 233; 234; RV64I-LABEL: shl5_add47969_b: 235; RV64I: # %bb.0: 236; RV64I-NEXT: slli a0, a0, 5 237; RV64I-NEXT: lui a1, 12 238; RV64I-NEXT: addi a1, a1, -1183 239; RV64I-NEXT: addw a0, a0, a1 240; RV64I-NEXT: ret 241 %tmp0 = shl i32 %x, 5 242 %tmp1 = add i32 %tmp0, 47969 243 ret i32 %tmp1 244} 245 246define i64 @shl5_add47969_c(i64 %x) { 247; RV32I-LABEL: shl5_add47969_c: 248; RV32I: # %bb.0: 249; RV32I-NEXT: srli a2, a0, 27 250; RV32I-NEXT: slli a1, a1, 5 251; RV32I-NEXT: slli a3, a0, 5 252; RV32I-NEXT: or a1, a1, a2 253; RV32I-NEXT: lui a0, 12 254; RV32I-NEXT: addi a0, a0, -1183 255; RV32I-NEXT: add a0, a3, a0 256; RV32I-NEXT: sltu a2, a0, a3 257; RV32I-NEXT: add a1, a1, a2 258; RV32I-NEXT: ret 259; 260; RV64I-LABEL: shl5_add47969_c: 261; RV64I: # %bb.0: 262; RV64I-NEXT: slli a0, a0, 5 263; RV64I-NEXT: lui a1, 12 264; RV64I-NEXT: addiw a1, a1, -1183 265; RV64I-NEXT: add a0, a0, a1 266; RV64I-NEXT: ret 267 %tmp0 = shl i64 %x, 5 268 %tmp1 = add i64 %tmp0, 47969 269 ret i64 %tmp1 270} 271 272define i32 @shl5_sub47968_a(i32 %x) { 273; RV32I-LABEL: shl5_sub47968_a: 274; RV32I: # %bb.0: 275; RV32I-NEXT: slli a0, a0, 5 276; RV32I-NEXT: lui a1, 1048564 277; RV32I-NEXT: addi a1, a1, 1184 278; RV32I-NEXT: add a0, a0, a1 279; RV32I-NEXT: ret 280; 281; RV64I-LABEL: shl5_sub47968_a: 282; RV64I: # %bb.0: 283; RV64I-NEXT: slli a0, a0, 5 284; RV64I-NEXT: lui a1, 1048564 285; RV64I-NEXT: addi a1, a1, 1184 286; RV64I-NEXT: addw a0, a0, a1 287; RV64I-NEXT: ret 288 %tmp0 = shl i32 %x, 5 289 %tmp1 = add i32 %tmp0, -47968 290 ret i32 %tmp1 291} 292 293define signext i32 @shl5_sub47968_b(i32 signext %x) { 294; RV32I-LABEL: shl5_sub47968_b: 295; RV32I: # %bb.0: 296; RV32I-NEXT: slli a0, a0, 5 297; RV32I-NEXT: lui a1, 1048564 298; RV32I-NEXT: addi a1, a1, 1184 299; RV32I-NEXT: add a0, a0, a1 300; RV32I-NEXT: ret 301; 302; RV64I-LABEL: shl5_sub47968_b: 303; RV64I: # %bb.0: 304; RV64I-NEXT: slli a0, a0, 5 305; RV64I-NEXT: lui a1, 1048564 306; RV64I-NEXT: addi a1, a1, 1184 307; RV64I-NEXT: addw a0, a0, a1 308; RV64I-NEXT: ret 309 %tmp0 = shl i32 %x, 5 310 %tmp1 = add i32 %tmp0, -47968 311 ret i32 %tmp1 312} 313 314define i64 @shl5_sub47968_c(i64 %x) { 315; RV32I-LABEL: shl5_sub47968_c: 316; RV32I: # %bb.0: 317; RV32I-NEXT: srli a2, a0, 27 318; RV32I-NEXT: slli a1, a1, 5 319; RV32I-NEXT: slli a3, a0, 5 320; RV32I-NEXT: or a1, a1, a2 321; RV32I-NEXT: lui a0, 1048564 322; RV32I-NEXT: addi a0, a0, 1184 323; RV32I-NEXT: add a0, a3, a0 324; RV32I-NEXT: sltu a2, a0, a3 325; RV32I-NEXT: add a1, a1, a2 326; RV32I-NEXT: addi a1, a1, -1 327; RV32I-NEXT: ret 328; 329; RV64I-LABEL: shl5_sub47968_c: 330; RV64I: # %bb.0: 331; RV64I-NEXT: slli a0, a0, 5 332; RV64I-NEXT: lui a1, 1048564 333; RV64I-NEXT: addiw a1, a1, 1184 334; RV64I-NEXT: add a0, a0, a1 335; RV64I-NEXT: ret 336 %tmp0 = shl i64 %x, 5 337 %tmp1 = add i64 %tmp0, -47968 338 ret i64 %tmp1 339} 340 341define i32 @shl5_sub47969_a(i32 %x) { 342; RV32I-LABEL: shl5_sub47969_a: 343; RV32I: # %bb.0: 344; RV32I-NEXT: slli a0, a0, 5 345; RV32I-NEXT: lui a1, 1048564 346; RV32I-NEXT: addi a1, a1, 1183 347; RV32I-NEXT: add a0, a0, a1 348; RV32I-NEXT: ret 349; 350; RV64I-LABEL: shl5_sub47969_a: 351; RV64I: # %bb.0: 352; RV64I-NEXT: slli a0, a0, 5 353; RV64I-NEXT: lui a1, 1048564 354; RV64I-NEXT: addi a1, a1, 1183 355; RV64I-NEXT: addw a0, a0, a1 356; RV64I-NEXT: ret 357 %tmp0 = shl i32 %x, 5 358 %tmp1 = add i32 %tmp0, -47969 359 ret i32 %tmp1 360} 361 362define signext i32 @shl5_sub47969_b(i32 signext %x) { 363; RV32I-LABEL: shl5_sub47969_b: 364; RV32I: # %bb.0: 365; RV32I-NEXT: slli a0, a0, 5 366; RV32I-NEXT: lui a1, 1048564 367; RV32I-NEXT: addi a1, a1, 1183 368; RV32I-NEXT: add a0, a0, a1 369; RV32I-NEXT: ret 370; 371; RV64I-LABEL: shl5_sub47969_b: 372; RV64I: # %bb.0: 373; RV64I-NEXT: slli a0, a0, 5 374; RV64I-NEXT: lui a1, 1048564 375; RV64I-NEXT: addi a1, a1, 1183 376; RV64I-NEXT: addw a0, a0, a1 377; RV64I-NEXT: ret 378 %tmp0 = shl i32 %x, 5 379 %tmp1 = add i32 %tmp0, -47969 380 ret i32 %tmp1 381} 382 383define i64 @shl5_sub47969_c(i64 %x) { 384; RV32I-LABEL: shl5_sub47969_c: 385; RV32I: # %bb.0: 386; RV32I-NEXT: srli a2, a0, 27 387; RV32I-NEXT: slli a1, a1, 5 388; RV32I-NEXT: slli a3, a0, 5 389; RV32I-NEXT: or a1, a1, a2 390; RV32I-NEXT: lui a0, 1048564 391; RV32I-NEXT: addi a0, a0, 1183 392; RV32I-NEXT: add a0, a3, a0 393; RV32I-NEXT: sltu a2, a0, a3 394; RV32I-NEXT: add a1, a1, a2 395; RV32I-NEXT: addi a1, a1, -1 396; RV32I-NEXT: ret 397; 398; RV64I-LABEL: shl5_sub47969_c: 399; RV64I: # %bb.0: 400; RV64I-NEXT: slli a0, a0, 5 401; RV64I-NEXT: lui a1, 1048564 402; RV64I-NEXT: addiw a1, a1, 1183 403; RV64I-NEXT: add a0, a0, a1 404; RV64I-NEXT: ret 405 %tmp0 = shl i64 %x, 5 406 %tmp1 = add i64 %tmp0, -47969 407 ret i64 %tmp1 408} 409