334 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=riscv32 < %s | FileCheck -check-prefixes=RV32,NO-ZBA %s3; RUN: llc -mtriple=riscv32 -mattr=+zba < %s | FileCheck -check-prefixes=RV32,ZBA %s4; RUN: llc -mtriple=riscv32 -mattr=+xandesperf < %s | FileCheck -check-prefixes=RV32,XANDESPERF %s5 6define i32 @add_shl_oneUse(i32 %x, i32 %y) nounwind {7; NO-ZBA-LABEL: add_shl_oneUse:8; NO-ZBA: # %bb.0:9; NO-ZBA-NEXT: slli a0, a0, 310; NO-ZBA-NEXT: add a0, a0, a111; NO-ZBA-NEXT: addi a0, a0, 98412; NO-ZBA-NEXT: ret13;14; ZBA-LABEL: add_shl_oneUse:15; ZBA: # %bb.0:16; ZBA-NEXT: addi a0, a0, 12317; ZBA-NEXT: sh3add a0, a0, a118; ZBA-NEXT: ret19;20; XANDESPERF-LABEL: add_shl_oneUse:21; XANDESPERF: # %bb.0:22; XANDESPERF-NEXT: addi a0, a0, 12323; XANDESPERF-NEXT: nds.lea.d a0, a1, a024; XANDESPERF-NEXT: ret25 %add.0 = add i32 %x, 12326 %shl = shl i32 %add.0, 327 %add.1 = add i32 %shl, %y28 ret i32 %add.129}30 31define void @add_shl_moreOneUse_inStore(ptr %array1, i32 %a, i32 %b) {32; NO-ZBA-LABEL: add_shl_moreOneUse_inStore:33; NO-ZBA: # %bb.0: # %entry34; NO-ZBA-NEXT: addi a3, a1, 535; NO-ZBA-NEXT: slli a1, a1, 236; NO-ZBA-NEXT: add a0, a0, a137; NO-ZBA-NEXT: sw a2, 20(a0)38; NO-ZBA-NEXT: sw a2, 24(a0)39; NO-ZBA-NEXT: sw a3, 140(a0)40; NO-ZBA-NEXT: ret41;42; ZBA-LABEL: add_shl_moreOneUse_inStore:43; ZBA: # %bb.0: # %entry44; ZBA-NEXT: addi a3, a1, 545; ZBA-NEXT: sh2add a0, a1, a046; ZBA-NEXT: sw a2, 20(a0)47; ZBA-NEXT: sw a2, 24(a0)48; ZBA-NEXT: sw a3, 140(a0)49; ZBA-NEXT: ret50;51; XANDESPERF-LABEL: add_shl_moreOneUse_inStore:52; XANDESPERF: # %bb.0: # %entry53; XANDESPERF-NEXT: addi a3, a1, 554; XANDESPERF-NEXT: nds.lea.w a0, a0, a155; XANDESPERF-NEXT: sw a2, 20(a0)56; XANDESPERF-NEXT: sw a2, 24(a0)57; XANDESPERF-NEXT: sw a3, 140(a0)58; XANDESPERF-NEXT: ret59entry:60 %add = add nsw i32 %a, 561 %arrayidx = getelementptr inbounds i32, ptr %array1, i32 %add62 store i32 %b, ptr %arrayidx63 %0 = getelementptr i32, ptr %array1, i32 %a64 %arrayidx3 = getelementptr i8, ptr %0, i32 2465 store i32 %b, ptr %arrayidx366 %arrayidx5 = getelementptr i8, ptr %0, i32 14067 store i32 %add, ptr %arrayidx568 ret void69}70 71define void @add_shl_moreOneUse_inStore_addexceedsign12(ptr %array1, i32 %a, i32 %b) {72; NO-ZBA-LABEL: add_shl_moreOneUse_inStore_addexceedsign12:73; NO-ZBA: # %bb.0: # %entry74; NO-ZBA-NEXT: addi a3, a1, 204775; NO-ZBA-NEXT: lui a4, 276; NO-ZBA-NEXT: slli a1, a1, 277; NO-ZBA-NEXT: addi a3, a3, 178; NO-ZBA-NEXT: add a0, a0, a179; NO-ZBA-NEXT: add a0, a0, a480; NO-ZBA-NEXT: sw a2, 0(a0)81; NO-ZBA-NEXT: sw a3, 4(a0)82; NO-ZBA-NEXT: sw a2, 120(a0)83; NO-ZBA-NEXT: ret84;85; ZBA-LABEL: add_shl_moreOneUse_inStore_addexceedsign12:86; ZBA: # %bb.0: # %entry87; ZBA-NEXT: addi a3, a1, 204788; ZBA-NEXT: lui a4, 289; ZBA-NEXT: sh2add a0, a1, a090; ZBA-NEXT: addi a3, a3, 191; ZBA-NEXT: add a0, a0, a492; ZBA-NEXT: sw a2, 0(a0)93; ZBA-NEXT: sw a3, 4(a0)94; ZBA-NEXT: sw a2, 120(a0)95; ZBA-NEXT: ret96;97; XANDESPERF-LABEL: add_shl_moreOneUse_inStore_addexceedsign12:98; XANDESPERF: # %bb.0: # %entry99; XANDESPERF-NEXT: addi a3, a1, 2047100; XANDESPERF-NEXT: lui a4, 2101; XANDESPERF-NEXT: nds.lea.w a0, a0, a1102; XANDESPERF-NEXT: addi a3, a3, 1103; XANDESPERF-NEXT: add a0, a0, a4104; XANDESPERF-NEXT: sw a2, 0(a0)105; XANDESPERF-NEXT: sw a3, 4(a0)106; XANDESPERF-NEXT: sw a2, 120(a0)107; XANDESPERF-NEXT: ret108entry:109 %add = add nsw i32 %a, 2048110 %arrayidx = getelementptr inbounds i32, ptr %array1, i32 %add111 store i32 %b, ptr %arrayidx112 %0 = getelementptr i32, ptr %array1, i32 %a113 %arrayidx2 = getelementptr i8, ptr %0, i32 8196114 store i32 %add, ptr %arrayidx2115 %arrayidx4 = getelementptr i8, ptr %0, i32 8312116 store i32 %b, ptr %arrayidx4117 ret void118}119 120define void @add_shl_moreOneUse_inSelect(ptr %array1, i32 %a, i32 %b, i32 %x) {121; NO-ZBA-LABEL: add_shl_moreOneUse_inSelect:122; NO-ZBA: # %bb.0: # %entry123; NO-ZBA-NEXT: addi a4, a1, 5124; NO-ZBA-NEXT: mv a5, a4125; NO-ZBA-NEXT: bgtz a3, .LBB3_2126; NO-ZBA-NEXT: # %bb.1: # %entry127; NO-ZBA-NEXT: mv a5, a2128; NO-ZBA-NEXT: .LBB3_2: # %entry129; NO-ZBA-NEXT: slli a1, a1, 2130; NO-ZBA-NEXT: add a0, a0, a1131; NO-ZBA-NEXT: sw a5, 20(a0)132; NO-ZBA-NEXT: sw a5, 24(a0)133; NO-ZBA-NEXT: sw a4, 140(a0)134; NO-ZBA-NEXT: ret135;136; ZBA-LABEL: add_shl_moreOneUse_inSelect:137; ZBA: # %bb.0: # %entry138; ZBA-NEXT: addi a4, a1, 5139; ZBA-NEXT: mv a5, a4140; ZBA-NEXT: bgtz a3, .LBB3_2141; ZBA-NEXT: # %bb.1: # %entry142; ZBA-NEXT: mv a5, a2143; ZBA-NEXT: .LBB3_2: # %entry144; ZBA-NEXT: sh2add a0, a1, a0145; ZBA-NEXT: sw a5, 20(a0)146; ZBA-NEXT: sw a5, 24(a0)147; ZBA-NEXT: sw a4, 140(a0)148; ZBA-NEXT: ret149;150; XANDESPERF-LABEL: add_shl_moreOneUse_inSelect:151; XANDESPERF: # %bb.0: # %entry152; XANDESPERF-NEXT: addi a4, a1, 5153; XANDESPERF-NEXT: mv a5, a4154; XANDESPERF-NEXT: bgtz a3, .LBB3_2155; XANDESPERF-NEXT: # %bb.1: # %entry156; XANDESPERF-NEXT: mv a5, a2157; XANDESPERF-NEXT: .LBB3_2: # %entry158; XANDESPERF-NEXT: nds.lea.w a0, a0, a1159; XANDESPERF-NEXT: sw a5, 20(a0)160; XANDESPERF-NEXT: sw a5, 24(a0)161; XANDESPERF-NEXT: sw a4, 140(a0)162; XANDESPERF-NEXT: ret163entry:164 %add = add nsw i32 %a, 5165 %cmp = icmp sgt i32 %x, 0166 %cond = select i1 %cmp, i32 %add, i32 %b167 %arrayidx = getelementptr inbounds i32, ptr %array1, i32 %add168 store i32 %cond, ptr %arrayidx169 %0 = getelementptr i32, ptr %array1, i32 %a170 %arrayidx2 = getelementptr i32, ptr %0, i32 6171 store i32 %cond, ptr %arrayidx2172 %arrayidx4 = getelementptr i32, ptr %0, i32 35173 store i32 %add, ptr %arrayidx4174 ret void175}176 177define void @add_shl_moreOneUse_inSelect_addexceedsign12(ptr %array1, i32 %a, i32 %b, i32 %x) {178; NO-ZBA-LABEL: add_shl_moreOneUse_inSelect_addexceedsign12:179; NO-ZBA: # %bb.0: # %entry180; NO-ZBA-NEXT: addi a4, a1, 2047181; NO-ZBA-NEXT: addi a4, a4, 1182; NO-ZBA-NEXT: mv a5, a4183; NO-ZBA-NEXT: bgtz a3, .LBB4_2184; NO-ZBA-NEXT: # %bb.1: # %entry185; NO-ZBA-NEXT: mv a5, a2186; NO-ZBA-NEXT: .LBB4_2: # %entry187; NO-ZBA-NEXT: lui a2, 2188; NO-ZBA-NEXT: slli a1, a1, 2189; NO-ZBA-NEXT: add a0, a0, a1190; NO-ZBA-NEXT: add a0, a0, a2191; NO-ZBA-NEXT: sw a5, 0(a0)192; NO-ZBA-NEXT: sw a5, 4(a0)193; NO-ZBA-NEXT: sw a4, 120(a0)194; NO-ZBA-NEXT: ret195;196; ZBA-LABEL: add_shl_moreOneUse_inSelect_addexceedsign12:197; ZBA: # %bb.0: # %entry198; ZBA-NEXT: addi a4, a1, 2047199; ZBA-NEXT: addi a4, a4, 1200; ZBA-NEXT: mv a5, a4201; ZBA-NEXT: bgtz a3, .LBB4_2202; ZBA-NEXT: # %bb.1: # %entry203; ZBA-NEXT: mv a5, a2204; ZBA-NEXT: .LBB4_2: # %entry205; ZBA-NEXT: lui a2, 2206; ZBA-NEXT: sh2add a0, a1, a0207; ZBA-NEXT: add a0, a0, a2208; ZBA-NEXT: sw a5, 0(a0)209; ZBA-NEXT: sw a5, 4(a0)210; ZBA-NEXT: sw a4, 120(a0)211; ZBA-NEXT: ret212;213; XANDESPERF-LABEL: add_shl_moreOneUse_inSelect_addexceedsign12:214; XANDESPERF: # %bb.0: # %entry215; XANDESPERF-NEXT: addi a4, a1, 2047216; XANDESPERF-NEXT: addi a4, a4, 1217; XANDESPERF-NEXT: mv a5, a4218; XANDESPERF-NEXT: bgtz a3, .LBB4_2219; XANDESPERF-NEXT: # %bb.1: # %entry220; XANDESPERF-NEXT: mv a5, a2221; XANDESPERF-NEXT: .LBB4_2: # %entry222; XANDESPERF-NEXT: lui a2, 2223; XANDESPERF-NEXT: nds.lea.w a0, a0, a1224; XANDESPERF-NEXT: add a0, a0, a2225; XANDESPERF-NEXT: sw a5, 0(a0)226; XANDESPERF-NEXT: sw a5, 4(a0)227; XANDESPERF-NEXT: sw a4, 120(a0)228; XANDESPERF-NEXT: ret229entry:230 %add = add nsw i32 %a, 2048231 %cmp = icmp sgt i32 %x, 0232 %spec.select = select i1 %cmp, i32 %add, i32 %b233 %0 = getelementptr inbounds i32, ptr %array1, i32 %add234 store i32 %spec.select, ptr %0, align 4235 %1 = getelementptr i32, ptr %array1, i32 %a236 %arrayidx4 = getelementptr i8, ptr %1, i32 8196237 store i32 %spec.select, ptr %arrayidx4238 %arrayidx6 = getelementptr i8, ptr %1, i32 8312239 store i32 %add, ptr %arrayidx6240 ret void241}242 243define i32 @add_shl_moreOneUse_sh1add(i32 %x) {244; NO-ZBA-LABEL: add_shl_moreOneUse_sh1add:245; NO-ZBA: # %bb.0:246; NO-ZBA-NEXT: ori a1, a0, 1247; NO-ZBA-NEXT: slli a0, a0, 1248; NO-ZBA-NEXT: ori a0, a0, 2249; NO-ZBA-NEXT: add a0, a0, a1250; NO-ZBA-NEXT: ret251;252; ZBA-LABEL: add_shl_moreOneUse_sh1add:253; ZBA: # %bb.0:254; ZBA-NEXT: ori a0, a0, 1255; ZBA-NEXT: sh1add a0, a0, a0256; ZBA-NEXT: ret257;258; XANDESPERF-LABEL: add_shl_moreOneUse_sh1add:259; XANDESPERF: # %bb.0:260; XANDESPERF-NEXT: ori a0, a0, 1261; XANDESPERF-NEXT: nds.lea.h a0, a0, a0262; XANDESPERF-NEXT: ret263 %or = or i32 %x, 1264 %mul = shl i32 %or, 1265 %add = add i32 %mul, %or266 ret i32 %add267}268 269define i32 @add_shl_moreOneUse_sh2add(i32 %x) {270; NO-ZBA-LABEL: add_shl_moreOneUse_sh2add:271; NO-ZBA: # %bb.0:272; NO-ZBA-NEXT: ori a1, a0, 1273; NO-ZBA-NEXT: slli a0, a0, 2274; NO-ZBA-NEXT: ori a0, a0, 4275; NO-ZBA-NEXT: add a0, a0, a1276; NO-ZBA-NEXT: ret277;278; ZBA-LABEL: add_shl_moreOneUse_sh2add:279; ZBA: # %bb.0:280; ZBA-NEXT: ori a0, a0, 1281; ZBA-NEXT: sh2add a0, a0, a0282; ZBA-NEXT: ret283;284; XANDESPERF-LABEL: add_shl_moreOneUse_sh2add:285; XANDESPERF: # %bb.0:286; XANDESPERF-NEXT: ori a0, a0, 1287; XANDESPERF-NEXT: nds.lea.w a0, a0, a0288; XANDESPERF-NEXT: ret289 %or = or i32 %x, 1290 %mul = shl i32 %or, 2291 %add = add i32 %mul, %or292 ret i32 %add293}294 295define i32 @add_shl_moreOneUse_sh3add(i32 %x) {296; NO-ZBA-LABEL: add_shl_moreOneUse_sh3add:297; NO-ZBA: # %bb.0:298; NO-ZBA-NEXT: ori a1, a0, 1299; NO-ZBA-NEXT: slli a0, a0, 3300; NO-ZBA-NEXT: ori a0, a0, 8301; NO-ZBA-NEXT: add a0, a0, a1302; NO-ZBA-NEXT: ret303;304; ZBA-LABEL: add_shl_moreOneUse_sh3add:305; ZBA: # %bb.0:306; ZBA-NEXT: ori a0, a0, 1307; ZBA-NEXT: sh3add a0, a0, a0308; ZBA-NEXT: ret309;310; XANDESPERF-LABEL: add_shl_moreOneUse_sh3add:311; XANDESPERF: # %bb.0:312; XANDESPERF-NEXT: ori a0, a0, 1313; XANDESPERF-NEXT: nds.lea.d a0, a0, a0314; XANDESPERF-NEXT: ret315 %or = or i32 %x, 1316 %mul = shl i32 %or, 3317 %add = add i32 %mul, %or318 ret i32 %add319}320 321define i32 @add_shl_moreOneUse_sh4add(i32 %x) {322; RV32-LABEL: add_shl_moreOneUse_sh4add:323; RV32: # %bb.0:324; RV32-NEXT: ori a1, a0, 1325; RV32-NEXT: slli a0, a0, 4326; RV32-NEXT: ori a0, a0, 16327; RV32-NEXT: add a0, a0, a1328; RV32-NEXT: ret329 %or = or i32 %x, 1330 %mul = shl i32 %or, 4331 %add = add i32 %mul, %or332 ret i32 %add333}334