1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc -mtriple=riscv32 < %s | FileCheck -check-prefixes=RV32,NO-ZBA %s 3; RUN: llc -mtriple=riscv32 -mattr=+zba < %s | FileCheck -check-prefixes=RV32,ZBA %s 4 5define i32 @add_shl_oneUse(i32 %x, i32 %y) nounwind { 6; NO-ZBA-LABEL: add_shl_oneUse: 7; NO-ZBA: # %bb.0: 8; NO-ZBA-NEXT: slli a0, a0, 3 9; NO-ZBA-NEXT: add a0, a0, a1 10; NO-ZBA-NEXT: addi a0, a0, 984 11; NO-ZBA-NEXT: ret 12; 13; ZBA-LABEL: add_shl_oneUse: 14; ZBA: # %bb.0: 15; ZBA-NEXT: addi a0, a0, 123 16; ZBA-NEXT: sh3add a0, a0, a1 17; ZBA-NEXT: ret 18 %add.0 = add i32 %x, 123 19 %shl = shl i32 %add.0, 3 20 %add.1 = add i32 %shl, %y 21 ret i32 %add.1 22} 23 24define void @add_shl_moreOneUse_inStore(ptr %array1, i32 %a, i32 %b) { 25; NO-ZBA-LABEL: add_shl_moreOneUse_inStore: 26; NO-ZBA: # %bb.0: # %entry 27; NO-ZBA-NEXT: addi a3, a1, 5 28; NO-ZBA-NEXT: slli a1, a1, 2 29; NO-ZBA-NEXT: add a0, a0, a1 30; NO-ZBA-NEXT: sw a2, 20(a0) 31; NO-ZBA-NEXT: sw a2, 24(a0) 32; NO-ZBA-NEXT: sw a3, 140(a0) 33; NO-ZBA-NEXT: ret 34; 35; ZBA-LABEL: add_shl_moreOneUse_inStore: 36; ZBA: # %bb.0: # %entry 37; ZBA-NEXT: addi a3, a1, 5 38; ZBA-NEXT: sh2add a0, a1, a0 39; ZBA-NEXT: sw a2, 20(a0) 40; ZBA-NEXT: sw a2, 24(a0) 41; ZBA-NEXT: sw a3, 140(a0) 42; ZBA-NEXT: ret 43entry: 44 %add = add nsw i32 %a, 5 45 %arrayidx = getelementptr inbounds i32, ptr %array1, i32 %add 46 store i32 %b, ptr %arrayidx 47 %0 = getelementptr i32, ptr %array1, i32 %a 48 %arrayidx3 = getelementptr i8, ptr %0, i32 24 49 store i32 %b, ptr %arrayidx3 50 %arrayidx5 = getelementptr i8, ptr %0, i32 140 51 store i32 %add, ptr %arrayidx5 52 ret void 53} 54 55define void @add_shl_moreOneUse_inStore_addexceedsign12(ptr %array1, i32 %a, i32 %b) { 56; NO-ZBA-LABEL: add_shl_moreOneUse_inStore_addexceedsign12: 57; NO-ZBA: # %bb.0: # %entry 58; NO-ZBA-NEXT: addi a3, a1, 2047 59; NO-ZBA-NEXT: lui a4, 2 60; NO-ZBA-NEXT: slli a1, a1, 2 61; NO-ZBA-NEXT: addi a3, a3, 1 62; NO-ZBA-NEXT: add a0, a0, a1 63; NO-ZBA-NEXT: add a0, a0, a4 64; NO-ZBA-NEXT: sw a2, 0(a0) 65; NO-ZBA-NEXT: sw a3, 4(a0) 66; NO-ZBA-NEXT: sw a2, 120(a0) 67; NO-ZBA-NEXT: ret 68; 69; ZBA-LABEL: add_shl_moreOneUse_inStore_addexceedsign12: 70; ZBA: # %bb.0: # %entry 71; ZBA-NEXT: addi a3, a1, 2047 72; ZBA-NEXT: lui a4, 2 73; ZBA-NEXT: sh2add a0, a1, a0 74; ZBA-NEXT: addi a3, a3, 1 75; ZBA-NEXT: add a0, a0, a4 76; ZBA-NEXT: sw a2, 0(a0) 77; ZBA-NEXT: sw a3, 4(a0) 78; ZBA-NEXT: sw a2, 120(a0) 79; ZBA-NEXT: ret 80entry: 81 %add = add nsw i32 %a, 2048 82 %arrayidx = getelementptr inbounds i32, ptr %array1, i32 %add 83 store i32 %b, ptr %arrayidx 84 %0 = getelementptr i32, ptr %array1, i32 %a 85 %arrayidx2 = getelementptr i8, ptr %0, i32 8196 86 store i32 %add, ptr %arrayidx2 87 %arrayidx4 = getelementptr i8, ptr %0, i32 8312 88 store i32 %b, ptr %arrayidx4 89 ret void 90} 91 92define void @add_shl_moreOneUse_inSelect(ptr %array1, i32 %a, i32 %b, i32 %x) { 93; NO-ZBA-LABEL: add_shl_moreOneUse_inSelect: 94; NO-ZBA: # %bb.0: # %entry 95; NO-ZBA-NEXT: addi a4, a1, 5 96; NO-ZBA-NEXT: mv a5, a4 97; NO-ZBA-NEXT: bgtz a3, .LBB3_2 98; NO-ZBA-NEXT: # %bb.1: # %entry 99; NO-ZBA-NEXT: mv a5, a2 100; NO-ZBA-NEXT: .LBB3_2: # %entry 101; NO-ZBA-NEXT: slli a1, a1, 2 102; NO-ZBA-NEXT: add a0, a0, a1 103; NO-ZBA-NEXT: sw a5, 20(a0) 104; NO-ZBA-NEXT: sw a5, 24(a0) 105; NO-ZBA-NEXT: sw a4, 140(a0) 106; NO-ZBA-NEXT: ret 107; 108; ZBA-LABEL: add_shl_moreOneUse_inSelect: 109; ZBA: # %bb.0: # %entry 110; ZBA-NEXT: addi a4, a1, 5 111; ZBA-NEXT: mv a5, a4 112; ZBA-NEXT: bgtz a3, .LBB3_2 113; ZBA-NEXT: # %bb.1: # %entry 114; ZBA-NEXT: mv a5, a2 115; ZBA-NEXT: .LBB3_2: # %entry 116; ZBA-NEXT: sh2add a0, a1, a0 117; ZBA-NEXT: sw a5, 20(a0) 118; ZBA-NEXT: sw a5, 24(a0) 119; ZBA-NEXT: sw a4, 140(a0) 120; ZBA-NEXT: ret 121entry: 122 %add = add nsw i32 %a, 5 123 %cmp = icmp sgt i32 %x, 0 124 %cond = select i1 %cmp, i32 %add, i32 %b 125 %arrayidx = getelementptr inbounds i32, ptr %array1, i32 %add 126 store i32 %cond, ptr %arrayidx 127 %0 = getelementptr i32, ptr %array1, i32 %a 128 %arrayidx2 = getelementptr i32, ptr %0, i32 6 129 store i32 %cond, ptr %arrayidx2 130 %arrayidx4 = getelementptr i32, ptr %0, i32 35 131 store i32 %add, ptr %arrayidx4 132 ret void 133} 134 135define void @add_shl_moreOneUse_inSelect_addexceedsign12(ptr %array1, i32 %a, i32 %b, i32 %x) { 136; NO-ZBA-LABEL: add_shl_moreOneUse_inSelect_addexceedsign12: 137; NO-ZBA: # %bb.0: # %entry 138; NO-ZBA-NEXT: addi a4, a1, 2047 139; NO-ZBA-NEXT: addi a4, a4, 1 140; NO-ZBA-NEXT: mv a5, a4 141; NO-ZBA-NEXT: bgtz a3, .LBB4_2 142; NO-ZBA-NEXT: # %bb.1: # %entry 143; NO-ZBA-NEXT: mv a5, a2 144; NO-ZBA-NEXT: .LBB4_2: # %entry 145; NO-ZBA-NEXT: lui a2, 2 146; NO-ZBA-NEXT: slli a1, a1, 2 147; NO-ZBA-NEXT: add a0, a0, a1 148; NO-ZBA-NEXT: add a0, a0, a2 149; NO-ZBA-NEXT: sw a5, 0(a0) 150; NO-ZBA-NEXT: sw a5, 4(a0) 151; NO-ZBA-NEXT: sw a4, 120(a0) 152; NO-ZBA-NEXT: ret 153; 154; ZBA-LABEL: add_shl_moreOneUse_inSelect_addexceedsign12: 155; ZBA: # %bb.0: # %entry 156; ZBA-NEXT: addi a4, a1, 2047 157; ZBA-NEXT: addi a4, a4, 1 158; ZBA-NEXT: mv a5, a4 159; ZBA-NEXT: bgtz a3, .LBB4_2 160; ZBA-NEXT: # %bb.1: # %entry 161; ZBA-NEXT: mv a5, a2 162; ZBA-NEXT: .LBB4_2: # %entry 163; ZBA-NEXT: lui a2, 2 164; ZBA-NEXT: sh2add a0, a1, a0 165; ZBA-NEXT: add a0, a0, a2 166; ZBA-NEXT: sw a5, 0(a0) 167; ZBA-NEXT: sw a5, 4(a0) 168; ZBA-NEXT: sw a4, 120(a0) 169; ZBA-NEXT: ret 170entry: 171 %add = add nsw i32 %a, 2048 172 %cmp = icmp sgt i32 %x, 0 173 %spec.select = select i1 %cmp, i32 %add, i32 %b 174 %0 = getelementptr inbounds i32, ptr %array1, i32 %add 175 store i32 %spec.select, ptr %0, align 4 176 %1 = getelementptr i32, ptr %array1, i32 %a 177 %arrayidx4 = getelementptr i8, ptr %1, i32 8196 178 store i32 %spec.select, ptr %arrayidx4 179 %arrayidx6 = getelementptr i8, ptr %1, i32 8312 180 store i32 %add, ptr %arrayidx6 181 ret void 182} 183 184define i32 @add_shl_moreOneUse_sh1add(i32 %x) { 185; NO-ZBA-LABEL: add_shl_moreOneUse_sh1add: 186; NO-ZBA: # %bb.0: 187; NO-ZBA-NEXT: ori a1, a0, 1 188; NO-ZBA-NEXT: slli a0, a0, 1 189; NO-ZBA-NEXT: ori a0, a0, 2 190; NO-ZBA-NEXT: add a0, a0, a1 191; NO-ZBA-NEXT: ret 192; 193; ZBA-LABEL: add_shl_moreOneUse_sh1add: 194; ZBA: # %bb.0: 195; ZBA-NEXT: ori a0, a0, 1 196; ZBA-NEXT: sh1add a0, a0, a0 197; ZBA-NEXT: ret 198 %or = or i32 %x, 1 199 %mul = shl i32 %or, 1 200 %add = add i32 %mul, %or 201 ret i32 %add 202} 203 204define i32 @add_shl_moreOneUse_sh2add(i32 %x) { 205; NO-ZBA-LABEL: add_shl_moreOneUse_sh2add: 206; NO-ZBA: # %bb.0: 207; NO-ZBA-NEXT: ori a1, a0, 1 208; NO-ZBA-NEXT: slli a0, a0, 2 209; NO-ZBA-NEXT: ori a0, a0, 4 210; NO-ZBA-NEXT: add a0, a0, a1 211; NO-ZBA-NEXT: ret 212; 213; ZBA-LABEL: add_shl_moreOneUse_sh2add: 214; ZBA: # %bb.0: 215; ZBA-NEXT: ori a0, a0, 1 216; ZBA-NEXT: sh2add a0, a0, a0 217; ZBA-NEXT: ret 218 %or = or i32 %x, 1 219 %mul = shl i32 %or, 2 220 %add = add i32 %mul, %or 221 ret i32 %add 222} 223 224define i32 @add_shl_moreOneUse_sh3add(i32 %x) { 225; NO-ZBA-LABEL: add_shl_moreOneUse_sh3add: 226; NO-ZBA: # %bb.0: 227; NO-ZBA-NEXT: ori a1, a0, 1 228; NO-ZBA-NEXT: slli a0, a0, 3 229; NO-ZBA-NEXT: ori a0, a0, 8 230; NO-ZBA-NEXT: add a0, a0, a1 231; NO-ZBA-NEXT: ret 232; 233; ZBA-LABEL: add_shl_moreOneUse_sh3add: 234; ZBA: # %bb.0: 235; ZBA-NEXT: ori a0, a0, 1 236; ZBA-NEXT: sh3add a0, a0, a0 237; ZBA-NEXT: ret 238 %or = or i32 %x, 1 239 %mul = shl i32 %or, 3 240 %add = add i32 %mul, %or 241 ret i32 %add 242} 243 244define i32 @add_shl_moreOneUse_sh4add(i32 %x) { 245; RV32-LABEL: add_shl_moreOneUse_sh4add: 246; RV32: # %bb.0: 247; RV32-NEXT: ori a1, a0, 1 248; RV32-NEXT: slli a0, a0, 4 249; RV32-NEXT: ori a0, a0, 16 250; RV32-NEXT: add a0, a0, a1 251; RV32-NEXT: ret 252 %or = or i32 %x, 1 253 %mul = shl i32 %or, 4 254 %add = add i32 %mul, %or 255 ret i32 %add 256} 257