Skip to content

Commit 0c6141a

Browse files
authored
[GlobalISel] Add computeNumSignBits for SHL (#152067)
This patch ports the `ISD::SHL` handling from SelectionDAG’s `ComputeNumSignBits` to GlobalISel. Related to #150515.
1 parent fa63642 commit 0c6141a

File tree

2 files changed

+280
-0
lines changed

2 files changed

+280
-0
lines changed

llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1892,6 +1892,44 @@ unsigned GISelValueTracking::computeNumSignBits(Register R,
18921892
FirstAnswer = std::min<uint64_t>(FirstAnswer + *C, TyBits);
18931893
break;
18941894
}
1895+
case TargetOpcode::G_SHL: {
1896+
Register Src1 = MI.getOperand(1).getReg();
1897+
Register Src2 = MI.getOperand(2).getReg();
1898+
if (std::optional<ConstantRange> ShAmtRange =
1899+
getValidShiftAmountRange(Src2, DemandedElts, Depth + 1)) {
1900+
uint64_t MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
1901+
uint64_t MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
1902+
1903+
MachineInstr &ExtMI = *MRI.getVRegDef(Src1);
1904+
unsigned ExtOpc = ExtMI.getOpcode();
1905+
1906+
// Try to look through ZERO/SIGN/ANY_EXTEND. If all extended bits are
1907+
// shifted out, then we can compute the number of sign bits for the
1908+
// operand being extended. A future improvement could be to pass along the
1909+
// "shifted left by" information in the recursive calls to
1910+
// ComputeKnownSignBits. Allowing us to handle this more generically.
1911+
if (ExtOpc == TargetOpcode::G_SEXT || ExtOpc == TargetOpcode::G_ZEXT ||
1912+
ExtOpc == TargetOpcode::G_ANYEXT) {
1913+
LLT ExtTy = MRI.getType(Src1);
1914+
Register Extendee = ExtMI.getOperand(1).getReg();
1915+
LLT ExtendeeTy = MRI.getType(Extendee);
1916+
uint64_t SizeDiff =
1917+
ExtTy.getScalarSizeInBits() - ExtendeeTy.getScalarSizeInBits();
1918+
1919+
if (SizeDiff <= MinShAmt) {
1920+
unsigned Tmp =
1921+
SizeDiff + computeNumSignBits(Extendee, DemandedElts, Depth + 1);
1922+
if (MaxShAmt < Tmp)
1923+
return Tmp - MaxShAmt;
1924+
}
1925+
}
1926+
// shl destroys sign bits, ensure it doesn't shift out all sign bits.
1927+
unsigned Tmp = computeNumSignBits(Src1, DemandedElts, Depth + 1);
1928+
if (MaxShAmt < Tmp)
1929+
return Tmp - MaxShAmt;
1930+
}
1931+
break;
1932+
}
18951933
case TargetOpcode::G_TRUNC: {
18961934
Register Src = MI.getOperand(1).getReg();
18971935
LLT SrcTy = MRI.getType(Src);
Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
# 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
3+
4+
---
5+
name: Cst
6+
body: |
7+
bb.1:
8+
; CHECK-LABEL: name: @Cst
9+
; CHECK-NEXT: %0:_ KnownBits:11100000 SignBits:3
10+
; CHECK-NEXT: %1:_ KnownBits:00000010 SignBits:6
11+
; CHECK-NEXT: %2:_ KnownBits:10000000 SignBits:1
12+
%0:_(s8) = G_CONSTANT i8 224
13+
%1:_(s8) = G_CONSTANT i8 2
14+
%2:_(s8) = G_SHL %0, %1
15+
...
16+
---
17+
name: CstBig
18+
body: |
19+
bb.1:
20+
; CHECK-LABEL: name: @CstBig
21+
; CHECK-NEXT: %0:_ KnownBits:11111001 SignBits:5
22+
; CHECK-NEXT: %1:_ KnownBits:00000110 SignBits:5
23+
; CHECK-NEXT: %2:_ KnownBits:01000000 SignBits:1
24+
%0:_(s8) = G_CONSTANT i8 249
25+
%1:_(s8) = G_CONSTANT i8 6
26+
%2:_(s8) = G_SHL %0, %1
27+
...
28+
---
29+
name: CstSext
30+
body: |
31+
bb.1:
32+
; CHECK-LABEL: name: @CstSext
33+
; CHECK-NEXT: %0:_ KnownBits:10000001 SignBits:1
34+
; CHECK-NEXT: %1:_ KnownBits:00000100 SignBits:5
35+
; CHECK-NEXT: %2:_ KnownBits:11111000 SignBits:5
36+
; CHECK-NEXT: %3:_ KnownBits:00000011 SignBits:6
37+
; CHECK-NEXT: %4:_ KnownBits:11000000 SignBits:2
38+
%0:_(s8) = G_CONSTANT i8 129
39+
%1:_(s8) = G_CONSTANT i8 4
40+
%2:_(s8) = G_ASHR %0, %1
41+
%3:_(s8) = G_CONSTANT i8 3
42+
%4:_(s8) = G_SHL %2, %3
43+
...
44+
---
45+
name: CstSextBig
46+
body: |
47+
bb.1:
48+
; CHECK-LABEL: name: @CstSextBig
49+
; CHECK-NEXT: %0:_ KnownBits:10000001 SignBits:1
50+
; CHECK-NEXT: %1:_ KnownBits:00000100 SignBits:5
51+
; CHECK-NEXT: %2:_ KnownBits:11111000 SignBits:5
52+
; CHECK-NEXT: %3:_ KnownBits:00000110 SignBits:5
53+
; CHECK-NEXT: %4:_ KnownBits:00000000 SignBits:8
54+
%0:_(s8) = G_CONSTANT i8 129
55+
%1:_(s8) = G_CONSTANT i8 4
56+
%2:_(s8) = G_ASHR %0, %1
57+
%3:_(s8) = G_CONSTANT i8 6
58+
%4:_(s8) = G_SHL %2, %3
59+
...
60+
---
61+
name: ScalarVar
62+
body: |
63+
bb.1:
64+
; CHECK-LABEL: name: @ScalarVar
65+
; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
66+
; CHECK-NEXT: %1:_ KnownBits:???????? SignBits:1
67+
; CHECK-NEXT: %2:_ KnownBits:???????? SignBits:1
68+
%0:_(s8) = COPY $b0
69+
%1:_(s8) = COPY $b1
70+
%2:_(s8) = G_SHL %0, %1
71+
...
72+
---
73+
name: ScalarCst
74+
body: |
75+
bb.1:
76+
; CHECK-LABEL: name: @ScalarCst
77+
; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
78+
; CHECK-NEXT: %1:_ KnownBits:00000011 SignBits:6
79+
; CHECK-NEXT: %2:_ KnownBits:?????000 SignBits:1
80+
%0:_(s8) = COPY $b0
81+
%1:_(s8) = G_CONSTANT i8 3
82+
%2:_(s8) = G_SHL %0, %1
83+
...
84+
---
85+
name: VectorVar
86+
body: |
87+
bb.1:
88+
; CHECK-LABEL: name: @VectorVar
89+
; CHECK-NEXT: %0:_ KnownBits:???????????????? SignBits:1
90+
; CHECK-NEXT: %1:_ KnownBits:???????????????? SignBits:1
91+
; CHECK-NEXT: %2:_ KnownBits:???????????????? SignBits:1
92+
%0:_(<4 x s16>) = COPY $d0
93+
%1:_(<4 x s16>) = COPY $d1
94+
%2:_(<4 x s16>) = G_SHL %0, %1
95+
...
96+
---
97+
name: VectorCst
98+
body: |
99+
bb.1:
100+
; CHECK-LABEL: name: @VectorCst
101+
; CHECK-NEXT: %0:_ KnownBits:???????????????? SignBits:1
102+
; CHECK-NEXT: %1:_ KnownBits:0000000000000011 SignBits:14
103+
; CHECK-NEXT: %2:_ KnownBits:0000000000000011 SignBits:14
104+
; CHECK-NEXT: %3:_ KnownBits:?????????????000 SignBits:1
105+
%0:_(<4 x s16>) = COPY $d0
106+
%1:_(s16) = G_CONSTANT i16 3
107+
%2:_(<4 x s16>) = G_BUILD_VECTOR %1, %1, %1, %1
108+
%3:_(<4 x s16>) = G_SHL %0, %2
109+
...
110+
---
111+
name: VectorCst36
112+
body: |
113+
bb.1:
114+
; CHECK-LABEL: name: @VectorCst36
115+
; CHECK-NEXT: %0:_ KnownBits:0000000000000011 SignBits:14
116+
; CHECK-NEXT: %1:_ KnownBits:0000000000000110 SignBits:13
117+
; CHECK-NEXT: %2:_ KnownBits:0000000000000?1? SignBits:13
118+
; CHECK-NEXT: %3:_ KnownBits:0000000000000?1? SignBits:13
119+
; CHECK-NEXT: %4:_ KnownBits:000000????????00 SignBits:7
120+
%0:_(s16) = G_CONSTANT i16 3
121+
%1:_(s16) = G_CONSTANT i16 6
122+
%2:_(<4 x s16>) = G_BUILD_VECTOR %0, %1, %1, %0
123+
%3:_(<4 x s16>) = G_BUILD_VECTOR %0, %1, %1, %0
124+
%4:_(<4 x s16>) = G_SHL %2, %3
125+
...
126+
127+
---
128+
name: VectorCst3unknown
129+
body: |
130+
bb.1:
131+
; CHECK-LABEL: name: @VectorCst3unknown
132+
; CHECK-NEXT: %0:_ KnownBits:???????????????? SignBits:1
133+
; CHECK-NEXT: %1:_ KnownBits:???????????????? SignBits:1
134+
; CHECK-NEXT: %2:_ KnownBits:0000000000000011 SignBits:14
135+
; CHECK-NEXT: %3:_ KnownBits:???????????????? SignBits:1
136+
; CHECK-NEXT: %4:_ KnownBits:???????????????? SignBits:1
137+
%0:_(<4 x s16>) = COPY $d0
138+
%2:_(s16) = COPY $h0
139+
%1:_(s16) = G_CONSTANT i16 3
140+
%3:_(<4 x s16>) = G_BUILD_VECTOR %1, %2, %2, %1
141+
%4:_(<4 x s16>) = G_SHL %0, %3
142+
...
143+
---
144+
name: VectorSext
145+
body: |
146+
bb.1:
147+
; CHECK-LABEL: name: @VectorSext
148+
; CHECK-NEXT: %0:_ KnownBits:11101110 SignBits:3
149+
; CHECK-NEXT: %1:_ KnownBits:1111111111101110 SignBits:11
150+
; CHECK-NEXT: %2:_ KnownBits:1111111111101110 SignBits:11
151+
; CHECK-NEXT: %3:_ KnownBits:0000000000000011 SignBits:14
152+
; CHECK-NEXT: %4:_ KnownBits:0000000000000110 SignBits:13
153+
; CHECK-NEXT: %5:_ KnownBits:0000000000000?1? SignBits:13
154+
; CHECK-NEXT: %6:_ KnownBits:1111??11?????000 SignBits:5
155+
%0:_(s8) = G_CONSTANT i8 238
156+
%1:_(s16) = G_SEXT %0(s8)
157+
%2:_(<4 x s16>) = G_BUILD_VECTOR %1, %1, %1, %1
158+
%3:_(s16) = G_CONSTANT i16 3
159+
%4:_(s16) = G_CONSTANT i16 6
160+
%5:_(<4 x s16>) = G_BUILD_VECTOR %3, %4, %4, %3
161+
%6:_(<4 x s16>) = G_SHL %2, %5
162+
...
163+
---
164+
name: VectorSextBig
165+
body: |
166+
bb.1:
167+
; CHECK-LABEL: name: @VectorSextBig
168+
; CHECK-NEXT: %0:_ KnownBits:11101110 SignBits:3
169+
; CHECK-NEXT: %1:_ KnownBits:1111111111101110 SignBits:11
170+
; CHECK-NEXT: %2:_ KnownBits:1111111111101110 SignBits:11
171+
; CHECK-NEXT: %3:_ KnownBits:0000000000001000 SignBits:12
172+
; CHECK-NEXT: %4:_ KnownBits:0000000000001001 SignBits:12
173+
; CHECK-NEXT: %5:_ KnownBits:000000000000100? SignBits:12
174+
; CHECK-NEXT: %6:_ KnownBits:11??11?000000000 SignBits:2
175+
%0:_(s8) = G_CONSTANT i8 238
176+
%1:_(s16) = G_SEXT %0(s8)
177+
%2:_(<4 x s16>) = G_BUILD_VECTOR %1, %1, %1, %1
178+
%3:_(s16) = G_CONSTANT i16 8
179+
%4:_(s16) = G_CONSTANT i16 9
180+
%5:_(<4 x s16>) = G_BUILD_VECTOR %3, %4, %4, %3
181+
%6:_(<4 x s16>) = G_SHL %2, %5
182+
...
183+
---
184+
name: SHLless
185+
body: |
186+
bb.1:
187+
; CHECK-LABEL: name: @SHLless
188+
; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
189+
; CHECK-NEXT: %1:_ KnownBits:???????????????? SignBits:9
190+
; CHECK-NEXT: %2:_ KnownBits:0000000000000011 SignBits:14
191+
; CHECK-NEXT: %3:_ KnownBits:?????????????000 SignBits:6
192+
%0:_(s8) = COPY $b0
193+
%1:_(s16) = G_SEXT %0(s8)
194+
%2:_(s16) = G_CONSTANT i16 3
195+
%3:_(s16) = G_SHL %1, %2
196+
...
197+
---
198+
name: SHLeq
199+
body: |
200+
bb.1:
201+
; CHECK-LABEL: name: @SHLeq
202+
; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
203+
; CHECK-NEXT: %1:_ KnownBits:???????????????? SignBits:9
204+
; CHECK-NEXT: %2:_ KnownBits:0000000000001000 SignBits:12
205+
; CHECK-NEXT: %3:_ KnownBits:????????00000000 SignBits:1
206+
%0:_(s8) = COPY $b0
207+
%1:_(s16) = G_SEXT %0(s8)
208+
%2:_(s16) = G_CONSTANT i16 8
209+
%3:_(s16) = G_SHL %1, %2
210+
...
211+
---
212+
name: SHLmore
213+
body: |
214+
bb.1:
215+
; CHECK-LABEL: name: @SHLmore
216+
; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
217+
; CHECK-NEXT: %1:_ KnownBits:???????????????? SignBits:9
218+
; CHECK-NEXT: %2:_ KnownBits:0000000000001101 SignBits:12
219+
; CHECK-NEXT: %3:_ KnownBits:???0000000000000 SignBits:1
220+
%0:_(s8) = COPY $b0
221+
%1:_(s16) = G_SEXT %0(s8)
222+
%2:_(s16) = G_CONSTANT i16 13
223+
%3:_(s16) = G_SHL %1, %2
224+
...
225+
---
226+
name: SignBitsThroughZext
227+
body: |
228+
bb.1:
229+
; CHECK-LABEL: name: @SignBitsThroughZext
230+
; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1
231+
; CHECK-NEXT: %1:_ KnownBits:0000000000000011 SignBits:14
232+
; CHECK-NEXT: %2:_ KnownBits:???????? SignBits:4
233+
; CHECK-NEXT: %3:_ KnownBits:00000000???????? SignBits:8
234+
; CHECK-NEXT: %4:_ KnownBits:0000000000001000 SignBits:12
235+
; CHECK-NEXT: %5:_ KnownBits:????????00000000 SignBits:4
236+
%0:_(s8) = COPY $b0
237+
%1:_(s16) = G_CONSTANT i16 3
238+
%2:_(s8) = G_ASHR %0, %1
239+
%3:_(s16) = G_ZEXT %2
240+
%4:_(s16) = G_CONSTANT i16 8
241+
%5:_(s16) = G_SHL %3, %4
242+
...

0 commit comments

Comments
 (0)