1677 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=riscv64 -mattr=+m,+f,+zknh,+v -target-abi=lp64f \3; RUN: | FileCheck %s --check-prefixes=CHECK,RV64I4; RUN: llc < %s -mtriple=riscv64 -mattr=+m,+zba,+zbb,+zbkb,+f,+zknh,+v -target-abi=lp64f \5; RUN: | FileCheck %s --check-prefixes=CHECK,RV64ZBB6; RUN: llc < %s -mtriple=riscv64 -mattr=+m,+zba,+zbb,+zbkb,+f,+zknh,+v -target-abi=lp64f \7; RUN: -riscv-disable-sextw-removal | FileCheck %s --check-prefix=NOREMOVAL8 9define void @test1(i32 signext %arg, i32 signext %arg1) nounwind {10; CHECK-LABEL: test1:11; CHECK: # %bb.0: # %bb12; CHECK-NEXT: addi sp, sp, -3213; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill14; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill15; CHECK-NEXT: sd s1, 8(sp) # 8-byte Folded Spill16; CHECK-NEXT: mv s0, a117; CHECK-NEXT: sraw s1, a0, a118; CHECK-NEXT: .LBB0_1: # %bb219; CHECK-NEXT: # =>This Inner Loop Header: Depth=120; CHECK-NEXT: mv a0, s121; CHECK-NEXT: call bar22; CHECK-NEXT: sllw s1, s1, s023; CHECK-NEXT: bnez a0, .LBB0_124; CHECK-NEXT: # %bb.2: # %bb725; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload26; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload27; CHECK-NEXT: ld s1, 8(sp) # 8-byte Folded Reload28; CHECK-NEXT: addi sp, sp, 3229; CHECK-NEXT: ret30;31; NOREMOVAL-LABEL: test1:32; NOREMOVAL: # %bb.0: # %bb33; NOREMOVAL-NEXT: addi sp, sp, -3234; NOREMOVAL-NEXT: sd ra, 24(sp) # 8-byte Folded Spill35; NOREMOVAL-NEXT: sd s0, 16(sp) # 8-byte Folded Spill36; NOREMOVAL-NEXT: sd s1, 8(sp) # 8-byte Folded Spill37; NOREMOVAL-NEXT: mv s0, a138; NOREMOVAL-NEXT: sraw s1, a0, a139; NOREMOVAL-NEXT: .LBB0_1: # %bb240; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=141; NOREMOVAL-NEXT: sext.w a0, s142; NOREMOVAL-NEXT: call bar43; NOREMOVAL-NEXT: sllw s1, s1, s044; NOREMOVAL-NEXT: bnez a0, .LBB0_145; NOREMOVAL-NEXT: # %bb.2: # %bb746; NOREMOVAL-NEXT: ld ra, 24(sp) # 8-byte Folded Reload47; NOREMOVAL-NEXT: ld s0, 16(sp) # 8-byte Folded Reload48; NOREMOVAL-NEXT: ld s1, 8(sp) # 8-byte Folded Reload49; NOREMOVAL-NEXT: addi sp, sp, 3250; NOREMOVAL-NEXT: ret51bb:52 %i = ashr i32 %arg, %arg153 br label %bb254 55bb2: ; preds = %bb2, %bb56 %i3 = phi i32 [ %i, %bb ], [ %i5, %bb2 ]57 %i4 = tail call signext i32 @bar(i32 signext %i3)58 %i5 = shl i32 %i3, %arg159 %i6 = icmp eq i32 %i4, 060 br i1 %i6, label %bb7, label %bb261 62bb7: ; preds = %bb263 ret void64}65 66declare signext i32 @bar(i32 signext)67 68; The load here was previously an aext load, but this has since been changed69; to a signext load allowing us to remove a sext.w before isel. Thus we get70; the same result with or without the sext.w removal pass.71; Test has been left for coverage purposes.72define signext i32 @test2(ptr %p, i32 signext %b) nounwind {73; RV64I-LABEL: test2:74; RV64I: # %bb.0:75; RV64I-NEXT: lw a0, 0(a0)76; RV64I-NEXT: li a2, 177; RV64I-NEXT: sllw a1, a2, a178; RV64I-NEXT: not a1, a179; RV64I-NEXT: and a0, a1, a080; RV64I-NEXT: ret81;82; RV64ZBB-LABEL: test2:83; RV64ZBB: # %bb.0:84; RV64ZBB-NEXT: lw a0, 0(a0)85; RV64ZBB-NEXT: li a2, -286; RV64ZBB-NEXT: rolw a1, a2, a187; RV64ZBB-NEXT: and a0, a1, a088; RV64ZBB-NEXT: ret89;90; NOREMOVAL-LABEL: test2:91; NOREMOVAL: # %bb.0:92; NOREMOVAL-NEXT: lw a0, 0(a0)93; NOREMOVAL-NEXT: li a2, -294; NOREMOVAL-NEXT: rolw a1, a2, a195; NOREMOVAL-NEXT: and a0, a1, a096; NOREMOVAL-NEXT: ret97 %a = load i32, ptr %p98 %shl = shl i32 1, %b99 %neg = xor i32 %shl, -1100 %and1 = and i32 %neg, %a101 ret i32 %and1102}103 104define signext i32 @test3(ptr %p, i32 signext %b) nounwind {105; RV64I-LABEL: test3:106; RV64I: # %bb.0:107; RV64I-NEXT: lw a0, 0(a0)108; RV64I-NEXT: li a2, 1109; RV64I-NEXT: sllw a1, a2, a1110; RV64I-NEXT: not a1, a1111; RV64I-NEXT: or a0, a1, a0112; RV64I-NEXT: ret113;114; RV64ZBB-LABEL: test3:115; RV64ZBB: # %bb.0:116; RV64ZBB-NEXT: lw a0, 0(a0)117; RV64ZBB-NEXT: li a2, -2118; RV64ZBB-NEXT: rolw a1, a2, a1119; RV64ZBB-NEXT: or a0, a1, a0120; RV64ZBB-NEXT: ret121;122; NOREMOVAL-LABEL: test3:123; NOREMOVAL: # %bb.0:124; NOREMOVAL-NEXT: lw a0, 0(a0)125; NOREMOVAL-NEXT: li a2, -2126; NOREMOVAL-NEXT: rolw a1, a2, a1127; NOREMOVAL-NEXT: or a0, a1, a0128; NOREMOVAL-NEXT: ret129 %a = load i32, ptr %p130 %shl = shl i32 1, %b131 %neg = xor i32 %shl, -1132 %and1 = or i32 %neg, %a133 ret i32 %and1134}135 136define signext i32 @test4(ptr %p, i32 signext %b) nounwind {137; RV64I-LABEL: test4:138; RV64I: # %bb.0:139; RV64I-NEXT: lw a0, 0(a0)140; RV64I-NEXT: li a2, 1141; RV64I-NEXT: sllw a1, a2, a1142; RV64I-NEXT: xor a0, a1, a0143; RV64I-NEXT: not a0, a0144; RV64I-NEXT: ret145;146; RV64ZBB-LABEL: test4:147; RV64ZBB: # %bb.0:148; RV64ZBB-NEXT: lw a0, 0(a0)149; RV64ZBB-NEXT: li a2, 1150; RV64ZBB-NEXT: sllw a1, a2, a1151; RV64ZBB-NEXT: xnor a0, a1, a0152; RV64ZBB-NEXT: ret153;154; NOREMOVAL-LABEL: test4:155; NOREMOVAL: # %bb.0:156; NOREMOVAL-NEXT: lw a0, 0(a0)157; NOREMOVAL-NEXT: li a2, 1158; NOREMOVAL-NEXT: sllw a1, a2, a1159; NOREMOVAL-NEXT: xnor a0, a1, a0160; NOREMOVAL-NEXT: ret161 %a = load i32, ptr %p162 %shl = shl i32 1, %b163 %neg = xor i32 %shl, -1164 %and1 = xor i32 %neg, %a165 ret i32 %and1166}167 168; Make sure we don't put a sext.w before bar when using cpopw.169define void @test5(i32 signext %arg, i32 signext %arg1) nounwind {170; RV64I-LABEL: test5:171; RV64I: # %bb.0: # %bb172; RV64I-NEXT: addi sp, sp, -48173; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill174; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill175; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill176; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill177; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill178; RV64I-NEXT: sraw a0, a0, a1179; RV64I-NEXT: lui a1, 349525180; RV64I-NEXT: lui a2, 209715181; RV64I-NEXT: lui a3, 61681182; RV64I-NEXT: lui a4, 4112183; RV64I-NEXT: addi s0, a1, 1365184; RV64I-NEXT: addi s1, a2, 819185; RV64I-NEXT: addi s2, a3, -241186; RV64I-NEXT: addi s3, a4, 257187; RV64I-NEXT: .LBB4_1: # %bb2188; RV64I-NEXT: # =>This Inner Loop Header: Depth=1189; RV64I-NEXT: call bar190; RV64I-NEXT: mv a1, a0191; RV64I-NEXT: srli a0, a0, 1192; RV64I-NEXT: and a0, a0, s0193; RV64I-NEXT: sub a0, a1, a0194; RV64I-NEXT: and a2, a0, s1195; RV64I-NEXT: srli a0, a0, 2196; RV64I-NEXT: and a0, a0, s1197; RV64I-NEXT: add a0, a2, a0198; RV64I-NEXT: srli a2, a0, 4199; RV64I-NEXT: add a0, a0, a2200; RV64I-NEXT: and a0, a0, s2201; RV64I-NEXT: mul a0, a0, s3202; RV64I-NEXT: srliw a0, a0, 24203; RV64I-NEXT: bnez a1, .LBB4_1204; RV64I-NEXT: # %bb.2: # %bb7205; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload206; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload207; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload208; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload209; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload210; RV64I-NEXT: addi sp, sp, 48211; RV64I-NEXT: ret212;213; RV64ZBB-LABEL: test5:214; RV64ZBB: # %bb.0: # %bb215; RV64ZBB-NEXT: addi sp, sp, -16216; RV64ZBB-NEXT: sd ra, 8(sp) # 8-byte Folded Spill217; RV64ZBB-NEXT: sraw a0, a0, a1218; RV64ZBB-NEXT: .LBB4_1: # %bb2219; RV64ZBB-NEXT: # =>This Inner Loop Header: Depth=1220; RV64ZBB-NEXT: call bar221; RV64ZBB-NEXT: mv a1, a0222; RV64ZBB-NEXT: cpopw a0, a0223; RV64ZBB-NEXT: bnez a1, .LBB4_1224; RV64ZBB-NEXT: # %bb.2: # %bb7225; RV64ZBB-NEXT: ld ra, 8(sp) # 8-byte Folded Reload226; RV64ZBB-NEXT: addi sp, sp, 16227; RV64ZBB-NEXT: ret228;229; NOREMOVAL-LABEL: test5:230; NOREMOVAL: # %bb.0: # %bb231; NOREMOVAL-NEXT: addi sp, sp, -16232; NOREMOVAL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill233; NOREMOVAL-NEXT: sraw a1, a0, a1234; NOREMOVAL-NEXT: .LBB4_1: # %bb2235; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=1236; NOREMOVAL-NEXT: sext.w a0, a1237; NOREMOVAL-NEXT: call bar238; NOREMOVAL-NEXT: cpopw a1, a0239; NOREMOVAL-NEXT: bnez a0, .LBB4_1240; NOREMOVAL-NEXT: # %bb.2: # %bb7241; NOREMOVAL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload242; NOREMOVAL-NEXT: addi sp, sp, 16243; NOREMOVAL-NEXT: ret244bb:245 %i = ashr i32 %arg, %arg1246 br label %bb2247 248bb2: ; preds = %bb2, %bb249 %i3 = phi i32 [ %i, %bb ], [ %i5, %bb2 ]250 %i4 = tail call signext i32 @bar(i32 signext %i3)251 %i5 = tail call i32 @llvm.ctpop.i32(i32 %i4)252 %i6 = icmp eq i32 %i4, 0253 br i1 %i6, label %bb7, label %bb2254 255bb7: ; preds = %bb2256 ret void257}258 259define void @test6(i32 signext %arg, i32 signext %arg1) nounwind {260; CHECK-LABEL: test6:261; CHECK: # %bb.0: # %bb262; CHECK-NEXT: addi sp, sp, -16263; CHECK-NEXT: sd ra, 8(sp) # 8-byte Folded Spill264; CHECK-NEXT: fsw fs0, 4(sp) # 4-byte Folded Spill265; CHECK-NEXT: sraw a0, a0, a1266; CHECK-NEXT: fmv.w.x fs0, zero267; CHECK-NEXT: .LBB5_1: # %bb2268; CHECK-NEXT: # =>This Inner Loop Header: Depth=1269; CHECK-NEXT: call baz270; CHECK-NEXT: feq.s a1, fa0, fs0271; CHECK-NEXT: fcvt.w.s a0, fa0, rtz272; CHECK-NEXT: beqz a1, .LBB5_1273; CHECK-NEXT: # %bb.2: # %bb7274; CHECK-NEXT: ld ra, 8(sp) # 8-byte Folded Reload275; CHECK-NEXT: flw fs0, 4(sp) # 4-byte Folded Reload276; CHECK-NEXT: addi sp, sp, 16277; CHECK-NEXT: ret278;279; NOREMOVAL-LABEL: test6:280; NOREMOVAL: # %bb.0: # %bb281; NOREMOVAL-NEXT: addi sp, sp, -16282; NOREMOVAL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill283; NOREMOVAL-NEXT: fsw fs0, 4(sp) # 4-byte Folded Spill284; NOREMOVAL-NEXT: sraw a0, a0, a1285; NOREMOVAL-NEXT: fmv.w.x fs0, zero286; NOREMOVAL-NEXT: .LBB5_1: # %bb2287; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=1288; NOREMOVAL-NEXT: sext.w a0, a0289; NOREMOVAL-NEXT: call baz290; NOREMOVAL-NEXT: feq.s a1, fa0, fs0291; NOREMOVAL-NEXT: fcvt.w.s a0, fa0, rtz292; NOREMOVAL-NEXT: beqz a1, .LBB5_1293; NOREMOVAL-NEXT: # %bb.2: # %bb7294; NOREMOVAL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload295; NOREMOVAL-NEXT: flw fs0, 4(sp) # 4-byte Folded Reload296; NOREMOVAL-NEXT: addi sp, sp, 16297; NOREMOVAL-NEXT: ret298bb:299 %i = ashr i32 %arg, %arg1300 br label %bb2301 302bb2: ; preds = %bb2, %bb303 %i3 = phi i32 [ %i, %bb ], [ %i5, %bb2 ]304 %i4 = tail call float @baz(i32 signext %i3)305 %i5 = fptosi float %i4 to i32306 %i6 = fcmp oeq float %i4, zeroinitializer307 br i1 %i6, label %bb7, label %bb2308 309bb7: ; preds = %bb2310 ret void311}312declare float @baz(i32 signext %i3)313 314define void @test7(i32 signext %arg, i32 signext %arg1) nounwind {315; RV64I-LABEL: test7:316; RV64I: # %bb.0: # %bb317; RV64I-NEXT: addi sp, sp, -48318; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill319; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill320; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill321; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill322; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill323; RV64I-NEXT: sraw a0, a0, a1324; RV64I-NEXT: lui a1, 349525325; RV64I-NEXT: lui a2, 209715326; RV64I-NEXT: lui a3, 61681327; RV64I-NEXT: lui a4, 4112328; RV64I-NEXT: addi s0, a1, 1365329; RV64I-NEXT: addi s1, a2, 819330; RV64I-NEXT: addi s2, a3, -241331; RV64I-NEXT: addi s3, a4, 257332; RV64I-NEXT: slli a1, s0, 32333; RV64I-NEXT: add s0, s0, a1334; RV64I-NEXT: slli a1, s1, 32335; RV64I-NEXT: add s1, s1, a1336; RV64I-NEXT: slli a1, s2, 32337; RV64I-NEXT: add s2, s2, a1338; RV64I-NEXT: slli a1, s3, 32339; RV64I-NEXT: add s3, s3, a1340; RV64I-NEXT: .LBB6_1: # %bb2341; RV64I-NEXT: # =>This Inner Loop Header: Depth=1342; RV64I-NEXT: call foo343; RV64I-NEXT: srli a1, a0, 1344; RV64I-NEXT: and a1, a1, s0345; RV64I-NEXT: sub a0, a0, a1346; RV64I-NEXT: and a1, a0, s1347; RV64I-NEXT: srli a0, a0, 2348; RV64I-NEXT: and a0, a0, s1349; RV64I-NEXT: add a0, a1, a0350; RV64I-NEXT: srli a1, a0, 4351; RV64I-NEXT: add a0, a0, a1352; RV64I-NEXT: and a0, a0, s2353; RV64I-NEXT: mul a0, a0, s3354; RV64I-NEXT: srli a0, a0, 56355; RV64I-NEXT: bnez a0, .LBB6_1356; RV64I-NEXT: # %bb.2: # %bb7357; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload358; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload359; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload360; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload361; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload362; RV64I-NEXT: addi sp, sp, 48363; RV64I-NEXT: ret364;365; RV64ZBB-LABEL: test7:366; RV64ZBB: # %bb.0: # %bb367; RV64ZBB-NEXT: addi sp, sp, -16368; RV64ZBB-NEXT: sd ra, 8(sp) # 8-byte Folded Spill369; RV64ZBB-NEXT: sraw a0, a0, a1370; RV64ZBB-NEXT: .LBB6_1: # %bb2371; RV64ZBB-NEXT: # =>This Inner Loop Header: Depth=1372; RV64ZBB-NEXT: call foo373; RV64ZBB-NEXT: cpop a0, a0374; RV64ZBB-NEXT: bnez a0, .LBB6_1375; RV64ZBB-NEXT: # %bb.2: # %bb7376; RV64ZBB-NEXT: ld ra, 8(sp) # 8-byte Folded Reload377; RV64ZBB-NEXT: addi sp, sp, 16378; RV64ZBB-NEXT: ret379;380; NOREMOVAL-LABEL: test7:381; NOREMOVAL: # %bb.0: # %bb382; NOREMOVAL-NEXT: addi sp, sp, -16383; NOREMOVAL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill384; NOREMOVAL-NEXT: sraw a0, a0, a1385; NOREMOVAL-NEXT: .LBB6_1: # %bb2386; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=1387; NOREMOVAL-NEXT: sext.w a0, a0388; NOREMOVAL-NEXT: call foo389; NOREMOVAL-NEXT: cpop a0, a0390; NOREMOVAL-NEXT: bnez a0, .LBB6_1391; NOREMOVAL-NEXT: # %bb.2: # %bb7392; NOREMOVAL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload393; NOREMOVAL-NEXT: addi sp, sp, 16394; NOREMOVAL-NEXT: ret395bb:396 %i = ashr i32 %arg, %arg1397 br label %bb2398 399bb2: ; preds = %bb2, %bb400 %i3 = phi i32 [ %i, %bb ], [ %i6, %bb2 ]401 %i4 = tail call signext i64 @foo(i32 signext %i3)402 %i5 = tail call i64 @llvm.ctpop.i64(i64 %i4)403 %i6 = trunc i64 %i5 to i32404 %i7 = icmp eq i32 %i6, 0405 br i1 %i7, label %bb7, label %bb2406 407bb7: ; preds = %bb2408 ret void409}410 411define void @test8(i32 signext %arg, i32 signext %arg1) nounwind {412; CHECK-LABEL: test8:413; CHECK: # %bb.0: # %bb414; CHECK-NEXT: addi sp, sp, -16415; CHECK-NEXT: sd ra, 8(sp) # 8-byte Folded Spill416; CHECK-NEXT: sraw a0, a0, a1417; CHECK-NEXT: .LBB7_1: # %bb2418; CHECK-NEXT: # =>This Inner Loop Header: Depth=1419; CHECK-NEXT: call foo420; CHECK-NEXT: ori a0, a0, -256421; CHECK-NEXT: bnez a0, .LBB7_1422; CHECK-NEXT: # %bb.2: # %bb7423; CHECK-NEXT: ld ra, 8(sp) # 8-byte Folded Reload424; CHECK-NEXT: addi sp, sp, 16425; CHECK-NEXT: ret426;427; NOREMOVAL-LABEL: test8:428; NOREMOVAL: # %bb.0: # %bb429; NOREMOVAL-NEXT: addi sp, sp, -16430; NOREMOVAL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill431; NOREMOVAL-NEXT: sraw a0, a0, a1432; NOREMOVAL-NEXT: .LBB7_1: # %bb2433; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=1434; NOREMOVAL-NEXT: sext.w a0, a0435; NOREMOVAL-NEXT: call foo436; NOREMOVAL-NEXT: ori a0, a0, -256437; NOREMOVAL-NEXT: bnez a0, .LBB7_1438; NOREMOVAL-NEXT: # %bb.2: # %bb7439; NOREMOVAL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload440; NOREMOVAL-NEXT: addi sp, sp, 16441; NOREMOVAL-NEXT: ret442bb:443 %i = ashr i32 %arg, %arg1444 br label %bb2445 446bb2: ; preds = %bb2, %bb447 %i3 = phi i32 [ %i, %bb ], [ %i6, %bb2 ]448 %i4 = tail call signext i64 @foo(i32 signext %i3)449 %i5 = or i64 %i4, -256450 %i6 = trunc i64 %i5 to i32451 %i7 = icmp eq i32 %i6, 0452 br i1 %i7, label %bb7, label %bb2453 454bb7: ; preds = %bb2455 ret void456}457 458declare i64 @foo(i32 signext)459 460define void @test9(i32 signext %arg, i32 signext %arg1) nounwind {461; CHECK-LABEL: test9:462; CHECK: # %bb.0: # %bb463; CHECK-NEXT: addi sp, sp, -16464; CHECK-NEXT: sd ra, 8(sp) # 8-byte Folded Spill465; CHECK-NEXT: sd s0, 0(sp) # 8-byte Folded Spill466; CHECK-NEXT: sraw a0, a0, a1467; CHECK-NEXT: li s0, 254468; CHECK-NEXT: .LBB8_1: # %bb2469; CHECK-NEXT: # =>This Inner Loop Header: Depth=1470; CHECK-NEXT: call bar471; CHECK-NEXT: mv a1, a0472; CHECK-NEXT: slti a0, a0, 255473; CHECK-NEXT: blt s0, a1, .LBB8_1474; CHECK-NEXT: # %bb.2: # %bb7475; CHECK-NEXT: ld ra, 8(sp) # 8-byte Folded Reload476; CHECK-NEXT: ld s0, 0(sp) # 8-byte Folded Reload477; CHECK-NEXT: addi sp, sp, 16478; CHECK-NEXT: ret479;480; NOREMOVAL-LABEL: test9:481; NOREMOVAL: # %bb.0: # %bb482; NOREMOVAL-NEXT: addi sp, sp, -16483; NOREMOVAL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill484; NOREMOVAL-NEXT: sd s0, 0(sp) # 8-byte Folded Spill485; NOREMOVAL-NEXT: sraw a1, a0, a1486; NOREMOVAL-NEXT: li s0, 254487; NOREMOVAL-NEXT: .LBB8_1: # %bb2488; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=1489; NOREMOVAL-NEXT: sext.w a0, a1490; NOREMOVAL-NEXT: call bar491; NOREMOVAL-NEXT: slti a1, a0, 255492; NOREMOVAL-NEXT: blt s0, a0, .LBB8_1493; NOREMOVAL-NEXT: # %bb.2: # %bb7494; NOREMOVAL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload495; NOREMOVAL-NEXT: ld s0, 0(sp) # 8-byte Folded Reload496; NOREMOVAL-NEXT: addi sp, sp, 16497; NOREMOVAL-NEXT: ret498bb:499 %i = ashr i32 %arg, %arg1500 br label %bb2501 502bb2: ; preds = %bb2, %bb503 %i3 = phi i32 [ %i, %bb ], [ %i7, %bb2 ]504 %i4 = tail call signext i32 @bar(i32 signext %i3)505 %i5 = icmp slt i32 %i4, 255506 %i6 = sext i1 %i5 to i32507 %i7 = sub i32 0, %i6508 br i1 %i5, label %bb7, label %bb2509 510bb7: ; preds = %bb2511 ret void512}513 514define void @test10(i32 signext %arg, i32 signext %arg1) nounwind {515; CHECK-LABEL: test10:516; CHECK: # %bb.0: # %bb517; CHECK-NEXT: addi sp, sp, -16518; CHECK-NEXT: sd ra, 8(sp) # 8-byte Folded Spill519; CHECK-NEXT: fsw fs0, 4(sp) # 4-byte Folded Spill520; CHECK-NEXT: sraw a0, a0, a1521; CHECK-NEXT: fmv.w.x fs0, zero522; CHECK-NEXT: .LBB9_1: # %bb2523; CHECK-NEXT: # =>This Inner Loop Header: Depth=1524; CHECK-NEXT: call baz525; CHECK-NEXT: feq.s a1, fa0, fs0526; CHECK-NEXT: fmv.x.w a0, fa0527; CHECK-NEXT: beqz a1, .LBB9_1528; CHECK-NEXT: # %bb.2: # %bb7529; CHECK-NEXT: ld ra, 8(sp) # 8-byte Folded Reload530; CHECK-NEXT: flw fs0, 4(sp) # 4-byte Folded Reload531; CHECK-NEXT: addi sp, sp, 16532; CHECK-NEXT: ret533;534; NOREMOVAL-LABEL: test10:535; NOREMOVAL: # %bb.0: # %bb536; NOREMOVAL-NEXT: addi sp, sp, -16537; NOREMOVAL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill538; NOREMOVAL-NEXT: fsw fs0, 4(sp) # 4-byte Folded Spill539; NOREMOVAL-NEXT: sraw a0, a0, a1540; NOREMOVAL-NEXT: fmv.w.x fs0, zero541; NOREMOVAL-NEXT: .LBB9_1: # %bb2542; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=1543; NOREMOVAL-NEXT: sext.w a0, a0544; NOREMOVAL-NEXT: call baz545; NOREMOVAL-NEXT: feq.s a1, fa0, fs0546; NOREMOVAL-NEXT: fmv.x.w a0, fa0547; NOREMOVAL-NEXT: beqz a1, .LBB9_1548; NOREMOVAL-NEXT: # %bb.2: # %bb7549; NOREMOVAL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload550; NOREMOVAL-NEXT: flw fs0, 4(sp) # 4-byte Folded Reload551; NOREMOVAL-NEXT: addi sp, sp, 16552; NOREMOVAL-NEXT: ret553bb:554 %i = ashr i32 %arg, %arg1555 br label %bb2556 557bb2: ; preds = %bb2, %bb558 %i3 = phi i32 [ %i, %bb ], [ %i5, %bb2 ]559 %i4 = tail call float @baz(i32 signext %i3)560 %i5 = bitcast float %i4 to i32561 %i6 = fcmp oeq float %i4, zeroinitializer562 br i1 %i6, label %bb7, label %bb2563 564bb7: ; preds = %bb2565 ret void566}567 568; simple test for forward-searching. (and 1234) only uses lower word of input569define signext i32 @test11(i64 %arg1, i64 %arg2, i64 %arg3) {570; CHECK-LABEL: test11:571; CHECK: # %bb.0: # %entry572; CHECK-NEXT: addi a2, a2, -1573; CHECK-NEXT: li a3, 256574; CHECK-NEXT: .LBB10_1: # %bb2575; CHECK-NEXT: # =>This Inner Loop Header: Depth=1576; CHECK-NEXT: andi a0, a0, 1234577; CHECK-NEXT: addi a2, a2, 1578; CHECK-NEXT: addw a0, a0, a1579; CHECK-NEXT: bltu a2, a3, .LBB10_1580; CHECK-NEXT: # %bb.2: # %bb7581; CHECK-NEXT: ret582;583; NOREMOVAL-LABEL: test11:584; NOREMOVAL: # %bb.0: # %entry585; NOREMOVAL-NEXT: addi a2, a2, -1586; NOREMOVAL-NEXT: li a3, 256587; NOREMOVAL-NEXT: .LBB10_1: # %bb2588; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=1589; NOREMOVAL-NEXT: andi a0, a0, 1234590; NOREMOVAL-NEXT: addi a2, a2, 1591; NOREMOVAL-NEXT: add a0, a0, a1592; NOREMOVAL-NEXT: bltu a2, a3, .LBB10_1593; NOREMOVAL-NEXT: # %bb.2: # %bb7594; NOREMOVAL-NEXT: sext.w a0, a0595; NOREMOVAL-NEXT: ret596entry:597 br label %bb2598 599bb2: ; preds = %bb2, %entry600 %i1 = phi i64 [ %arg1, %entry ], [ %i5, %bb2 ]601 %i2 = phi i64 [ %arg3, %entry ], [ %i3, %bb2 ]602 %i3 = add i64 %i2, 1603 %i4 = and i64 %i1, 1234604 %i5 = add i64 %i4, %arg2605 %i6 = icmp ugt i64 %i2, 255606 br i1 %i6, label %bb7, label %bb2607 608bb7: ; preds = %bb2609 %i7 = trunc i64 %i5 to i32610 ret i32 %i7611}612 613; circular use-dependency and multiple transformations.614define signext i32 @test12(i64 %arg1, i64 %arg2, i64 %arg3) {615; CHECK-LABEL: test12:616; CHECK: # %bb.0: # %entry617; CHECK-NEXT: addi a3, a2, -1618; CHECK-NEXT: li a4, 256619; CHECK-NEXT: .LBB11_1: # %bb2620; CHECK-NEXT: # =>This Inner Loop Header: Depth=1621; CHECK-NEXT: xor a0, a0, a1622; CHECK-NEXT: mulw a2, a0, a1623; CHECK-NEXT: addw a0, a0, a2624; CHECK-NEXT: and a2, a2, a0625; CHECK-NEXT: addi a3, a3, 1626; CHECK-NEXT: add a0, a2, a1627; CHECK-NEXT: bltu a3, a4, .LBB11_1628; CHECK-NEXT: # %bb.2: # %bb7629; CHECK-NEXT: mv a0, a2630; CHECK-NEXT: ret631;632; NOREMOVAL-LABEL: test12:633; NOREMOVAL: # %bb.0: # %entry634; NOREMOVAL-NEXT: addi a2, a2, -1635; NOREMOVAL-NEXT: li a3, 256636; NOREMOVAL-NEXT: .LBB11_1: # %bb2637; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=1638; NOREMOVAL-NEXT: xor a0, a0, a1639; NOREMOVAL-NEXT: mul a4, a0, a1640; NOREMOVAL-NEXT: add a0, a0, a4641; NOREMOVAL-NEXT: and a4, a4, a0642; NOREMOVAL-NEXT: addi a2, a2, 1643; NOREMOVAL-NEXT: add a0, a4, a1644; NOREMOVAL-NEXT: bltu a2, a3, .LBB11_1645; NOREMOVAL-NEXT: # %bb.2: # %bb7646; NOREMOVAL-NEXT: sext.w a0, a4647; NOREMOVAL-NEXT: ret648entry:649 br label %bb2650 651bb2: ; preds = %bb2, %entry652 %i1 = phi i64 [ %arg1, %entry ], [ %i6, %bb2 ]653 %i2 = phi i64 [ %arg3, %entry ], [ %i3, %bb2 ]654 %i3 = add i64 %i2, 1655 %i4 = xor i64 %i1, %arg2656 %i5 = mul i64 %i4, %arg2657 %i9 = add i64 %i4, %i5658 %i8 = and i64 %i5, %i9659 %i6 = add i64 %i8, %arg2660 %i7 = icmp ugt i64 %i2, 255661 br i1 %i7, label %bb7, label %bb2662 663bb7: ; preds = %bb2664 %r = trunc i64 %i8 to i32665 ret i32 %r666}667 668; Not optimized. sdiv doesn't only use lower word669define signext i32 @test13(i64 %arg1, i64 %arg2, i64 %arg3) {670; CHECK-LABEL: test13:671; CHECK: # %bb.0: # %entry672; CHECK-NEXT: addi a2, a2, -1673; CHECK-NEXT: li a3, 256674; CHECK-NEXT: .LBB12_1: # %bb2675; CHECK-NEXT: # =>This Inner Loop Header: Depth=1676; CHECK-NEXT: div a0, a0, a1677; CHECK-NEXT: addi a2, a2, 1678; CHECK-NEXT: add a0, a0, a1679; CHECK-NEXT: bltu a2, a3, .LBB12_1680; CHECK-NEXT: # %bb.2: # %bb7681; CHECK-NEXT: sext.w a0, a0682; CHECK-NEXT: ret683;684; NOREMOVAL-LABEL: test13:685; NOREMOVAL: # %bb.0: # %entry686; NOREMOVAL-NEXT: addi a2, a2, -1687; NOREMOVAL-NEXT: li a3, 256688; NOREMOVAL-NEXT: .LBB12_1: # %bb2689; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=1690; NOREMOVAL-NEXT: div a0, a0, a1691; NOREMOVAL-NEXT: addi a2, a2, 1692; NOREMOVAL-NEXT: add a0, a0, a1693; NOREMOVAL-NEXT: bltu a2, a3, .LBB12_1694; NOREMOVAL-NEXT: # %bb.2: # %bb7695; NOREMOVAL-NEXT: sext.w a0, a0696; NOREMOVAL-NEXT: ret697entry:698 br label %bb2699 700bb2: ; preds = %bb2, %entry701 %i1 = phi i64 [ %arg1, %entry ], [ %i5, %bb2 ]702 %i2 = phi i64 [ %arg3, %entry ], [ %i3, %bb2 ]703 %i3 = add i64 %i2, 1704 %i4 = sdiv i64 %i1, %arg2705 %i5 = add i64 %i4, %arg2706 %i6 = icmp ugt i64 %i2, 255707 br i1 %i6, label %bb7, label %bb2708 709bb7: ; preds = %bb2710 %i8 = trunc i64 %i5 to i32711 ret i32 %i8712}713 714; int test14(int a, int n) {715; for (int i = 1; i < n; ++i) {716; if (a > 1000)717; return -1;718; a += i;719; }720;721; return a;722; }723;724; There should be no sext.w in the loop.725define signext i32 @test14(i32 signext %0, i32 signext %1) {726; CHECK-LABEL: test14:727; CHECK: # %bb.0:728; CHECK-NEXT: li a2, 2729; CHECK-NEXT: blt a1, a2, .LBB13_4730; CHECK-NEXT: # %bb.1: # %.preheader731; CHECK-NEXT: li a2, 1732; CHECK-NEXT: li a3, 1000733; CHECK-NEXT: .LBB13_2: # =>This Inner Loop Header: Depth=1734; CHECK-NEXT: blt a3, a0, .LBB13_5735; CHECK-NEXT: # %bb.3: # in Loop: Header=BB13_2 Depth=1736; CHECK-NEXT: addw a0, a2, a0737; CHECK-NEXT: addiw a2, a2, 1738; CHECK-NEXT: blt a2, a1, .LBB13_2739; CHECK-NEXT: .LBB13_4:740; CHECK-NEXT: ret741; CHECK-NEXT: .LBB13_5:742; CHECK-NEXT: li a0, -1743; CHECK-NEXT: ret744;745; NOREMOVAL-LABEL: test14:746; NOREMOVAL: # %bb.0:747; NOREMOVAL-NEXT: li a2, 2748; NOREMOVAL-NEXT: blt a1, a2, .LBB13_4749; NOREMOVAL-NEXT: # %bb.1: # %.preheader750; NOREMOVAL-NEXT: li a2, 1751; NOREMOVAL-NEXT: li a3, 1000752; NOREMOVAL-NEXT: .LBB13_2: # =>This Inner Loop Header: Depth=1753; NOREMOVAL-NEXT: sext.w a4, a0754; NOREMOVAL-NEXT: blt a3, a4, .LBB13_5755; NOREMOVAL-NEXT: # %bb.3: # in Loop: Header=BB13_2 Depth=1756; NOREMOVAL-NEXT: addw a0, a2, a0757; NOREMOVAL-NEXT: addiw a2, a2, 1758; NOREMOVAL-NEXT: blt a2, a1, .LBB13_2759; NOREMOVAL-NEXT: .LBB13_4:760; NOREMOVAL-NEXT: ret761; NOREMOVAL-NEXT: .LBB13_5:762; NOREMOVAL-NEXT: li a0, -1763; NOREMOVAL-NEXT: ret764 %3 = icmp sgt i32 %1, 1765 br i1 %3, label %4, label %12766 7674: ; preds = %2, %8768 %5 = phi i32 [ %10, %8 ], [ 1, %2 ]769 %6 = phi i32 [ %9, %8 ], [ %0, %2 ]770 %7 = icmp sgt i32 %6, 1000771 br i1 %7, label %12, label %8772 7738: ; preds = %4774 %9 = add nsw i32 %5, %6775 %10 = add nuw nsw i32 %5, 1776 %11 = icmp slt i32 %10, %1777 br i1 %11, label %4, label %12778 77912: ; preds = %8, %4, %2780 %13 = phi i32 [ %0, %2 ], [ -1, %4 ], [ %9, %8 ]781 ret i32 %13782}783 784; Same as test14 but the signext attribute is missing from the argument so we785; can't optimize out the sext.w.786define signext i32 @test14b(i32 %0, i32 signext %1) {787; CHECK-LABEL: test14b:788; CHECK: # %bb.0:789; CHECK-NEXT: li a2, 2790; CHECK-NEXT: blt a1, a2, .LBB14_4791; CHECK-NEXT: # %bb.1: # %.preheader792; CHECK-NEXT: li a2, 1793; CHECK-NEXT: li a3, 1000794; CHECK-NEXT: .LBB14_2: # =>This Inner Loop Header: Depth=1795; CHECK-NEXT: sext.w a4, a0796; CHECK-NEXT: blt a3, a4, .LBB14_5797; CHECK-NEXT: # %bb.3: # in Loop: Header=BB14_2 Depth=1798; CHECK-NEXT: add a0, a2, a0799; CHECK-NEXT: addiw a2, a2, 1800; CHECK-NEXT: blt a2, a1, .LBB14_2801; CHECK-NEXT: .LBB14_4:802; CHECK-NEXT: sext.w a0, a0803; CHECK-NEXT: ret804; CHECK-NEXT: .LBB14_5:805; CHECK-NEXT: li a0, -1806; CHECK-NEXT: sext.w a0, a0807; CHECK-NEXT: ret808;809; NOREMOVAL-LABEL: test14b:810; NOREMOVAL: # %bb.0:811; NOREMOVAL-NEXT: li a2, 2812; NOREMOVAL-NEXT: blt a1, a2, .LBB14_4813; NOREMOVAL-NEXT: # %bb.1: # %.preheader814; NOREMOVAL-NEXT: li a2, 1815; NOREMOVAL-NEXT: li a3, 1000816; NOREMOVAL-NEXT: .LBB14_2: # =>This Inner Loop Header: Depth=1817; NOREMOVAL-NEXT: sext.w a4, a0818; NOREMOVAL-NEXT: blt a3, a4, .LBB14_5819; NOREMOVAL-NEXT: # %bb.3: # in Loop: Header=BB14_2 Depth=1820; NOREMOVAL-NEXT: add a0, a2, a0821; NOREMOVAL-NEXT: addiw a2, a2, 1822; NOREMOVAL-NEXT: blt a2, a1, .LBB14_2823; NOREMOVAL-NEXT: .LBB14_4:824; NOREMOVAL-NEXT: sext.w a0, a0825; NOREMOVAL-NEXT: ret826; NOREMOVAL-NEXT: .LBB14_5:827; NOREMOVAL-NEXT: li a0, -1828; NOREMOVAL-NEXT: sext.w a0, a0829; NOREMOVAL-NEXT: ret830 %3 = icmp sgt i32 %1, 1831 br i1 %3, label %4, label %12832 8334: ; preds = %2, %8834 %5 = phi i32 [ %10, %8 ], [ 1, %2 ]835 %6 = phi i32 [ %9, %8 ], [ %0, %2 ]836 %7 = icmp sgt i32 %6, 1000837 br i1 %7, label %12, label %8838 8398: ; preds = %4840 %9 = add nsw i32 %5, %6841 %10 = add nuw nsw i32 %5, 1842 %11 = icmp slt i32 %10, %1843 br i1 %11, label %4, label %12844 84512: ; preds = %8, %4, %2846 %13 = phi i32 [ %0, %2 ], [ -1, %4 ], [ %9, %8 ]847 ret i32 %13848}849 850; Same as test14, but the argument is zero extended instead of sign extended so851; we can't optimize it.852define signext i32 @test14c(i32 zeroext %0, i32 signext %1) {853; CHECK-LABEL: test14c:854; CHECK: # %bb.0:855; CHECK-NEXT: li a2, 2856; CHECK-NEXT: blt a1, a2, .LBB15_4857; CHECK-NEXT: # %bb.1: # %.preheader858; CHECK-NEXT: li a2, 1859; CHECK-NEXT: li a3, 1000860; CHECK-NEXT: .LBB15_2: # =>This Inner Loop Header: Depth=1861; CHECK-NEXT: sext.w a4, a0862; CHECK-NEXT: blt a3, a4, .LBB15_5863; CHECK-NEXT: # %bb.3: # in Loop: Header=BB15_2 Depth=1864; CHECK-NEXT: add a0, a2, a0865; CHECK-NEXT: addiw a2, a2, 1866; CHECK-NEXT: blt a2, a1, .LBB15_2867; CHECK-NEXT: .LBB15_4:868; CHECK-NEXT: sext.w a0, a0869; CHECK-NEXT: ret870; CHECK-NEXT: .LBB15_5:871; CHECK-NEXT: li a0, -1872; CHECK-NEXT: sext.w a0, a0873; CHECK-NEXT: ret874;875; NOREMOVAL-LABEL: test14c:876; NOREMOVAL: # %bb.0:877; NOREMOVAL-NEXT: li a2, 2878; NOREMOVAL-NEXT: blt a1, a2, .LBB15_4879; NOREMOVAL-NEXT: # %bb.1: # %.preheader880; NOREMOVAL-NEXT: li a2, 1881; NOREMOVAL-NEXT: li a3, 1000882; NOREMOVAL-NEXT: .LBB15_2: # =>This Inner Loop Header: Depth=1883; NOREMOVAL-NEXT: sext.w a4, a0884; NOREMOVAL-NEXT: blt a3, a4, .LBB15_5885; NOREMOVAL-NEXT: # %bb.3: # in Loop: Header=BB15_2 Depth=1886; NOREMOVAL-NEXT: add a0, a2, a0887; NOREMOVAL-NEXT: addiw a2, a2, 1888; NOREMOVAL-NEXT: blt a2, a1, .LBB15_2889; NOREMOVAL-NEXT: .LBB15_4:890; NOREMOVAL-NEXT: sext.w a0, a0891; NOREMOVAL-NEXT: ret892; NOREMOVAL-NEXT: .LBB15_5:893; NOREMOVAL-NEXT: li a0, -1894; NOREMOVAL-NEXT: sext.w a0, a0895; NOREMOVAL-NEXT: ret896 %3 = icmp sgt i32 %1, 1897 br i1 %3, label %4, label %12898 8994: ; preds = %2, %8900 %5 = phi i32 [ %10, %8 ], [ 1, %2 ]901 %6 = phi i32 [ %9, %8 ], [ %0, %2 ]902 %7 = icmp sgt i32 %6, 1000903 br i1 %7, label %12, label %8904 9058: ; preds = %4906 %9 = add nsw i32 %5, %6907 %10 = add nuw nsw i32 %5, 1908 %11 = icmp slt i32 %10, %1909 br i1 %11, label %4, label %12910 91112: ; preds = %8, %4, %2912 %13 = phi i32 [ %0, %2 ], [ -1, %4 ], [ %9, %8 ]913 ret i32 %13914}915 916; Same as test14 but the argument is zero extended from i31. Since bits 63:31917; are zero, this counts as an i32 sign extend so we can optimize it.918define signext i32 @test14d(i31 zeroext %0, i32 signext %1) {919; CHECK-LABEL: test14d:920; CHECK: # %bb.0:921; CHECK-NEXT: li a2, 2922; CHECK-NEXT: blt a1, a2, .LBB16_4923; CHECK-NEXT: # %bb.1: # %.preheader924; CHECK-NEXT: li a2, 1925; CHECK-NEXT: li a3, 1000926; CHECK-NEXT: .LBB16_2: # =>This Inner Loop Header: Depth=1927; CHECK-NEXT: blt a3, a0, .LBB16_5928; CHECK-NEXT: # %bb.3: # in Loop: Header=BB16_2 Depth=1929; CHECK-NEXT: addw a0, a2, a0930; CHECK-NEXT: addiw a2, a2, 1931; CHECK-NEXT: blt a2, a1, .LBB16_2932; CHECK-NEXT: .LBB16_4:933; CHECK-NEXT: ret934; CHECK-NEXT: .LBB16_5:935; CHECK-NEXT: li a0, -1936; CHECK-NEXT: ret937;938; NOREMOVAL-LABEL: test14d:939; NOREMOVAL: # %bb.0:940; NOREMOVAL-NEXT: li a2, 2941; NOREMOVAL-NEXT: blt a1, a2, .LBB16_4942; NOREMOVAL-NEXT: # %bb.1: # %.preheader943; NOREMOVAL-NEXT: li a2, 1944; NOREMOVAL-NEXT: li a3, 1000945; NOREMOVAL-NEXT: .LBB16_2: # =>This Inner Loop Header: Depth=1946; NOREMOVAL-NEXT: sext.w a4, a0947; NOREMOVAL-NEXT: blt a3, a4, .LBB16_5948; NOREMOVAL-NEXT: # %bb.3: # in Loop: Header=BB16_2 Depth=1949; NOREMOVAL-NEXT: addw a0, a2, a0950; NOREMOVAL-NEXT: addiw a2, a2, 1951; NOREMOVAL-NEXT: blt a2, a1, .LBB16_2952; NOREMOVAL-NEXT: .LBB16_4:953; NOREMOVAL-NEXT: ret954; NOREMOVAL-NEXT: .LBB16_5:955; NOREMOVAL-NEXT: li a0, -1956; NOREMOVAL-NEXT: ret957 %zext = zext i31 %0 to i32958 %3 = icmp sgt i32 %1, 1959 br i1 %3, label %4, label %12960 9614: ; preds = %2, %8962 %5 = phi i32 [ %10, %8 ], [ 1, %2 ]963 %6 = phi i32 [ %9, %8 ], [ %zext, %2 ]964 %7 = icmp sgt i32 %6, 1000965 br i1 %7, label %12, label %8966 9678: ; preds = %4968 %9 = add nsw i32 %5, %6969 %10 = add nuw nsw i32 %5, 1970 %11 = icmp slt i32 %10, %1971 br i1 %11, label %4, label %12972 97312: ; preds = %8, %4, %2974 %13 = phi i32 [ %zext, %2 ], [ -1, %4 ], [ %9, %8 ]975 ret i32 %13976}977 978define signext i32 @test15(i64 %arg1, i64 %arg2, i64 %arg3, ptr %arg4) {979; CHECK-LABEL: test15:980; CHECK: # %bb.0: # %entry981; CHECK-NEXT: addi a2, a2, -1982; CHECK-NEXT: li a4, 256983; CHECK-NEXT: .LBB17_1: # %bb2984; CHECK-NEXT: # =>This Inner Loop Header: Depth=1985; CHECK-NEXT: andi a0, a0, 1234986; CHECK-NEXT: addw a0, a0, a1987; CHECK-NEXT: addi a2, a2, 1988; CHECK-NEXT: sw a0, 0(a3)989; CHECK-NEXT: bltu a2, a4, .LBB17_1990; CHECK-NEXT: # %bb.2: # %bb7991; CHECK-NEXT: ret992;993; NOREMOVAL-LABEL: test15:994; NOREMOVAL: # %bb.0: # %entry995; NOREMOVAL-NEXT: addi a2, a2, -1996; NOREMOVAL-NEXT: li a4, 256997; NOREMOVAL-NEXT: .LBB17_1: # %bb2998; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=1999; NOREMOVAL-NEXT: andi a0, a0, 12341000; NOREMOVAL-NEXT: add a0, a0, a11001; NOREMOVAL-NEXT: addi a2, a2, 11002; NOREMOVAL-NEXT: sw a0, 0(a3)1003; NOREMOVAL-NEXT: bltu a2, a4, .LBB17_11004; NOREMOVAL-NEXT: # %bb.2: # %bb71005; NOREMOVAL-NEXT: sext.w a0, a01006; NOREMOVAL-NEXT: ret1007entry:1008 br label %bb21009 1010bb2: ; preds = %bb2, %entry1011 %i1 = phi i64 [ %arg1, %entry ], [ %i5, %bb2 ]1012 %i2 = phi i64 [ %arg3, %entry ], [ %i3, %bb2 ]1013 %i3 = add i64 %i2, 11014 %i4 = and i64 %i1, 12341015 %i5 = add i64 %i4, %arg21016 %i8 = trunc i64 %i5 to i321017 store i32 %i8, ptr %arg41018 %i6 = icmp ugt i64 %i2, 2551019 br i1 %i6, label %bb7, label %bb21020 1021bb7: ; preds = %bb21022 %i7 = trunc i64 %i5 to i321023 ret i32 %i71024}1025 1026; This test previously removed a sext.w without converting a slli to slliw.1027define signext i32 @bug(i32 signext %x) {1028; CHECK-LABEL: bug:1029; CHECK: # %bb.0: # %entry1030; CHECK-NEXT: beqz a0, .LBB18_51031; CHECK-NEXT: # %bb.1: # %if.end1032; CHECK-NEXT: srliw a1, a0, 161033; CHECK-NEXT: seqz a2, a11034; CHECK-NEXT: slli a2, a2, 41035; CHECK-NEXT: sllw a0, a0, a21036; CHECK-NEXT: beqz a1, .LBB18_31037; CHECK-NEXT: # %bb.2: # %if.end1038; CHECK-NEXT: li a1, 321039; CHECK-NEXT: j .LBB18_41040; CHECK-NEXT: .LBB18_3:1041; CHECK-NEXT: li a1, 161042; CHECK-NEXT: .LBB18_4: # %if.end1043; CHECK-NEXT: srliw a2, a0, 241044; CHECK-NEXT: seqz a2, a21045; CHECK-NEXT: slli a3, a2, 31046; CHECK-NEXT: neg a2, a21047; CHECK-NEXT: sllw a0, a0, a31048; CHECK-NEXT: andi a2, a2, -81049; CHECK-NEXT: add a1, a1, a21050; CHECK-NEXT: srliw a2, a0, 281051; CHECK-NEXT: seqz a2, a21052; CHECK-NEXT: slli a3, a2, 21053; CHECK-NEXT: neg a2, a21054; CHECK-NEXT: sllw a0, a0, a31055; CHECK-NEXT: andi a2, a2, -41056; CHECK-NEXT: add a1, a1, a21057; CHECK-NEXT: srliw a2, a0, 301058; CHECK-NEXT: seqz a2, a21059; CHECK-NEXT: slli a3, a2, 11060; CHECK-NEXT: neg a2, a21061; CHECK-NEXT: sllw a0, a0, a31062; CHECK-NEXT: andi a2, a2, -21063; CHECK-NEXT: add a1, a1, a21064; CHECK-NEXT: not a0, a01065; CHECK-NEXT: srli a0, a0, 311066; CHECK-NEXT: addw a0, a1, a01067; CHECK-NEXT: .LBB18_5: # %cleanup1068; CHECK-NEXT: ret1069;1070; NOREMOVAL-LABEL: bug:1071; NOREMOVAL: # %bb.0: # %entry1072; NOREMOVAL-NEXT: beqz a0, .LBB18_51073; NOREMOVAL-NEXT: # %bb.1: # %if.end1074; NOREMOVAL-NEXT: srliw a1, a0, 161075; NOREMOVAL-NEXT: seqz a2, a11076; NOREMOVAL-NEXT: slli a2, a2, 41077; NOREMOVAL-NEXT: sllw a0, a0, a21078; NOREMOVAL-NEXT: beqz a1, .LBB18_31079; NOREMOVAL-NEXT: # %bb.2: # %if.end1080; NOREMOVAL-NEXT: li a1, 321081; NOREMOVAL-NEXT: j .LBB18_41082; NOREMOVAL-NEXT: .LBB18_3:1083; NOREMOVAL-NEXT: li a1, 161084; NOREMOVAL-NEXT: .LBB18_4: # %if.end1085; NOREMOVAL-NEXT: srliw a2, a0, 241086; NOREMOVAL-NEXT: seqz a2, a21087; NOREMOVAL-NEXT: slli a3, a2, 31088; NOREMOVAL-NEXT: neg a2, a21089; NOREMOVAL-NEXT: sllw a0, a0, a31090; NOREMOVAL-NEXT: andi a2, a2, -81091; NOREMOVAL-NEXT: add a1, a1, a21092; NOREMOVAL-NEXT: srliw a2, a0, 281093; NOREMOVAL-NEXT: seqz a2, a21094; NOREMOVAL-NEXT: slli a3, a2, 21095; NOREMOVAL-NEXT: neg a2, a21096; NOREMOVAL-NEXT: sllw a0, a0, a31097; NOREMOVAL-NEXT: andi a2, a2, -41098; NOREMOVAL-NEXT: add a1, a1, a21099; NOREMOVAL-NEXT: srliw a2, a0, 301100; NOREMOVAL-NEXT: seqz a2, a21101; NOREMOVAL-NEXT: slli a3, a2, 11102; NOREMOVAL-NEXT: neg a2, a21103; NOREMOVAL-NEXT: sllw a0, a0, a31104; NOREMOVAL-NEXT: andi a2, a2, -21105; NOREMOVAL-NEXT: add a1, a1, a21106; NOREMOVAL-NEXT: not a0, a01107; NOREMOVAL-NEXT: srli a0, a0, 311108; NOREMOVAL-NEXT: addw a0, a1, a01109; NOREMOVAL-NEXT: .LBB18_5: # %cleanup1110; NOREMOVAL-NEXT: ret1111entry:1112 %tobool.not = icmp eq i32 %x, 01113 br i1 %tobool.not, label %cleanup, label %if.end1114 1115if.end: ; preds = %entry1116 %tobool1.not = icmp ult i32 %x, 655361117 %shl = shl i32 %x, 161118 %spec.select = select i1 %tobool1.not, i32 %shl, i32 %x1119 %spec.select43 = select i1 %tobool1.not, i32 16, i32 321120 %tobool5.not = icmp ult i32 %spec.select, 167772161121 %shl7 = shl i32 %spec.select, 81122 %sub8 = add nsw i32 %spec.select43, -81123 %x.addr.1 = select i1 %tobool5.not, i32 %shl7, i32 %spec.select1124 %r.1 = select i1 %tobool5.not, i32 %sub8, i32 %spec.select431125 %tobool11.not = icmp ult i32 %x.addr.1, 2684354561126 %shl13 = shl i32 %x.addr.1, 41127 %sub14 = add nsw i32 %r.1, -41128 %x.addr.2 = select i1 %tobool11.not, i32 %shl13, i32 %x.addr.11129 %r.2 = select i1 %tobool11.not, i32 %sub14, i32 %r.11130 %tobool17.not = icmp ult i32 %x.addr.2, 10737418241131 %shl19 = shl i32 %x.addr.2, 21132 %sub20 = add nsw i32 %r.2, -21133 %x.addr.3 = select i1 %tobool17.not, i32 %shl19, i32 %x.addr.21134 %r.3 = select i1 %tobool17.not, i32 %sub20, i32 %r.21135 %x.addr.3.lobit = ashr i32 %x.addr.3, 311136 %x.addr.3.lobit.not = xor i32 %x.addr.3.lobit, -11137 %r.4 = add nsw i32 %r.3, %x.addr.3.lobit.not1138 br label %cleanup1139 1140cleanup: ; preds = %entry, %if.end1141 %retval.0 = phi i32 [ %r.4, %if.end ], [ 0, %entry ]1142 ret i32 %retval.01143}1144 1145define void @test16(i32 signext %arg, i32 signext %arg1) nounwind {1146; CHECK-LABEL: test16:1147; CHECK: # %bb.0: # %bb1148; CHECK-NEXT: addi sp, sp, -321149; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1150; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1151; CHECK-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1152; CHECK-NEXT: mv s0, a11153; CHECK-NEXT: call bar1154; CHECK-NEXT: mv s1, a01155; CHECK-NEXT: .LBB19_1: # %bb21156; CHECK-NEXT: # =>This Inner Loop Header: Depth=11157; CHECK-NEXT: mv a0, s11158; CHECK-NEXT: call bar1159; CHECK-NEXT: sllw s1, s1, s01160; CHECK-NEXT: bnez a0, .LBB19_11161; CHECK-NEXT: # %bb.2: # %bb71162; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1163; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1164; CHECK-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1165; CHECK-NEXT: addi sp, sp, 321166; CHECK-NEXT: ret1167;1168; NOREMOVAL-LABEL: test16:1169; NOREMOVAL: # %bb.0: # %bb1170; NOREMOVAL-NEXT: addi sp, sp, -321171; NOREMOVAL-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1172; NOREMOVAL-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1173; NOREMOVAL-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1174; NOREMOVAL-NEXT: mv s0, a11175; NOREMOVAL-NEXT: call bar1176; NOREMOVAL-NEXT: mv s1, a01177; NOREMOVAL-NEXT: .LBB19_1: # %bb21178; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=11179; NOREMOVAL-NEXT: sext.w a0, s11180; NOREMOVAL-NEXT: call bar1181; NOREMOVAL-NEXT: sllw s1, s1, s01182; NOREMOVAL-NEXT: bnez a0, .LBB19_11183; NOREMOVAL-NEXT: # %bb.2: # %bb71184; NOREMOVAL-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1185; NOREMOVAL-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1186; NOREMOVAL-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1187; NOREMOVAL-NEXT: addi sp, sp, 321188; NOREMOVAL-NEXT: ret1189bb:1190 %i = call signext i32 @bar(i32 signext %arg)1191 br label %bb21192 1193bb2: ; preds = %bb2, %bb1194 %i3 = phi i32 [ %i, %bb ], [ %i5, %bb2 ]1195 %i4 = tail call signext i32 @bar(i32 signext %i3)1196 %i5 = shl i32 %i3, %arg11197 %i6 = icmp eq i32 %i4, 01198 br i1 %i6, label %bb7, label %bb21199 1200bb7: ; preds = %bb21201 ret void1202}1203 1204define void @test17(i32 signext %arg, i32 signext %arg1) nounwind {1205; CHECK-LABEL: test17:1206; CHECK: # %bb.0: # %bb1207; CHECK-NEXT: addi sp, sp, -321208; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1209; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1210; CHECK-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1211; CHECK-NEXT: mv s0, a11212; CHECK-NEXT: call bat1213; CHECK-NEXT: mv s1, a01214; CHECK-NEXT: .LBB20_1: # %bb21215; CHECK-NEXT: # =>This Inner Loop Header: Depth=11216; CHECK-NEXT: mv a0, s11217; CHECK-NEXT: call bar1218; CHECK-NEXT: sllw s1, s1, s01219; CHECK-NEXT: bnez a0, .LBB20_11220; CHECK-NEXT: # %bb.2: # %bb71221; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1222; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1223; CHECK-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1224; CHECK-NEXT: addi sp, sp, 321225; CHECK-NEXT: ret1226;1227; NOREMOVAL-LABEL: test17:1228; NOREMOVAL: # %bb.0: # %bb1229; NOREMOVAL-NEXT: addi sp, sp, -321230; NOREMOVAL-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1231; NOREMOVAL-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1232; NOREMOVAL-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1233; NOREMOVAL-NEXT: mv s0, a11234; NOREMOVAL-NEXT: call bat1235; NOREMOVAL-NEXT: mv s1, a01236; NOREMOVAL-NEXT: .LBB20_1: # %bb21237; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=11238; NOREMOVAL-NEXT: sext.w a0, s11239; NOREMOVAL-NEXT: call bar1240; NOREMOVAL-NEXT: sllw s1, s1, s01241; NOREMOVAL-NEXT: bnez a0, .LBB20_11242; NOREMOVAL-NEXT: # %bb.2: # %bb71243; NOREMOVAL-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1244; NOREMOVAL-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1245; NOREMOVAL-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1246; NOREMOVAL-NEXT: addi sp, sp, 321247; NOREMOVAL-NEXT: ret1248bb:1249 %i = call zeroext i16 @bat(i32 signext %arg)1250 %zext = zext i16 %i to i321251 br label %bb21252 1253bb2: ; preds = %bb2, %bb1254 %i3 = phi i32 [ %zext, %bb ], [ %i5, %bb2 ]1255 %i4 = tail call signext i32 @bar(i32 signext %i3)1256 %i5 = shl i32 %i3, %arg11257 %i6 = icmp eq i32 %i4, 01258 br i1 %i6, label %bb7, label %bb21259 1260bb7: ; preds = %bb21261 ret void1262}1263declare zeroext i16 @bat(i32 signext)1264 1265define void @test18(i32 signext %arg, i32 signext %arg1) nounwind {1266; CHECK-LABEL: test18:1267; CHECK: # %bb.0: # %bb1268; CHECK-NEXT: addi sp, sp, -321269; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1270; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1271; CHECK-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1272; CHECK-NEXT: mv s0, a11273; CHECK-NEXT: sha256sig0 s1, a11274; CHECK-NEXT: .LBB21_1: # %bb21275; CHECK-NEXT: # =>This Inner Loop Header: Depth=11276; CHECK-NEXT: mv a0, s11277; CHECK-NEXT: call bar1278; CHECK-NEXT: sllw s1, s1, s01279; CHECK-NEXT: bnez a0, .LBB21_11280; CHECK-NEXT: # %bb.2: # %bb71281; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1282; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1283; CHECK-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1284; CHECK-NEXT: addi sp, sp, 321285; CHECK-NEXT: ret1286;1287; NOREMOVAL-LABEL: test18:1288; NOREMOVAL: # %bb.0: # %bb1289; NOREMOVAL-NEXT: addi sp, sp, -321290; NOREMOVAL-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1291; NOREMOVAL-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1292; NOREMOVAL-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1293; NOREMOVAL-NEXT: mv s0, a11294; NOREMOVAL-NEXT: sha256sig0 s1, a11295; NOREMOVAL-NEXT: .LBB21_1: # %bb21296; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=11297; NOREMOVAL-NEXT: sext.w a0, s11298; NOREMOVAL-NEXT: call bar1299; NOREMOVAL-NEXT: sllw s1, s1, s01300; NOREMOVAL-NEXT: bnez a0, .LBB21_11301; NOREMOVAL-NEXT: # %bb.2: # %bb71302; NOREMOVAL-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1303; NOREMOVAL-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1304; NOREMOVAL-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1305; NOREMOVAL-NEXT: addi sp, sp, 321306; NOREMOVAL-NEXT: ret1307bb:1308 %i = call i32 @llvm.riscv.sha256sig0(i32 %arg1)1309 br label %bb21310 1311bb2: ; preds = %bb2, %bb1312 %i3 = phi i32 [ %i, %bb ], [ %i5, %bb2 ]1313 %i4 = tail call signext i32 @bar(i32 signext %i3)1314 %i5 = shl i32 %i3, %arg11315 %i6 = icmp eq i32 %i4, 01316 br i1 %i6, label %bb7, label %bb21317 1318bb7: ; preds = %bb21319 ret void1320}1321 1322; The type promotion of %7 forms a sext_inreg, but %7 and %6 are combined to1323; form a sh2add. This leaves behind a sext.w that isn't needed.1324define signext i32 @sextw_sh2add(i1 zeroext %0, ptr %1, i32 signext %2, i32 signext %3, i32 signext %4) {1325; RV64I-LABEL: sextw_sh2add:1326; RV64I: # %bb.0:1327; RV64I-NEXT: slli a2, a2, 21328; RV64I-NEXT: add a3, a2, a31329; RV64I-NEXT: beqz a0, .LBB22_21330; RV64I-NEXT: # %bb.1:1331; RV64I-NEXT: sw a3, 0(a1)1332; RV64I-NEXT: .LBB22_2:1333; RV64I-NEXT: addw a0, a3, a41334; RV64I-NEXT: ret1335;1336; RV64ZBB-LABEL: sextw_sh2add:1337; RV64ZBB: # %bb.0:1338; RV64ZBB-NEXT: sh2add a2, a2, a31339; RV64ZBB-NEXT: beqz a0, .LBB22_21340; RV64ZBB-NEXT: # %bb.1:1341; RV64ZBB-NEXT: sw a2, 0(a1)1342; RV64ZBB-NEXT: .LBB22_2:1343; RV64ZBB-NEXT: addw a0, a2, a41344; RV64ZBB-NEXT: ret1345;1346; NOREMOVAL-LABEL: sextw_sh2add:1347; NOREMOVAL: # %bb.0:1348; NOREMOVAL-NEXT: sh2add a2, a2, a31349; NOREMOVAL-NEXT: mv a2, a21350; NOREMOVAL-NEXT: beqz a0, .LBB22_21351; NOREMOVAL-NEXT: # %bb.1:1352; NOREMOVAL-NEXT: sw a2, 0(a1)1353; NOREMOVAL-NEXT: .LBB22_2:1354; NOREMOVAL-NEXT: addw a0, a2, a41355; NOREMOVAL-NEXT: ret1356 %6 = shl i32 %2, 21357 %7 = add i32 %6, %31358 br i1 %0, label %8, label %91359 13608: ; preds = %51361 store i32 %7, ptr %1, align 41362 br label %91363 13649: ; preds = %5, %81365 %10 = add i32 %7, %41366 ret i32 %101367}1368 1369; Negative test - an explicit sext.w *is* required1370define signext i32 @test19(i64 %arg, i1 zeroext %c1, i1 zeroext %c2, ptr %p) nounwind {1371; CHECK-LABEL: test19:1372; CHECK: # %bb.0: # %bb1373; CHECK-NEXT: addi sp, sp, -161374; CHECK-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1375; CHECK-NEXT: sd s0, 0(sp) # 8-byte Folded Spill1376; CHECK-NEXT: neg a0, a11377; CHECK-NEXT: li a1, 11378; CHECK-NEXT: slli a1, a1, 321379; CHECK-NEXT: addi s0, a1, 351380; CHECK-NEXT: and s0, a0, s01381; CHECK-NEXT: sd s0, 0(a3)1382; CHECK-NEXT: beqz a2, .LBB23_21383; CHECK-NEXT: # %bb.1: # %bb21384; CHECK-NEXT: li a0, 01385; CHECK-NEXT: call bar1386; CHECK-NEXT: mv s0, a01387; CHECK-NEXT: .LBB23_2: # %bb71388; CHECK-NEXT: call side_effect1389; CHECK-NEXT: sext.w a0, s01390; CHECK-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1391; CHECK-NEXT: ld s0, 0(sp) # 8-byte Folded Reload1392; CHECK-NEXT: addi sp, sp, 161393; CHECK-NEXT: ret1394;1395; NOREMOVAL-LABEL: test19:1396; NOREMOVAL: # %bb.0: # %bb1397; NOREMOVAL-NEXT: addi sp, sp, -161398; NOREMOVAL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1399; NOREMOVAL-NEXT: sd s0, 0(sp) # 8-byte Folded Spill1400; NOREMOVAL-NEXT: neg a0, a11401; NOREMOVAL-NEXT: li a1, 11402; NOREMOVAL-NEXT: slli a1, a1, 321403; NOREMOVAL-NEXT: addi s0, a1, 351404; NOREMOVAL-NEXT: and s0, a0, s01405; NOREMOVAL-NEXT: sd s0, 0(a3)1406; NOREMOVAL-NEXT: beqz a2, .LBB23_21407; NOREMOVAL-NEXT: # %bb.1: # %bb21408; NOREMOVAL-NEXT: li a0, 01409; NOREMOVAL-NEXT: call bar1410; NOREMOVAL-NEXT: mv s0, a01411; NOREMOVAL-NEXT: .LBB23_2: # %bb71412; NOREMOVAL-NEXT: call side_effect1413; NOREMOVAL-NEXT: sext.w a0, s01414; NOREMOVAL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1415; NOREMOVAL-NEXT: ld s0, 0(sp) # 8-byte Folded Reload1416; NOREMOVAL-NEXT: addi sp, sp, 161417; NOREMOVAL-NEXT: ret1418bb:1419 %sel = select i1 %c1, i64 4294967331, i64 01420 store i64 %sel, ptr %p, align 81421 br i1 %c2, label %bb2, label %bb71422 1423bb2: ; preds = %bb2, %bb1424 %i4 = call signext i32 @bar(i32 0)1425 %i4.sext = sext i32 %i4 to i641426 br label %bb71427 1428bb7: ; preds = %bb21429 %phi = phi i64 [ %sel, %bb ], [ %i4.sext, %bb2 ]1430 %trunc = trunc i64 %phi to i321431 call void @side_effect()1432 ret i32 %trunc1433}1434 1435 declare void @side_effect(i64)1436 1437define void @test20(<vscale x 1 x i32> %arg, i32 signext %arg1) nounwind {1438; CHECK-LABEL: test20:1439; CHECK: # %bb.0: # %bb1440; CHECK-NEXT: addi sp, sp, -321441; CHECK-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1442; CHECK-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1443; CHECK-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1444; CHECK-NEXT: mv s0, a01445; CHECK-NEXT: vsetivli zero, 1, e32, m1, ta, ma1446; CHECK-NEXT: vmv.x.s s1, v81447; CHECK-NEXT: .LBB24_1: # %bb21448; CHECK-NEXT: # =>This Inner Loop Header: Depth=11449; CHECK-NEXT: mv a0, s11450; CHECK-NEXT: call bar1451; CHECK-NEXT: sllw s1, s1, s01452; CHECK-NEXT: bnez a0, .LBB24_11453; CHECK-NEXT: # %bb.2: # %bb71454; CHECK-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1455; CHECK-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1456; CHECK-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1457; CHECK-NEXT: addi sp, sp, 321458; CHECK-NEXT: ret1459;1460; NOREMOVAL-LABEL: test20:1461; NOREMOVAL: # %bb.0: # %bb1462; NOREMOVAL-NEXT: addi sp, sp, -321463; NOREMOVAL-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1464; NOREMOVAL-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1465; NOREMOVAL-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1466; NOREMOVAL-NEXT: mv s0, a01467; NOREMOVAL-NEXT: vsetivli zero, 1, e32, m1, ta, ma1468; NOREMOVAL-NEXT: vmv.x.s s1, v81469; NOREMOVAL-NEXT: .LBB24_1: # %bb21470; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=11471; NOREMOVAL-NEXT: sext.w a0, s11472; NOREMOVAL-NEXT: call bar1473; NOREMOVAL-NEXT: sllw s1, s1, s01474; NOREMOVAL-NEXT: bnez a0, .LBB24_11475; NOREMOVAL-NEXT: # %bb.2: # %bb71476; NOREMOVAL-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1477; NOREMOVAL-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1478; NOREMOVAL-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1479; NOREMOVAL-NEXT: addi sp, sp, 321480; NOREMOVAL-NEXT: ret1481bb:1482 %i = call i32 @llvm.riscv.vmv.x.s.nxv1i32(<vscale x 1 x i32> %arg)1483 br label %bb21484 1485bb2: ; preds = %bb2, %bb1486 %i3 = phi i32 [ %i, %bb ], [ %i5, %bb2 ]1487 %i4 = tail call signext i32 @bar(i32 signext %i3)1488 %i5 = shl i32 %i3, %arg11489 %i6 = icmp eq i32 %i4, 01490 br i1 %i6, label %bb7, label %bb21491 1492bb7: ; preds = %bb21493 ret void1494}1495 1496; Test that we can look through brev8 in hasAllNBitUsers.1497define signext i32 @test21(i64 %arg1, i64 %arg2, i64 %arg3) {1498; RV64I-LABEL: test21:1499; RV64I: # %bb.0: # %entry1500; RV64I-NEXT: addi a2, a2, -11501; RV64I-NEXT: lui a3, 616811502; RV64I-NEXT: lui a4, 2097151503; RV64I-NEXT: addi a3, a3, -2411504; RV64I-NEXT: addi a4, a4, 8191505; RV64I-NEXT: slli a5, a3, 321506; RV64I-NEXT: add a3, a3, a51507; RV64I-NEXT: slli a5, a4, 321508; RV64I-NEXT: add a4, a4, a51509; RV64I-NEXT: li a5, 2561510; RV64I-NEXT: .LBB25_1: # %bb21511; RV64I-NEXT: # =>This Inner Loop Header: Depth=11512; RV64I-NEXT: srli a6, a0, 41513; RV64I-NEXT: and a0, a0, a31514; RV64I-NEXT: and a6, a6, a31515; RV64I-NEXT: slli a0, a0, 41516; RV64I-NEXT: or a0, a6, a01517; RV64I-NEXT: srli a6, a0, 21518; RV64I-NEXT: and a0, a0, a41519; RV64I-NEXT: and a6, a6, a41520; RV64I-NEXT: slli a0, a0, 21521; RV64I-NEXT: or a0, a6, a01522; RV64I-NEXT: andi a6, a0, 651523; RV64I-NEXT: srli a0, a0, 11524; RV64I-NEXT: slli a6, a6, 11525; RV64I-NEXT: andi a0, a0, 11041526; RV64I-NEXT: or a0, a0, a61527; RV64I-NEXT: addi a2, a2, 11528; RV64I-NEXT: addw a0, a0, a11529; RV64I-NEXT: bltu a2, a5, .LBB25_11530; RV64I-NEXT: # %bb.2: # %bb71531; RV64I-NEXT: ret1532;1533; RV64ZBB-LABEL: test21:1534; RV64ZBB: # %bb.0: # %entry1535; RV64ZBB-NEXT: addi a2, a2, -11536; RV64ZBB-NEXT: li a3, 2561537; RV64ZBB-NEXT: .LBB25_1: # %bb21538; RV64ZBB-NEXT: # =>This Inner Loop Header: Depth=11539; RV64ZBB-NEXT: brev8 a0, a01540; RV64ZBB-NEXT: andi a0, a0, 12341541; RV64ZBB-NEXT: addi a2, a2, 11542; RV64ZBB-NEXT: addw a0, a0, a11543; RV64ZBB-NEXT: bltu a2, a3, .LBB25_11544; RV64ZBB-NEXT: # %bb.2: # %bb71545; RV64ZBB-NEXT: ret1546;1547; NOREMOVAL-LABEL: test21:1548; NOREMOVAL: # %bb.0: # %entry1549; NOREMOVAL-NEXT: addi a2, a2, -11550; NOREMOVAL-NEXT: li a3, 2561551; NOREMOVAL-NEXT: .LBB25_1: # %bb21552; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=11553; NOREMOVAL-NEXT: brev8 a0, a01554; NOREMOVAL-NEXT: andi a0, a0, 12341555; NOREMOVAL-NEXT: addi a2, a2, 11556; NOREMOVAL-NEXT: add a0, a0, a11557; NOREMOVAL-NEXT: bltu a2, a3, .LBB25_11558; NOREMOVAL-NEXT: # %bb.2: # %bb71559; NOREMOVAL-NEXT: sext.w a0, a01560; NOREMOVAL-NEXT: ret1561entry:1562 br label %bb21563 1564bb2: ; preds = %bb2, %entry1565 %i1 = phi i64 [ %arg1, %entry ], [ %i5, %bb2 ]1566 %i2 = phi i64 [ %arg3, %entry ], [ %i3, %bb2 ]1567 %i3 = add i64 %i2, 11568 %bswap = call i64 @llvm.bswap.i64(i64 %i1)1569 %bitreverse = call i64 @llvm.bitreverse.i64(i64 %bswap)1570 %i4 = and i64 %bitreverse, 12341571 %i5 = add i64 %i4, %arg21572 %i6 = icmp ugt i64 %i2, 2551573 br i1 %i6, label %bb7, label %bb21574 1575bb7: ; preds = %bb21576 %i7 = trunc i64 %i5 to i321577 ret i32 %i71578}1579 1580; Negative test for looking through brev8. Make sure we consider that it works1581; on bytes.1582define signext i32 @test22(i64 %arg1, i64 %arg2, i64 %arg3) {1583; RV64I-LABEL: test22:1584; RV64I: # %bb.0: # %entry1585; RV64I-NEXT: addi a2, a2, -11586; RV64I-NEXT: lui a3, %hi(.LCPI26_0)1587; RV64I-NEXT: lui a4, %hi(.LCPI26_1)1588; RV64I-NEXT: lui a5, %hi(.LCPI26_2)1589; RV64I-NEXT: lui a6, %hi(.LCPI26_3)1590; RV64I-NEXT: li a7, 691591; RV64I-NEXT: ld a3, %lo(.LCPI26_0)(a3)1592; RV64I-NEXT: ld a4, %lo(.LCPI26_1)(a4)1593; RV64I-NEXT: ld a5, %lo(.LCPI26_2)(a5)1594; RV64I-NEXT: ld a6, %lo(.LCPI26_3)(a6)1595; RV64I-NEXT: slli a7, a7, 321596; RV64I-NEXT: li t0, 651597; RV64I-NEXT: slli t0, t0, 281598; RV64I-NEXT: li t1, 2561599; RV64I-NEXT: .LBB26_1: # %bb21600; RV64I-NEXT: # =>This Inner Loop Header: Depth=11601; RV64I-NEXT: slli t2, a0, 111602; RV64I-NEXT: slli a0, a0, 31603; RV64I-NEXT: and t2, t2, a31604; RV64I-NEXT: and a0, a0, a41605; RV64I-NEXT: or a0, a0, t21606; RV64I-NEXT: srli t2, a0, 21607; RV64I-NEXT: and a0, a0, a61608; RV64I-NEXT: and t2, t2, a51609; RV64I-NEXT: slli a0, a0, 21610; RV64I-NEXT: or a0, t2, a01611; RV64I-NEXT: srli t2, a0, 11612; RV64I-NEXT: and a0, a0, t01613; RV64I-NEXT: and t2, t2, a71614; RV64I-NEXT: slli a0, a0, 11615; RV64I-NEXT: or a0, t2, a01616; RV64I-NEXT: srli a0, a0, 281617; RV64I-NEXT: addi a2, a2, 11618; RV64I-NEXT: add a0, a0, a11619; RV64I-NEXT: bltu a2, t1, .LBB26_11620; RV64I-NEXT: # %bb.2: # %bb71621; RV64I-NEXT: sext.w a0, a01622; RV64I-NEXT: ret1623;1624; RV64ZBB-LABEL: test22:1625; RV64ZBB: # %bb.0: # %entry1626; RV64ZBB-NEXT: addi a2, a2, -11627; RV64ZBB-NEXT: li a3, 2561628; RV64ZBB-NEXT: .LBB26_1: # %bb21629; RV64ZBB-NEXT: # =>This Inner Loop Header: Depth=11630; RV64ZBB-NEXT: slli a0, a0, 71631; RV64ZBB-NEXT: brev8 a0, a01632; RV64ZBB-NEXT: srli a0, a0, 281633; RV64ZBB-NEXT: andi a0, a0, 12341634; RV64ZBB-NEXT: addi a2, a2, 11635; RV64ZBB-NEXT: add a0, a0, a11636; RV64ZBB-NEXT: bltu a2, a3, .LBB26_11637; RV64ZBB-NEXT: # %bb.2: # %bb71638; RV64ZBB-NEXT: sext.w a0, a01639; RV64ZBB-NEXT: ret1640;1641; NOREMOVAL-LABEL: test22:1642; NOREMOVAL: # %bb.0: # %entry1643; NOREMOVAL-NEXT: addi a2, a2, -11644; NOREMOVAL-NEXT: li a3, 2561645; NOREMOVAL-NEXT: .LBB26_1: # %bb21646; NOREMOVAL-NEXT: # =>This Inner Loop Header: Depth=11647; NOREMOVAL-NEXT: slli a0, a0, 71648; NOREMOVAL-NEXT: brev8 a0, a01649; NOREMOVAL-NEXT: srli a0, a0, 281650; NOREMOVAL-NEXT: andi a0, a0, 12341651; NOREMOVAL-NEXT: addi a2, a2, 11652; NOREMOVAL-NEXT: add a0, a0, a11653; NOREMOVAL-NEXT: bltu a2, a3, .LBB26_11654; NOREMOVAL-NEXT: # %bb.2: # %bb71655; NOREMOVAL-NEXT: sext.w a0, a01656; NOREMOVAL-NEXT: ret1657entry:1658 br label %bb21659 1660bb2: ; preds = %bb2, %entry1661 %i1 = phi i64 [ %arg1, %entry ], [ %i5, %bb2 ]1662 %i2 = phi i64 [ %arg3, %entry ], [ %i3, %bb2 ]1663 %i3 = add i64 %i2, 11664 %shl = shl i64 %i1, 71665 %bswap = call i64 @llvm.bswap.i64(i64 %shl)1666 %bitreverse = call i64 @llvm.bitreverse.i64(i64 %bswap)1667 %lshr = lshr i64 %bitreverse, 281668 %i4 = and i64 %lshr, 12341669 %i5 = add i64 %i4, %arg21670 %i6 = icmp ugt i64 %i2, 2551671 br i1 %i6, label %bb7, label %bb21672 1673bb7: ; preds = %bb21674 %i7 = trunc i64 %i5 to i321675 ret i32 %i71676}1677