Skip to content

Commit 153da95

Browse files
committed
[GlobalISel] Add computeNumSignBits for ASHR
1 parent 2f3feb7 commit 153da95

File tree

4 files changed

+24
-59
lines changed

4 files changed

+24
-59
lines changed

llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -864,6 +864,16 @@ unsigned GISelValueTracking::computeNumSignBits(Register R,
864864
return TyBits - 1; // Every always-zero bit is a sign bit.
865865
break;
866866
}
867+
case TargetOpcode::G_ASHR: {
868+
Register Src1 = MI.getOperand(1).getReg();
869+
Register Src2 = MI.getOperand(2).getReg();
870+
LLT SrcTy = MRI.getType(Src1);
871+
FirstAnswer = computeNumSignBits(Src1, DemandedElts, Depth + 1);
872+
if (auto C = getIConstantSplatVal(Src2, MRI))
873+
FirstAnswer = std::max<uint64_t>(FirstAnswer + C->getZExtValue(),
874+
SrcTy.getScalarSizeInBits());
875+
break;
876+
}
867877
case TargetOpcode::G_INTRINSIC:
868878
case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
869879
case TargetOpcode::G_INTRINSIC_CONVERGENT:

llvm/test/CodeGen/AArch64/aarch64-smull.ll

Lines changed: 12 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2265,68 +2265,25 @@ define <2 x i64> @lsr_const(<2 x i64> %a, <2 x i64> %b) {
22652265
}
22662266

22672267
define <2 x i64> @asr(<2 x i64> %a, <2 x i64> %b) {
2268-
; CHECK-NEON-LABEL: asr:
2269-
; CHECK-NEON: // %bb.0:
2270-
; CHECK-NEON-NEXT: shrn v0.2s, v0.2d, #32
2271-
; CHECK-NEON-NEXT: shrn v1.2s, v1.2d, #32
2272-
; CHECK-NEON-NEXT: smull v0.2d, v0.2s, v1.2s
2273-
; CHECK-NEON-NEXT: ret
2274-
;
2275-
; CHECK-SVE-LABEL: asr:
2276-
; CHECK-SVE: // %bb.0:
2277-
; CHECK-SVE-NEXT: shrn v0.2s, v0.2d, #32
2278-
; CHECK-SVE-NEXT: shrn v1.2s, v1.2d, #32
2279-
; CHECK-SVE-NEXT: smull v0.2d, v0.2s, v1.2s
2280-
; CHECK-SVE-NEXT: ret
2281-
;
2282-
; CHECK-GI-LABEL: asr:
2283-
; CHECK-GI: // %bb.0:
2284-
; CHECK-GI-NEXT: sshr v0.2d, v0.2d, #32
2285-
; CHECK-GI-NEXT: sshr v1.2d, v1.2d, #32
2286-
; CHECK-GI-NEXT: fmov x8, d0
2287-
; CHECK-GI-NEXT: fmov x9, d1
2288-
; CHECK-GI-NEXT: mov x10, v0.d[1]
2289-
; CHECK-GI-NEXT: mov x11, v1.d[1]
2290-
; CHECK-GI-NEXT: mul x8, x8, x9
2291-
; CHECK-GI-NEXT: mul x9, x10, x11
2292-
; CHECK-GI-NEXT: mov v0.d[0], x8
2293-
; CHECK-GI-NEXT: mov v0.d[1], x9
2294-
; CHECK-GI-NEXT: ret
2268+
; CHECK-LABEL: asr:
2269+
; CHECK: // %bb.0:
2270+
; CHECK-NEXT: shrn v0.2s, v0.2d, #32
2271+
; CHECK-NEXT: shrn v1.2s, v1.2d, #32
2272+
; CHECK-NEXT: smull v0.2d, v0.2s, v1.2s
2273+
; CHECK-NEXT: ret
22952274
%x = ashr <2 x i64> %a, <i64 32, i64 32>
22962275
%y = ashr <2 x i64> %b, <i64 32, i64 32>
22972276
%z = mul nsw <2 x i64> %x, %y
22982277
ret <2 x i64> %z
22992278
}
23002279

23012280
define <2 x i64> @asr_const(<2 x i64> %a, <2 x i64> %b) {
2302-
; CHECK-NEON-LABEL: asr_const:
2303-
; CHECK-NEON: // %bb.0:
2304-
; CHECK-NEON-NEXT: movi v1.2s, #31
2305-
; CHECK-NEON-NEXT: shrn v0.2s, v0.2d, #32
2306-
; CHECK-NEON-NEXT: smull v0.2d, v0.2s, v1.2s
2307-
; CHECK-NEON-NEXT: ret
2308-
;
2309-
; CHECK-SVE-LABEL: asr_const:
2310-
; CHECK-SVE: // %bb.0:
2311-
; CHECK-SVE-NEXT: movi v1.2s, #31
2312-
; CHECK-SVE-NEXT: shrn v0.2s, v0.2d, #32
2313-
; CHECK-SVE-NEXT: smull v0.2d, v0.2s, v1.2s
2314-
; CHECK-SVE-NEXT: ret
2315-
;
2316-
; CHECK-GI-LABEL: asr_const:
2317-
; CHECK-GI: // %bb.0:
2318-
; CHECK-GI-NEXT: adrp x8, .LCPI81_0
2319-
; CHECK-GI-NEXT: sshr v0.2d, v0.2d, #32
2320-
; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI81_0]
2321-
; CHECK-GI-NEXT: fmov x8, d0
2322-
; CHECK-GI-NEXT: fmov x9, d1
2323-
; CHECK-GI-NEXT: mov x10, v0.d[1]
2324-
; CHECK-GI-NEXT: mov x11, v1.d[1]
2325-
; CHECK-GI-NEXT: mul x8, x8, x9
2326-
; CHECK-GI-NEXT: mul x9, x10, x11
2327-
; CHECK-GI-NEXT: mov v0.d[0], x8
2328-
; CHECK-GI-NEXT: mov v0.d[1], x9
2329-
; CHECK-GI-NEXT: ret
2281+
; CHECK-LABEL: asr_const:
2282+
; CHECK: // %bb.0:
2283+
; CHECK-NEXT: movi v1.2s, #31
2284+
; CHECK-NEXT: shrn v0.2s, v0.2d, #32
2285+
; CHECK-NEXT: smull v0.2d, v0.2s, v1.2s
2286+
; CHECK-NEXT: ret
23302287
%x = ashr <2 x i64> %a, <i64 32, i64 32>
23312288
%z = mul nsw <2 x i64> %x, <i64 31, i64 31>
23322289
ret <2 x i64> %z

llvm/test/CodeGen/RISCV/GlobalISel/legalizer/legalize-abs-rv64.mir

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,7 @@ body: |
8888
; RV64I-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[ASSERT_SEXT]], [[ASHR]]
8989
; RV64I-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s64) = G_SEXT_INREG [[ADD]], 32
9090
; RV64I-NEXT: [[XOR:%[0-9]+]]:_(s64) = G_XOR [[SEXT_INREG]], [[ASHR]]
91-
; RV64I-NEXT: [[SEXT_INREG1:%[0-9]+]]:_(s64) = G_SEXT_INREG [[XOR]], 32
92-
; RV64I-NEXT: $x10 = COPY [[SEXT_INREG1]](s64)
91+
; RV64I-NEXT: $x10 = COPY [[XOR]](s64)
9392
; RV64I-NEXT: PseudoRET implicit $x10
9493
;
9594
; RV64ZBB-LABEL: name: abs_i32

llvm/test/CodeGen/RISCV/GlobalISel/rv64zbb.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,9 +1053,8 @@ define signext i32 @abs_i32_sext(i32 signext %x) {
10531053
; RV64I-LABEL: abs_i32_sext:
10541054
; RV64I: # %bb.0:
10551055
; RV64I-NEXT: srai a1, a0, 31
1056-
; RV64I-NEXT: add a0, a0, a1
1056+
; RV64I-NEXT: addw a0, a0, a1
10571057
; RV64I-NEXT: xor a0, a0, a1
1058-
; RV64I-NEXT: sext.w a0, a0
10591058
; RV64I-NEXT: ret
10601059
;
10611060
; RV64ZBB-LABEL: abs_i32_sext:

0 commit comments

Comments
 (0)