brintos

brintos / llvm-project-archived public Read only

0
0
Text · 55.2 KiB · 7e7ba9f Raw
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