Skip to content

Commit b02d0b2

Browse files
committed
Add a bitwidth and fixup test
1 parent 5349b5c commit b02d0b2

File tree

3 files changed

+23
-8
lines changed

3 files changed

+23
-8
lines changed

llvm/include/llvm/CodeGen/GlobalISel/GISelValueTracking.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,14 @@ class GISelValueTracking : public GISelChangeObserver {
106106
/// that are all less than the element bit-width of the shift node, return the
107107
/// valid constant range.
108108
std::optional<ConstantRange>
109-
getValidShiftAmountRange(Register R, const APInt &DemandedElts,
110-
unsigned Depth);
109+
getValidShiftAmountRange(Register R, unsigned BitWidth,
110+
const APInt &DemandedElts, unsigned Depth);
111111

112112
/// If a G_SHL/G_ASHR/G_LSHR node with shift operand \p R has shift amounts
113113
/// that are all less than the element bit-width of the shift node, return the
114114
/// minimum possible value.
115115
std::optional<uint64_t> getValidMinimumShiftAmount(Register R,
116+
unsigned BitWidth,
116117
const APInt &DemandedElts,
117118
unsigned Depth = 0);
118119

llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1861,7 +1861,8 @@ unsigned GISelValueTracking::computeNumSignBits(Register R,
18611861
Register Src1 = MI.getOperand(1).getReg();
18621862
Register Src2 = MI.getOperand(2).getReg();
18631863
FirstAnswer = computeNumSignBits(Src1, DemandedElts, Depth + 1);
1864-
if (auto C = getValidMinimumShiftAmount(Src2, DemandedElts, Depth + 1))
1864+
if (auto C =
1865+
getValidMinimumShiftAmount(Src2, TyBits, DemandedElts, Depth + 1))
18651866
FirstAnswer = std::min<uint64_t>(FirstAnswer + *C, TyBits);
18661867
break;
18671868
}
@@ -2012,13 +2013,12 @@ unsigned GISelValueTracking::computeNumSignBits(Register R, unsigned Depth) {
20122013
}
20132014

20142015
std::optional<ConstantRange> GISelValueTracking::getValidShiftAmountRange(
2015-
Register R, const APInt &DemandedElts, unsigned Depth) {
2016+
Register R, unsigned BitWidth, const APInt &DemandedElts, unsigned Depth) {
20162017
// Shifting more than the bitwidth is not valid.
20172018
MachineInstr &MI = *MRI.getVRegDef(R);
20182019
unsigned Opcode = MI.getOpcode();
20192020

20202021
LLT Ty = MRI.getType(R);
2021-
unsigned BitWidth = Ty.getScalarSizeInBits();
20222022

20232023
if (Opcode == TargetOpcode::G_CONSTANT) {
20242024
const APInt &ShAmt = MI.getOperand(1).getCImm()->getValue();
@@ -2062,9 +2062,9 @@ std::optional<ConstantRange> GISelValueTracking::getValidShiftAmountRange(
20622062
}
20632063

20642064
std::optional<uint64_t> GISelValueTracking::getValidMinimumShiftAmount(
2065-
Register R, const APInt &DemandedElts, unsigned Depth) {
2065+
Register R, unsigned BitWidth, const APInt &DemandedElts, unsigned Depth) {
20662066
if (std::optional<ConstantRange> AmtRange =
2067-
getValidShiftAmountRange(R, DemandedElts, Depth))
2067+
getValidShiftAmountRange(R, BitWidth, DemandedElts, Depth))
20682068
return AmtRange->getUnsignedMin().getZExtValue();
20692069
return std::nullopt;
20702070
}

llvm/test/CodeGen/AArch64/GlobalISel/knownbits-ashr.mir

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# NOTE: Assertions have been autogenerated by utils/update_givaluetracking_test_checks.py UTC_ARGS: --version 5
2-
# RUN: llc -mtriple aarch64 -passes="print<gisel-value-tracking>" %s -o - 2>&1 | FileCheck %s
2+
# RUN: llc -mtriple aarch64 -passes="print<gisel-value-tracking>" %s -filetype=null 2>&1 | FileCheck %s
33

44
---
55
name: Cst
@@ -50,6 +50,20 @@ body: |
5050
%2:_(s8) = G_ASHR %0, %1
5151
...
5252
---
53+
name: ScalarDifferentSizes
54+
body: |
55+
bb.1:
56+
; CHECK-LABEL: name: @ScalarDifferentSizes
57+
; CHECK-NEXT: %0:_ KnownBits:???????????????? SignBits:1
58+
; CHECK-NEXT: %1:_ KnownBits:00001001 SignBits:4
59+
; CHECK-NEXT: %2:_ KnownBits:???????????????? SignBits:10
60+
; CHECK-NEXT: %3:_ KnownBits:???????????????? SignBits:16
61+
%0:_(s16) = COPY $h0
62+
%1:_(s8) = G_CONSTANT i8 9
63+
%2:_(s16) = G_ASHR %0, %1
64+
%3:_(s16) = G_ASHR %2, %1
65+
...
66+
---
5367
name: VectorVar
5468
body: |
5569
bb.1:

0 commit comments

Comments
 (0)