459 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; RUN: llc -mtriple=riscv64 < %s | FileCheck -check-prefixes=RV64,NO-ZBA %s3; RUN: llc -mtriple=riscv64 -mattr=+zba < %s | FileCheck -check-prefixes=RV64,ZBA %s4; RUN: llc -mtriple=riscv64 -mattr=+xandesperf < %s | FileCheck -check-prefixes=RV64,XANDESPERF %s5 6define void @add_sext_shl_moreOneUse_add(ptr %array1, i32 %a, i32 %b) {7; NO-ZBA-LABEL: add_sext_shl_moreOneUse_add:8; NO-ZBA: # %bb.0: # %entry9; NO-ZBA-NEXT: addi a3, a1, 510; NO-ZBA-NEXT: sext.w a1, a111; NO-ZBA-NEXT: slli a1, a1, 212; NO-ZBA-NEXT: add a0, a1, a013; NO-ZBA-NEXT: sw a2, 20(a0)14; NO-ZBA-NEXT: sw a2, 24(a0)15; NO-ZBA-NEXT: sw a3, 140(a0)16; NO-ZBA-NEXT: ret17;18; ZBA-LABEL: add_sext_shl_moreOneUse_add:19; ZBA: # %bb.0: # %entry20; ZBA-NEXT: addi a3, a1, 521; ZBA-NEXT: sext.w a1, a122; ZBA-NEXT: sh2add a0, a1, a023; ZBA-NEXT: sw a2, 20(a0)24; ZBA-NEXT: sw a2, 24(a0)25; ZBA-NEXT: sw a3, 140(a0)26; ZBA-NEXT: ret27;28; XANDESPERF-LABEL: add_sext_shl_moreOneUse_add:29; XANDESPERF: # %bb.0: # %entry30; XANDESPERF-NEXT: addi a3, a1, 531; XANDESPERF-NEXT: sext.w a1, a132; XANDESPERF-NEXT: nds.lea.w a0, a0, a133; XANDESPERF-NEXT: sw a2, 20(a0)34; XANDESPERF-NEXT: sw a2, 24(a0)35; XANDESPERF-NEXT: sw a3, 140(a0)36; XANDESPERF-NEXT: ret37entry:38 %add = add nsw i32 %a, 539 %idxprom = sext i32 %add to i6440 %arrayidx = getelementptr inbounds i32, ptr %array1, i64 %idxprom41 store i32 %b, ptr %arrayidx42 %add3 = add nsw i32 %a, 643 %idxprom4 = sext i32 %add3 to i6444 %arrayidx5 = getelementptr inbounds i32, ptr %array1, i64 %idxprom445 store i32 %b, ptr %arrayidx546 %add6 = add nsw i32 %a, 3547 %idxprom7 = sext i32 %add6 to i6448 %arrayidx8 = getelementptr inbounds i32, ptr %array1, i64 %idxprom749 store i32 %add, ptr %arrayidx850 ret void51}52 53define void @add_sext_shl_moreOneUse_addexceedsign12(ptr %array1, i32 %a, i32 %b) {54; NO-ZBA-LABEL: add_sext_shl_moreOneUse_addexceedsign12:55; NO-ZBA: # %bb.0: # %entry56; NO-ZBA-NEXT: addi a3, a1, 204757; NO-ZBA-NEXT: lui a4, 258; NO-ZBA-NEXT: sext.w a1, a159; NO-ZBA-NEXT: addi a3, a3, 160; NO-ZBA-NEXT: slli a1, a1, 261; NO-ZBA-NEXT: add a0, a0, a462; NO-ZBA-NEXT: add a0, a0, a163; NO-ZBA-NEXT: sw a2, 0(a0)64; NO-ZBA-NEXT: sw a3, 4(a0)65; NO-ZBA-NEXT: sw a2, 120(a0)66; NO-ZBA-NEXT: ret67;68; ZBA-LABEL: add_sext_shl_moreOneUse_addexceedsign12:69; ZBA: # %bb.0: # %entry70; ZBA-NEXT: addi a3, a1, 204771; ZBA-NEXT: lui a4, 272; ZBA-NEXT: sext.w a1, a173; ZBA-NEXT: addi a3, a3, 174; ZBA-NEXT: sh2add a0, a1, a075; ZBA-NEXT: add a0, a0, a476; ZBA-NEXT: sw a2, 0(a0)77; ZBA-NEXT: sw a3, 4(a0)78; ZBA-NEXT: sw a2, 120(a0)79; ZBA-NEXT: ret80;81; XANDESPERF-LABEL: add_sext_shl_moreOneUse_addexceedsign12:82; XANDESPERF: # %bb.0: # %entry83; XANDESPERF-NEXT: addi a3, a1, 204784; XANDESPERF-NEXT: lui a4, 285; XANDESPERF-NEXT: sext.w a1, a186; XANDESPERF-NEXT: addi a3, a3, 187; XANDESPERF-NEXT: nds.lea.w a0, a0, a188; XANDESPERF-NEXT: add a0, a0, a489; XANDESPERF-NEXT: sw a2, 0(a0)90; XANDESPERF-NEXT: sw a3, 4(a0)91; XANDESPERF-NEXT: sw a2, 120(a0)92; XANDESPERF-NEXT: ret93entry:94 %add = add nsw i32 %a, 204895 %idxprom = sext i32 %add to i6496 %arrayidx = getelementptr inbounds i32, ptr %array1, i64 %idxprom97 store i32 %b, ptr %arrayidx98 %0 = sext i32 %a to i6499 %1 = getelementptr i32, ptr %array1, i64 %0100 %arrayidx3 = getelementptr i8, ptr %1, i64 8196101 store i32 %add, ptr %arrayidx3102 %arrayidx6 = getelementptr i8, ptr %1, i64 8312103 store i32 %b, ptr %arrayidx6104 ret void105}106 107define void @add_sext_shl_moreOneUse_sext(ptr %array1, i32 %a, i32 %b) {108; NO-ZBA-LABEL: add_sext_shl_moreOneUse_sext:109; NO-ZBA: # %bb.0: # %entry110; NO-ZBA-NEXT: sext.w a1, a1111; NO-ZBA-NEXT: addi a3, a1, 5112; NO-ZBA-NEXT: slli a1, a1, 2113; NO-ZBA-NEXT: add a0, a1, a0114; NO-ZBA-NEXT: sw a2, 20(a0)115; NO-ZBA-NEXT: sw a2, 24(a0)116; NO-ZBA-NEXT: sd a3, 140(a0)117; NO-ZBA-NEXT: ret118;119; ZBA-LABEL: add_sext_shl_moreOneUse_sext:120; ZBA: # %bb.0: # %entry121; ZBA-NEXT: sext.w a1, a1122; ZBA-NEXT: addi a3, a1, 5123; ZBA-NEXT: sh2add a0, a1, a0124; ZBA-NEXT: sw a2, 20(a0)125; ZBA-NEXT: sw a2, 24(a0)126; ZBA-NEXT: sd a3, 140(a0)127; ZBA-NEXT: ret128;129; XANDESPERF-LABEL: add_sext_shl_moreOneUse_sext:130; XANDESPERF: # %bb.0: # %entry131; XANDESPERF-NEXT: sext.w a1, a1132; XANDESPERF-NEXT: addi a3, a1, 5133; XANDESPERF-NEXT: nds.lea.w a0, a0, a1134; XANDESPERF-NEXT: sw a2, 20(a0)135; XANDESPERF-NEXT: sw a2, 24(a0)136; XANDESPERF-NEXT: sd a3, 140(a0)137; XANDESPERF-NEXT: ret138entry:139 %add = add nsw i32 %a, 5140 %idxprom = sext i32 %add to i64141 %arrayidx = getelementptr inbounds i32, ptr %array1, i64 %idxprom142 store i32 %b, ptr %arrayidx143 %add3 = add nsw i32 %a, 6144 %idxprom4 = sext i32 %add3 to i64145 %arrayidx5 = getelementptr inbounds i32, ptr %array1, i64 %idxprom4146 store i32 %b, ptr %arrayidx5147 %add6 = add nsw i32 %a, 35148 %idxprom7 = sext i32 %add6 to i64149 %arrayidx8 = getelementptr inbounds i32, ptr %array1, i64 %idxprom7150 store i64 %idxprom, ptr %arrayidx8151 ret void152}153 154; test of jumpping, find add's operand has one more use can simplified155define void @add_sext_shl_moreOneUse_add_inSelect(ptr %array1, i32 signext %a, i32 %b, i32 signext %x) {156; NO-ZBA-LABEL: add_sext_shl_moreOneUse_add_inSelect:157; NO-ZBA: # %bb.0: # %entry158; NO-ZBA-NEXT: addi a4, a1, 5159; NO-ZBA-NEXT: mv a5, a4160; NO-ZBA-NEXT: bgtz a3, .LBB3_2161; NO-ZBA-NEXT: # %bb.1: # %entry162; NO-ZBA-NEXT: mv a5, a2163; NO-ZBA-NEXT: .LBB3_2: # %entry164; NO-ZBA-NEXT: slli a1, a1, 2165; NO-ZBA-NEXT: add a0, a1, a0166; NO-ZBA-NEXT: sw a5, 20(a0)167; NO-ZBA-NEXT: sw a5, 24(a0)168; NO-ZBA-NEXT: sw a4, 140(a0)169; NO-ZBA-NEXT: ret170;171; ZBA-LABEL: add_sext_shl_moreOneUse_add_inSelect:172; ZBA: # %bb.0: # %entry173; ZBA-NEXT: addi a4, a1, 5174; ZBA-NEXT: mv a5, a4175; ZBA-NEXT: bgtz a3, .LBB3_2176; ZBA-NEXT: # %bb.1: # %entry177; ZBA-NEXT: mv a5, a2178; ZBA-NEXT: .LBB3_2: # %entry179; ZBA-NEXT: sh2add a0, a1, a0180; ZBA-NEXT: sw a5, 20(a0)181; ZBA-NEXT: sw a5, 24(a0)182; ZBA-NEXT: sw a4, 140(a0)183; ZBA-NEXT: ret184;185; XANDESPERF-LABEL: add_sext_shl_moreOneUse_add_inSelect:186; XANDESPERF: # %bb.0: # %entry187; XANDESPERF-NEXT: addi a4, a1, 5188; XANDESPERF-NEXT: mv a5, a4189; XANDESPERF-NEXT: bgtz a3, .LBB3_2190; XANDESPERF-NEXT: # %bb.1: # %entry191; XANDESPERF-NEXT: mv a5, a2192; XANDESPERF-NEXT: .LBB3_2: # %entry193; XANDESPERF-NEXT: nds.lea.w a0, a0, a1194; XANDESPERF-NEXT: sw a5, 20(a0)195; XANDESPERF-NEXT: sw a5, 24(a0)196; XANDESPERF-NEXT: sw a4, 140(a0)197; XANDESPERF-NEXT: ret198entry:199 %add = add nsw i32 %a, 5200 %cmp = icmp sgt i32 %x, 0201 %idxprom = sext i32 %add to i64202 %arrayidx = getelementptr inbounds i32, ptr %array1, i64 %idxprom203 %add.b = select i1 %cmp, i32 %add, i32 %b204 store i32 %add.b, ptr %arrayidx205 %add5 = add nsw i32 %a, 6206 %idxprom6 = sext i32 %add5 to i64207 %arrayidx7 = getelementptr inbounds i32, ptr %array1, i64 %idxprom6208 store i32 %add.b, ptr %arrayidx7209 %add8 = add nsw i32 %a, 35210 %idxprom9 = sext i32 %add8 to i64211 %arrayidx10 = getelementptr inbounds i32, ptr %array1, i64 %idxprom9212 store i32 %add, ptr %arrayidx10213 ret void214}215 216define void @add_sext_shl_moreOneUse_add_inSelect_addexceedsign12(ptr %array1, i32 signext %a, i32 %b, i32 signext %x) {217; NO-ZBA-LABEL: add_sext_shl_moreOneUse_add_inSelect_addexceedsign12:218; NO-ZBA: # %bb.0: # %entry219; NO-ZBA-NEXT: addi a4, a1, 2047220; NO-ZBA-NEXT: lui a5, 2221; NO-ZBA-NEXT: slli a6, a1, 2222; NO-ZBA-NEXT: addi a1, a4, 1223; NO-ZBA-NEXT: add a0, a0, a6224; NO-ZBA-NEXT: add a0, a0, a5225; NO-ZBA-NEXT: mv a4, a1226; NO-ZBA-NEXT: bgtz a3, .LBB4_2227; NO-ZBA-NEXT: # %bb.1: # %entry228; NO-ZBA-NEXT: mv a4, a2229; NO-ZBA-NEXT: .LBB4_2: # %entry230; NO-ZBA-NEXT: sw a4, 0(a0)231; NO-ZBA-NEXT: sw a4, 4(a0)232; NO-ZBA-NEXT: sw a1, 120(a0)233; NO-ZBA-NEXT: ret234;235; ZBA-LABEL: add_sext_shl_moreOneUse_add_inSelect_addexceedsign12:236; ZBA: # %bb.0: # %entry237; ZBA-NEXT: addi a4, a1, 2047238; ZBA-NEXT: lui a5, 2239; ZBA-NEXT: addi a4, a4, 1240; ZBA-NEXT: sh2add a0, a1, a0241; ZBA-NEXT: add a0, a0, a5242; ZBA-NEXT: mv a1, a4243; ZBA-NEXT: bgtz a3, .LBB4_2244; ZBA-NEXT: # %bb.1: # %entry245; ZBA-NEXT: mv a1, a2246; ZBA-NEXT: .LBB4_2: # %entry247; ZBA-NEXT: sw a1, 0(a0)248; ZBA-NEXT: sw a1, 4(a0)249; ZBA-NEXT: sw a4, 120(a0)250; ZBA-NEXT: ret251;252; XANDESPERF-LABEL: add_sext_shl_moreOneUse_add_inSelect_addexceedsign12:253; XANDESPERF: # %bb.0: # %entry254; XANDESPERF-NEXT: addi a4, a1, 2047255; XANDESPERF-NEXT: lui a5, 2256; XANDESPERF-NEXT: addi a4, a4, 1257; XANDESPERF-NEXT: nds.lea.w a0, a0, a1258; XANDESPERF-NEXT: add a0, a0, a5259; XANDESPERF-NEXT: mv a1, a4260; XANDESPERF-NEXT: bgtz a3, .LBB4_2261; XANDESPERF-NEXT: # %bb.1: # %entry262; XANDESPERF-NEXT: mv a1, a2263; XANDESPERF-NEXT: .LBB4_2: # %entry264; XANDESPERF-NEXT: sw a1, 0(a0)265; XANDESPERF-NEXT: sw a1, 4(a0)266; XANDESPERF-NEXT: sw a4, 120(a0)267; XANDESPERF-NEXT: ret268entry:269 %add = add nsw i32 %a, 2048270 %cmp = icmp sgt i32 %x, 0271 %idxprom = sext i32 %add to i64272 %arrayidx = getelementptr inbounds i32, ptr %array1, i64 %idxprom273 %add.b = select i1 %cmp, i32 %add, i32 %b274 store i32 %add.b, ptr %arrayidx275 %0 = sext i32 %a to i64276 %1 = getelementptr i32, ptr %array1, i64 %0277 %arrayidx7 = getelementptr i8, ptr %1, i64 8196278 store i32 %add.b, ptr %arrayidx7279 %arrayidx10 = getelementptr i8, ptr %1, i64 8312280 store i32 %add, ptr %arrayidx10281 ret void282}283 284define void @add_shl_moreOneUse_inSelect(ptr %array1, i64 %a, i64 %b, i64 %x) {285; NO-ZBA-LABEL: add_shl_moreOneUse_inSelect:286; NO-ZBA: # %bb.0: # %entry287; NO-ZBA-NEXT: addi a4, a1, 5288; NO-ZBA-NEXT: mv a5, a4289; NO-ZBA-NEXT: bgtz a3, .LBB5_2290; NO-ZBA-NEXT: # %bb.1: # %entry291; NO-ZBA-NEXT: mv a5, a2292; NO-ZBA-NEXT: .LBB5_2: # %entry293; NO-ZBA-NEXT: slli a1, a1, 3294; NO-ZBA-NEXT: add a0, a1, a0295; NO-ZBA-NEXT: sd a5, 40(a0)296; NO-ZBA-NEXT: sd a5, 48(a0)297; NO-ZBA-NEXT: sd a4, 280(a0)298; NO-ZBA-NEXT: ret299;300; ZBA-LABEL: add_shl_moreOneUse_inSelect:301; ZBA: # %bb.0: # %entry302; ZBA-NEXT: addi a4, a1, 5303; ZBA-NEXT: mv a5, a4304; ZBA-NEXT: bgtz a3, .LBB5_2305; ZBA-NEXT: # %bb.1: # %entry306; ZBA-NEXT: mv a5, a2307; ZBA-NEXT: .LBB5_2: # %entry308; ZBA-NEXT: sh3add a0, a1, a0309; ZBA-NEXT: sd a5, 40(a0)310; ZBA-NEXT: sd a5, 48(a0)311; ZBA-NEXT: sd a4, 280(a0)312; ZBA-NEXT: ret313;314; XANDESPERF-LABEL: add_shl_moreOneUse_inSelect:315; XANDESPERF: # %bb.0: # %entry316; XANDESPERF-NEXT: addi a4, a1, 5317; XANDESPERF-NEXT: mv a5, a4318; XANDESPERF-NEXT: bgtz a3, .LBB5_2319; XANDESPERF-NEXT: # %bb.1: # %entry320; XANDESPERF-NEXT: mv a5, a2321; XANDESPERF-NEXT: .LBB5_2: # %entry322; XANDESPERF-NEXT: nds.lea.d a0, a0, a1323; XANDESPERF-NEXT: sd a5, 40(a0)324; XANDESPERF-NEXT: sd a5, 48(a0)325; XANDESPERF-NEXT: sd a4, 280(a0)326; XANDESPERF-NEXT: ret327entry:328 %add = add nsw i64 %a, 5329 %cmp = icmp sgt i64 %x, 0330 %spec.select = select i1 %cmp, i64 %add, i64 %b331 %0 = getelementptr inbounds i64, ptr %array1, i64 %add332 store i64 %spec.select, ptr %0333 %add3 = add nsw i64 %a, 6334 %arrayidx4 = getelementptr inbounds i64, ptr %array1, i64 %add3335 store i64 %spec.select, ptr %arrayidx4336 %add5 = add nsw i64 %a, 35337 %arrayidx6 = getelementptr inbounds i64, ptr %array1, i64 %add5338 store i64 %add, ptr %arrayidx6339 ret void340}341 342define i64 @add_shl_moreOneUse_sh1add(i64 %x) {343; NO-ZBA-LABEL: add_shl_moreOneUse_sh1add:344; NO-ZBA: # %bb.0:345; NO-ZBA-NEXT: ori a1, a0, 1346; NO-ZBA-NEXT: slli a0, a0, 1347; NO-ZBA-NEXT: ori a0, a0, 2348; NO-ZBA-NEXT: add a0, a0, a1349; NO-ZBA-NEXT: ret350;351; ZBA-LABEL: add_shl_moreOneUse_sh1add:352; ZBA: # %bb.0:353; ZBA-NEXT: ori a0, a0, 1354; ZBA-NEXT: sh1add a0, a0, a0355; ZBA-NEXT: ret356;357; XANDESPERF-LABEL: add_shl_moreOneUse_sh1add:358; XANDESPERF: # %bb.0:359; XANDESPERF-NEXT: ori a0, a0, 1360; XANDESPERF-NEXT: nds.lea.h a0, a0, a0361; XANDESPERF-NEXT: ret362 %or = or i64 %x, 1363 %mul = shl i64 %or, 1364 %add = add i64 %mul, %or365 ret i64 %add366}367 368define i64 @add_shl_moreOneUse_sh2add(i64 %x) {369; NO-ZBA-LABEL: add_shl_moreOneUse_sh2add:370; NO-ZBA: # %bb.0:371; NO-ZBA-NEXT: ori a1, a0, 1372; NO-ZBA-NEXT: slli a0, a0, 2373; NO-ZBA-NEXT: ori a0, a0, 4374; NO-ZBA-NEXT: add a0, a0, a1375; NO-ZBA-NEXT: ret376;377; ZBA-LABEL: add_shl_moreOneUse_sh2add:378; ZBA: # %bb.0:379; ZBA-NEXT: ori a0, a0, 1380; ZBA-NEXT: sh2add a0, a0, a0381; ZBA-NEXT: ret382;383; XANDESPERF-LABEL: add_shl_moreOneUse_sh2add:384; XANDESPERF: # %bb.0:385; XANDESPERF-NEXT: ori a0, a0, 1386; XANDESPERF-NEXT: nds.lea.w a0, a0, a0387; XANDESPERF-NEXT: ret388 %or = or i64 %x, 1389 %mul = shl i64 %or, 2390 %add = add i64 %mul, %or391 ret i64 %add392}393 394define i64 @add_shl_moreOneUse_sh3add(i64 %x) {395; NO-ZBA-LABEL: add_shl_moreOneUse_sh3add:396; NO-ZBA: # %bb.0:397; NO-ZBA-NEXT: ori a1, a0, 1398; NO-ZBA-NEXT: slli a0, a0, 3399; NO-ZBA-NEXT: ori a0, a0, 8400; NO-ZBA-NEXT: add a0, a0, a1401; NO-ZBA-NEXT: ret402;403; ZBA-LABEL: add_shl_moreOneUse_sh3add:404; ZBA: # %bb.0:405; ZBA-NEXT: ori a0, a0, 1406; ZBA-NEXT: sh3add a0, a0, a0407; ZBA-NEXT: ret408;409; XANDESPERF-LABEL: add_shl_moreOneUse_sh3add:410; XANDESPERF: # %bb.0:411; XANDESPERF-NEXT: ori a0, a0, 1412; XANDESPERF-NEXT: nds.lea.d a0, a0, a0413; XANDESPERF-NEXT: ret414 %or = or i64 %x, 1415 %mul = shl i64 %or, 3416 %add = add i64 %mul, %or417 ret i64 %add418}419 420;; Covers a case which previously crashed (pr119527)421define i64 @add_shl_sext(i32 %1) {422; RV64-LABEL: add_shl_sext:423; RV64: # %bb.0:424; RV64-NEXT: addi a1, a0, 3425; RV64-NEXT: sllw a0, a1, a0426; RV64-NEXT: ret427 %3 = add i32 %1, 3428 %4 = shl i32 %3, %1429 %5 = sext i32 %4 to i64430 ret i64 %5431}432 433define i64 @add_shl_moreOneUse_sh4add(i64 %x) {434; RV64-LABEL: add_shl_moreOneUse_sh4add:435; RV64: # %bb.0:436; RV64-NEXT: ori a1, a0, 1437; RV64-NEXT: slli a0, a0, 4438; RV64-NEXT: ori a0, a0, 16439; RV64-NEXT: add a0, a0, a1440; RV64-NEXT: ret441 %or = or i64 %x, 1442 %mul = shl i64 %or, 4443 %add = add i64 %mul, %or444 ret i64 %add445}446 447define i64 @add_shl_rhs_constant(i64 %x, i64 %y) {448; RV64-LABEL: add_shl_rhs_constant:449; RV64: # %bb.0:450; RV64-NEXT: add a0, a0, a1451; RV64-NEXT: slli a0, a0, 3452; RV64-NEXT: ret453 %a = add i64 %x, 1454 %b = add i64 %y, %a455 %c = shl i64 %b, 3456 %d = add i64 %c, -8457 ret i64 %d458}459