13083acc2SLiqinWeng; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2*b359c84fSLuke Lau; RUN: llc -mtriple=riscv32 < %s | FileCheck -check-prefixes=RV32,NO-ZBA %s 3*b359c84fSLuke Lau; RUN: llc -mtriple=riscv32 -mattr=+zba < %s | FileCheck -check-prefixes=RV32,ZBA %s 43083acc2SLiqinWeng 53083acc2SLiqinWengdefine i32 @add_shl_oneUse(i32 %x, i32 %y) nounwind { 6*b359c84fSLuke Lau; NO-ZBA-LABEL: add_shl_oneUse: 7*b359c84fSLuke Lau; NO-ZBA: # %bb.0: 8*b359c84fSLuke Lau; NO-ZBA-NEXT: slli a0, a0, 3 9*b359c84fSLuke Lau; NO-ZBA-NEXT: add a0, a0, a1 10*b359c84fSLuke Lau; NO-ZBA-NEXT: addi a0, a0, 984 11*b359c84fSLuke Lau; NO-ZBA-NEXT: ret 12*b359c84fSLuke Lau; 13*b359c84fSLuke Lau; ZBA-LABEL: add_shl_oneUse: 14*b359c84fSLuke Lau; ZBA: # %bb.0: 15*b359c84fSLuke Lau; ZBA-NEXT: addi a0, a0, 123 16*b359c84fSLuke Lau; ZBA-NEXT: sh3add a0, a0, a1 17*b359c84fSLuke Lau; ZBA-NEXT: ret 183083acc2SLiqinWeng %add.0 = add i32 %x, 123 193083acc2SLiqinWeng %shl = shl i32 %add.0, 3 203083acc2SLiqinWeng %add.1 = add i32 %shl, %y 213083acc2SLiqinWeng ret i32 %add.1 223083acc2SLiqinWeng} 233083acc2SLiqinWeng 243083acc2SLiqinWengdefine void @add_shl_moreOneUse_inStore(ptr %array1, i32 %a, i32 %b) { 25*b359c84fSLuke Lau; NO-ZBA-LABEL: add_shl_moreOneUse_inStore: 26*b359c84fSLuke Lau; NO-ZBA: # %bb.0: # %entry 27*b359c84fSLuke Lau; NO-ZBA-NEXT: addi a3, a1, 5 28*b359c84fSLuke Lau; NO-ZBA-NEXT: slli a1, a1, 2 29*b359c84fSLuke Lau; NO-ZBA-NEXT: add a0, a0, a1 30*b359c84fSLuke Lau; NO-ZBA-NEXT: sw a2, 20(a0) 31*b359c84fSLuke Lau; NO-ZBA-NEXT: sw a2, 24(a0) 32*b359c84fSLuke Lau; NO-ZBA-NEXT: sw a3, 140(a0) 33*b359c84fSLuke Lau; NO-ZBA-NEXT: ret 34*b359c84fSLuke Lau; 35*b359c84fSLuke Lau; ZBA-LABEL: add_shl_moreOneUse_inStore: 36*b359c84fSLuke Lau; ZBA: # %bb.0: # %entry 37*b359c84fSLuke Lau; ZBA-NEXT: addi a3, a1, 5 38*b359c84fSLuke Lau; ZBA-NEXT: sh2add a0, a1, a0 39*b359c84fSLuke Lau; ZBA-NEXT: sw a2, 20(a0) 40*b359c84fSLuke Lau; ZBA-NEXT: sw a2, 24(a0) 41*b359c84fSLuke Lau; ZBA-NEXT: sw a3, 140(a0) 42*b359c84fSLuke Lau; ZBA-NEXT: ret 433083acc2SLiqinWengentry: 443083acc2SLiqinWeng %add = add nsw i32 %a, 5 453083acc2SLiqinWeng %arrayidx = getelementptr inbounds i32, ptr %array1, i32 %add 463083acc2SLiqinWeng store i32 %b, ptr %arrayidx 473083acc2SLiqinWeng %0 = getelementptr i32, ptr %array1, i32 %a 483083acc2SLiqinWeng %arrayidx3 = getelementptr i8, ptr %0, i32 24 493083acc2SLiqinWeng store i32 %b, ptr %arrayidx3 503083acc2SLiqinWeng %arrayidx5 = getelementptr i8, ptr %0, i32 140 513083acc2SLiqinWeng store i32 %add, ptr %arrayidx5 523083acc2SLiqinWeng ret void 533083acc2SLiqinWeng} 543083acc2SLiqinWeng 553083acc2SLiqinWengdefine void @add_shl_moreOneUse_inStore_addexceedsign12(ptr %array1, i32 %a, i32 %b) { 56*b359c84fSLuke Lau; NO-ZBA-LABEL: add_shl_moreOneUse_inStore_addexceedsign12: 57*b359c84fSLuke Lau; NO-ZBA: # %bb.0: # %entry 58*b359c84fSLuke Lau; NO-ZBA-NEXT: addi a3, a1, 2047 59*b359c84fSLuke Lau; NO-ZBA-NEXT: lui a4, 2 60*b359c84fSLuke Lau; NO-ZBA-NEXT: slli a1, a1, 2 61*b359c84fSLuke Lau; NO-ZBA-NEXT: addi a3, a3, 1 62*b359c84fSLuke Lau; NO-ZBA-NEXT: add a0, a0, a1 63*b359c84fSLuke Lau; NO-ZBA-NEXT: add a0, a0, a4 64*b359c84fSLuke Lau; NO-ZBA-NEXT: sw a2, 0(a0) 65*b359c84fSLuke Lau; NO-ZBA-NEXT: sw a3, 4(a0) 66*b359c84fSLuke Lau; NO-ZBA-NEXT: sw a2, 120(a0) 67*b359c84fSLuke Lau; NO-ZBA-NEXT: ret 68*b359c84fSLuke Lau; 69*b359c84fSLuke Lau; ZBA-LABEL: add_shl_moreOneUse_inStore_addexceedsign12: 70*b359c84fSLuke Lau; ZBA: # %bb.0: # %entry 71*b359c84fSLuke Lau; ZBA-NEXT: addi a3, a1, 2047 72*b359c84fSLuke Lau; ZBA-NEXT: lui a4, 2 73*b359c84fSLuke Lau; ZBA-NEXT: sh2add a0, a1, a0 74*b359c84fSLuke Lau; ZBA-NEXT: addi a3, a3, 1 75*b359c84fSLuke Lau; ZBA-NEXT: add a0, a0, a4 76*b359c84fSLuke Lau; ZBA-NEXT: sw a2, 0(a0) 77*b359c84fSLuke Lau; ZBA-NEXT: sw a3, 4(a0) 78*b359c84fSLuke Lau; ZBA-NEXT: sw a2, 120(a0) 79*b359c84fSLuke Lau; ZBA-NEXT: ret 803083acc2SLiqinWengentry: 813083acc2SLiqinWeng %add = add nsw i32 %a, 2048 823083acc2SLiqinWeng %arrayidx = getelementptr inbounds i32, ptr %array1, i32 %add 833083acc2SLiqinWeng store i32 %b, ptr %arrayidx 843083acc2SLiqinWeng %0 = getelementptr i32, ptr %array1, i32 %a 853083acc2SLiqinWeng %arrayidx2 = getelementptr i8, ptr %0, i32 8196 863083acc2SLiqinWeng store i32 %add, ptr %arrayidx2 873083acc2SLiqinWeng %arrayidx4 = getelementptr i8, ptr %0, i32 8312 883083acc2SLiqinWeng store i32 %b, ptr %arrayidx4 893083acc2SLiqinWeng ret void 903083acc2SLiqinWeng} 913083acc2SLiqinWeng 923083acc2SLiqinWengdefine void @add_shl_moreOneUse_inSelect(ptr %array1, i32 %a, i32 %b, i32 %x) { 93*b359c84fSLuke Lau; NO-ZBA-LABEL: add_shl_moreOneUse_inSelect: 94*b359c84fSLuke Lau; NO-ZBA: # %bb.0: # %entry 95*b359c84fSLuke Lau; NO-ZBA-NEXT: addi a4, a1, 5 96*b359c84fSLuke Lau; NO-ZBA-NEXT: mv a5, a4 97*b359c84fSLuke Lau; NO-ZBA-NEXT: bgtz a3, .LBB3_2 98*b359c84fSLuke Lau; NO-ZBA-NEXT: # %bb.1: # %entry 99*b359c84fSLuke Lau; NO-ZBA-NEXT: mv a5, a2 100*b359c84fSLuke Lau; NO-ZBA-NEXT: .LBB3_2: # %entry 101*b359c84fSLuke Lau; NO-ZBA-NEXT: slli a1, a1, 2 102*b359c84fSLuke Lau; NO-ZBA-NEXT: add a0, a0, a1 103*b359c84fSLuke Lau; NO-ZBA-NEXT: sw a5, 20(a0) 104*b359c84fSLuke Lau; NO-ZBA-NEXT: sw a5, 24(a0) 105*b359c84fSLuke Lau; NO-ZBA-NEXT: sw a4, 140(a0) 106*b359c84fSLuke Lau; NO-ZBA-NEXT: ret 107*b359c84fSLuke Lau; 108*b359c84fSLuke Lau; ZBA-LABEL: add_shl_moreOneUse_inSelect: 109*b359c84fSLuke Lau; ZBA: # %bb.0: # %entry 110*b359c84fSLuke Lau; ZBA-NEXT: addi a4, a1, 5 111*b359c84fSLuke Lau; ZBA-NEXT: mv a5, a4 112*b359c84fSLuke Lau; ZBA-NEXT: bgtz a3, .LBB3_2 113*b359c84fSLuke Lau; ZBA-NEXT: # %bb.1: # %entry 114*b359c84fSLuke Lau; ZBA-NEXT: mv a5, a2 115*b359c84fSLuke Lau; ZBA-NEXT: .LBB3_2: # %entry 116*b359c84fSLuke Lau; ZBA-NEXT: sh2add a0, a1, a0 117*b359c84fSLuke Lau; ZBA-NEXT: sw a5, 20(a0) 118*b359c84fSLuke Lau; ZBA-NEXT: sw a5, 24(a0) 119*b359c84fSLuke Lau; ZBA-NEXT: sw a4, 140(a0) 120*b359c84fSLuke Lau; ZBA-NEXT: ret 1213083acc2SLiqinWengentry: 1223083acc2SLiqinWeng %add = add nsw i32 %a, 5 1233083acc2SLiqinWeng %cmp = icmp sgt i32 %x, 0 1243083acc2SLiqinWeng %cond = select i1 %cmp, i32 %add, i32 %b 1253083acc2SLiqinWeng %arrayidx = getelementptr inbounds i32, ptr %array1, i32 %add 1263083acc2SLiqinWeng store i32 %cond, ptr %arrayidx 1273083acc2SLiqinWeng %0 = getelementptr i32, ptr %array1, i32 %a 1283083acc2SLiqinWeng %arrayidx2 = getelementptr i32, ptr %0, i32 6 1293083acc2SLiqinWeng store i32 %cond, ptr %arrayidx2 1303083acc2SLiqinWeng %arrayidx4 = getelementptr i32, ptr %0, i32 35 1313083acc2SLiqinWeng store i32 %add, ptr %arrayidx4 1323083acc2SLiqinWeng ret void 1333083acc2SLiqinWeng} 1343083acc2SLiqinWeng 1353083acc2SLiqinWengdefine void @add_shl_moreOneUse_inSelect_addexceedsign12(ptr %array1, i32 %a, i32 %b, i32 %x) { 136*b359c84fSLuke Lau; NO-ZBA-LABEL: add_shl_moreOneUse_inSelect_addexceedsign12: 137*b359c84fSLuke Lau; NO-ZBA: # %bb.0: # %entry 138*b359c84fSLuke Lau; NO-ZBA-NEXT: addi a4, a1, 2047 139*b359c84fSLuke Lau; NO-ZBA-NEXT: addi a4, a4, 1 140*b359c84fSLuke Lau; NO-ZBA-NEXT: mv a5, a4 141*b359c84fSLuke Lau; NO-ZBA-NEXT: bgtz a3, .LBB4_2 142*b359c84fSLuke Lau; NO-ZBA-NEXT: # %bb.1: # %entry 143*b359c84fSLuke Lau; NO-ZBA-NEXT: mv a5, a2 144*b359c84fSLuke Lau; NO-ZBA-NEXT: .LBB4_2: # %entry 145*b359c84fSLuke Lau; NO-ZBA-NEXT: lui a2, 2 146*b359c84fSLuke Lau; NO-ZBA-NEXT: slli a1, a1, 2 147*b359c84fSLuke Lau; NO-ZBA-NEXT: add a0, a0, a1 148*b359c84fSLuke Lau; NO-ZBA-NEXT: add a0, a0, a2 149*b359c84fSLuke Lau; NO-ZBA-NEXT: sw a5, 0(a0) 150*b359c84fSLuke Lau; NO-ZBA-NEXT: sw a5, 4(a0) 151*b359c84fSLuke Lau; NO-ZBA-NEXT: sw a4, 120(a0) 152*b359c84fSLuke Lau; NO-ZBA-NEXT: ret 153*b359c84fSLuke Lau; 154*b359c84fSLuke Lau; ZBA-LABEL: add_shl_moreOneUse_inSelect_addexceedsign12: 155*b359c84fSLuke Lau; ZBA: # %bb.0: # %entry 156*b359c84fSLuke Lau; ZBA-NEXT: addi a4, a1, 2047 157*b359c84fSLuke Lau; ZBA-NEXT: addi a4, a4, 1 158*b359c84fSLuke Lau; ZBA-NEXT: mv a5, a4 159*b359c84fSLuke Lau; ZBA-NEXT: bgtz a3, .LBB4_2 160*b359c84fSLuke Lau; ZBA-NEXT: # %bb.1: # %entry 161*b359c84fSLuke Lau; ZBA-NEXT: mv a5, a2 162*b359c84fSLuke Lau; ZBA-NEXT: .LBB4_2: # %entry 163*b359c84fSLuke Lau; ZBA-NEXT: lui a2, 2 164*b359c84fSLuke Lau; ZBA-NEXT: sh2add a0, a1, a0 165*b359c84fSLuke Lau; ZBA-NEXT: add a0, a0, a2 166*b359c84fSLuke Lau; ZBA-NEXT: sw a5, 0(a0) 167*b359c84fSLuke Lau; ZBA-NEXT: sw a5, 4(a0) 168*b359c84fSLuke Lau; ZBA-NEXT: sw a4, 120(a0) 169*b359c84fSLuke Lau; ZBA-NEXT: ret 1703083acc2SLiqinWengentry: 1713083acc2SLiqinWeng %add = add nsw i32 %a, 2048 1723083acc2SLiqinWeng %cmp = icmp sgt i32 %x, 0 1733083acc2SLiqinWeng %spec.select = select i1 %cmp, i32 %add, i32 %b 1743083acc2SLiqinWeng %0 = getelementptr inbounds i32, ptr %array1, i32 %add 1753083acc2SLiqinWeng store i32 %spec.select, ptr %0, align 4 1763083acc2SLiqinWeng %1 = getelementptr i32, ptr %array1, i32 %a 1773083acc2SLiqinWeng %arrayidx4 = getelementptr i8, ptr %1, i32 8196 1783083acc2SLiqinWeng store i32 %spec.select, ptr %arrayidx4 1793083acc2SLiqinWeng %arrayidx6 = getelementptr i8, ptr %1, i32 8312 1803083acc2SLiqinWeng store i32 %add, ptr %arrayidx6 1813083acc2SLiqinWeng ret void 1823083acc2SLiqinWeng} 183*b359c84fSLuke Lau 184*b359c84fSLuke Laudefine i32 @add_shl_moreOneUse_sh1add(i32 %x) { 185*b359c84fSLuke Lau; NO-ZBA-LABEL: add_shl_moreOneUse_sh1add: 186*b359c84fSLuke Lau; NO-ZBA: # %bb.0: 187*b359c84fSLuke Lau; NO-ZBA-NEXT: ori a1, a0, 1 188*b359c84fSLuke Lau; NO-ZBA-NEXT: slli a0, a0, 1 189*b359c84fSLuke Lau; NO-ZBA-NEXT: ori a0, a0, 2 190*b359c84fSLuke Lau; NO-ZBA-NEXT: add a0, a0, a1 191*b359c84fSLuke Lau; NO-ZBA-NEXT: ret 192*b359c84fSLuke Lau; 193*b359c84fSLuke Lau; ZBA-LABEL: add_shl_moreOneUse_sh1add: 194*b359c84fSLuke Lau; ZBA: # %bb.0: 195*b359c84fSLuke Lau; ZBA-NEXT: ori a0, a0, 1 196*b359c84fSLuke Lau; ZBA-NEXT: sh1add a0, a0, a0 197*b359c84fSLuke Lau; ZBA-NEXT: ret 198*b359c84fSLuke Lau %or = or i32 %x, 1 199*b359c84fSLuke Lau %mul = shl i32 %or, 1 200*b359c84fSLuke Lau %add = add i32 %mul, %or 201*b359c84fSLuke Lau ret i32 %add 202*b359c84fSLuke Lau} 203*b359c84fSLuke Lau 204*b359c84fSLuke Laudefine i32 @add_shl_moreOneUse_sh2add(i32 %x) { 205*b359c84fSLuke Lau; NO-ZBA-LABEL: add_shl_moreOneUse_sh2add: 206*b359c84fSLuke Lau; NO-ZBA: # %bb.0: 207*b359c84fSLuke Lau; NO-ZBA-NEXT: ori a1, a0, 1 208*b359c84fSLuke Lau; NO-ZBA-NEXT: slli a0, a0, 2 209*b359c84fSLuke Lau; NO-ZBA-NEXT: ori a0, a0, 4 210*b359c84fSLuke Lau; NO-ZBA-NEXT: add a0, a0, a1 211*b359c84fSLuke Lau; NO-ZBA-NEXT: ret 212*b359c84fSLuke Lau; 213*b359c84fSLuke Lau; ZBA-LABEL: add_shl_moreOneUse_sh2add: 214*b359c84fSLuke Lau; ZBA: # %bb.0: 215*b359c84fSLuke Lau; ZBA-NEXT: ori a0, a0, 1 216*b359c84fSLuke Lau; ZBA-NEXT: sh2add a0, a0, a0 217*b359c84fSLuke Lau; ZBA-NEXT: ret 218*b359c84fSLuke Lau %or = or i32 %x, 1 219*b359c84fSLuke Lau %mul = shl i32 %or, 2 220*b359c84fSLuke Lau %add = add i32 %mul, %or 221*b359c84fSLuke Lau ret i32 %add 222*b359c84fSLuke Lau} 223*b359c84fSLuke Lau 224*b359c84fSLuke Laudefine i32 @add_shl_moreOneUse_sh3add(i32 %x) { 225*b359c84fSLuke Lau; NO-ZBA-LABEL: add_shl_moreOneUse_sh3add: 226*b359c84fSLuke Lau; NO-ZBA: # %bb.0: 227*b359c84fSLuke Lau; NO-ZBA-NEXT: ori a1, a0, 1 228*b359c84fSLuke Lau; NO-ZBA-NEXT: slli a0, a0, 3 229*b359c84fSLuke Lau; NO-ZBA-NEXT: ori a0, a0, 8 230*b359c84fSLuke Lau; NO-ZBA-NEXT: add a0, a0, a1 231*b359c84fSLuke Lau; NO-ZBA-NEXT: ret 232*b359c84fSLuke Lau; 233*b359c84fSLuke Lau; ZBA-LABEL: add_shl_moreOneUse_sh3add: 234*b359c84fSLuke Lau; ZBA: # %bb.0: 235*b359c84fSLuke Lau; ZBA-NEXT: ori a0, a0, 1 236*b359c84fSLuke Lau; ZBA-NEXT: sh3add a0, a0, a0 237*b359c84fSLuke Lau; ZBA-NEXT: ret 238*b359c84fSLuke Lau %or = or i32 %x, 1 239*b359c84fSLuke Lau %mul = shl i32 %or, 3 240*b359c84fSLuke Lau %add = add i32 %mul, %or 241*b359c84fSLuke Lau ret i32 %add 242*b359c84fSLuke Lau} 243*b359c84fSLuke Lau 244*b359c84fSLuke Laudefine i32 @add_shl_moreOneUse_sh4add(i32 %x) { 245*b359c84fSLuke Lau; RV32-LABEL: add_shl_moreOneUse_sh4add: 246*b359c84fSLuke Lau; RV32: # %bb.0: 247*b359c84fSLuke Lau; RV32-NEXT: ori a1, a0, 1 248*b359c84fSLuke Lau; RV32-NEXT: slli a0, a0, 4 249*b359c84fSLuke Lau; RV32-NEXT: ori a0, a0, 16 250*b359c84fSLuke Lau; RV32-NEXT: add a0, a0, a1 251*b359c84fSLuke Lau; RV32-NEXT: ret 252*b359c84fSLuke Lau %or = or i32 %x, 1 253*b359c84fSLuke Lau %mul = shl i32 %or, 4 254*b359c84fSLuke Lau %add = add i32 %mul, %or 255*b359c84fSLuke Lau ret i32 %add 256*b359c84fSLuke Lau} 257