Skip to content

Commit 7a7b474

Browse files
committed
Address comment and add more tests
1 parent 2fae5d5 commit 7a7b474

File tree

2 files changed

+124
-7
lines changed

2 files changed

+124
-7
lines changed

llvm/lib/Target/AMDGPU/SIISelLowering.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16509,19 +16509,22 @@ static void knownBitsForSBFE(const MachineInstr &MI, GISelValueTracking &VT,
1650916509
const MachineOperand &Src1 = MI.getOperand(2);
1651016510

1651116511
unsigned Src1Cst = 0;
16512-
if (Src1.isImm())
16512+
if (Src1.isImm()) {
1651316513
Src1Cst = Src1.getImm();
16514-
else if (Src1.isReg()) {
16514+
} else if (Src1.isReg()) {
1651516515
auto Cst = getIConstantVRegValWithLookThrough(Src1.getReg(), MRI);
1651616516
if (!Cst)
1651716517
return;
1651816518
Src1Cst = Cst->Value.getZExtValue();
16519-
} else
16519+
} else {
1652016520
return;
16521+
}
1652116522

16522-
const unsigned Mask = maskTrailingOnes<unsigned>(6);
16523-
const unsigned Offset = Src1Cst & Mask;
16524-
const unsigned Width = (Src1Cst >> 16) & Mask;
16523+
// Offset is at bits [4:0] for 32 bit, [5:0] for 64 bit.
16524+
// Width is always [22:16].
16525+
const unsigned Offset =
16526+
Src1Cst & maskTrailingOnes<unsigned>((BFEWidth == 32) ? 5 : 6);
16527+
const unsigned Width = (Src1Cst >> 16) & maskTrailingOnes<unsigned>(6);
1652516528

1652616529
VT.computeKnownBitsImpl(MI.getOperand(1).getReg(), Known, DemandedElts);
1652716530

llvm/test/CodeGen/AMDGPU/GlobalISel/known-bits-sbfe.mir

Lines changed: 115 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=amdgcn-mesa-mesa3d -mcpu=gfx900 -passes="print<gisel-value-tracking>" %s -o /dev/null 2>&1 | FileCheck %s
2+
# RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 -passes='print<gisel-value-tracking>' %s -filetype=null 2>&1 | FileCheck %s
33

44
---
55
name: test_s_bfe_u32_constants
@@ -137,3 +137,117 @@ body: |
137137
%bfe:sgpr_64(s64) = S_BFE_I64 %merged, 524296, implicit-def $scc
138138
$sgpr0_sgpr1 = COPY %bfe
139139
...
140+
---
141+
name: test_s_bfe_i32_g_constants
142+
body: |
143+
bb.0:
144+
; Extract [12:16)
145+
; CHECK-LABEL: name: @test_s_bfe_i32_g_constants
146+
; CHECK-NEXT: %src0:sgpr_32 KnownBits:00000000000000001111111111111111 SignBits:16
147+
; CHECK-NEXT: %src1:sgpr_32 KnownBits:00000000000001000000000000001100 SignBits:13
148+
; CHECK-NEXT: %bfe:sgpr_32 KnownBits:11111111111111111111111111111111 SignBits:32
149+
%src0:sgpr_32(s32) = G_CONSTANT i32 65535
150+
%src1:sgpr_32(s32) = G_CONSTANT i32 262156
151+
%bfe:sgpr_32(s32) = S_BFE_I32 %src0, %src1, implicit-def $scc
152+
$sgpr0 = COPY %bfe
153+
...
154+
---
155+
name: test_s_bfe_u64_g_constants
156+
body: |
157+
bb.0:
158+
; Extract [12:16)
159+
; CHECK-LABEL: name: @test_s_bfe_u64_g_constants
160+
; CHECK-NEXT: %src0:sgpr_64 KnownBits:0000000000000000000000000000000000000000000000001111111111111111 SignBits:48
161+
; CHECK-NEXT: %src1:sgpr_32 KnownBits:00000000000001000000000000001100 SignBits:13
162+
; CHECK-NEXT: %bfe:sgpr_64 KnownBits:0000000000000000000000000000000000000000000000000000000000001111 SignBits:60
163+
%src0:sgpr_64(s64) = G_CONSTANT i64 65535
164+
%src1:sgpr_32(s32) = G_CONSTANT i32 262156
165+
%bfe:sgpr_64(s64) = S_BFE_U64 %src0, %src1, implicit-def $scc
166+
$sgpr0_sgpr1 = COPY %bfe
167+
...
168+
---
169+
name: test_s_bfe_i32_g_constants_lookthrough
170+
body: |
171+
bb.0:
172+
; Extract [12:16)
173+
; CHECK-LABEL: name: @test_s_bfe_i32_g_constants_lookthrough
174+
; CHECK-NEXT: %src0:sgpr_32 KnownBits:00000000000000001111111111111111 SignBits:16
175+
; CHECK-NEXT: %src1:sgpr_32 KnownBits:000001000000000000001100 SignBits:5
176+
; CHECK-NEXT: %src1_ext:sgpr_32 KnownBits:00000000000001000000000000001100 SignBits:13
177+
; CHECK-NEXT: %bfe:sgpr_32 KnownBits:11111111111111111111111111111111 SignBits:32
178+
%src0:sgpr_32(s32) = G_CONSTANT i32 65535
179+
%src1:sgpr_32(s24) = G_CONSTANT i24 262156
180+
%src1_ext:sgpr_32(s32) = G_ZEXT %src1
181+
%bfe:sgpr_32(s32) = S_BFE_I32 %src0, %src1_ext, implicit-def $scc
182+
$sgpr0 = COPY %bfe
183+
...
184+
---
185+
name: test_s_bfe_u64_g_constants_lookthrough
186+
body: |
187+
bb.0:
188+
; Extract [12:16)
189+
; CHECK-LABEL: name: @test_s_bfe_u64_g_constants_lookthrough
190+
; CHECK-NEXT: %src0:sgpr_64 KnownBits:0000000000000000000000000000000000000000000000001111111111111111 SignBits:48
191+
; CHECK-NEXT: %src1:sgpr_32 KnownBits:000001000000000000001100 SignBits:5
192+
; CHECK-NEXT: %src1_ext:sgpr_32 KnownBits:00000000000001000000000000001100 SignBits:13
193+
; CHECK-NEXT: %bfe:sgpr_64 KnownBits:0000000000000000000000000000000000000000000000000000000000001111 SignBits:60
194+
%src0:sgpr_64(s64) = G_CONSTANT i64 65535
195+
%src1:sgpr_32(s24) = G_CONSTANT i24 262156
196+
%src1_ext:sgpr_32(s32) = G_ZEXT %src1
197+
%bfe:sgpr_64(s64) = S_BFE_U64 %src0, %src1, implicit-def $scc
198+
$sgpr0_sgpr1 = COPY %bfe
199+
...
200+
---
201+
name: test_s_bfe_u32_trash_bits
202+
body: |
203+
bb.0:
204+
; Extract [12:16)
205+
; Check that the 6th bit is ignored for u32. The lower 6 bits are
206+
; 101100 but we should mask out the first 1 for the 32 bit version.
207+
; CHECK-LABEL: name: @test_s_bfe_u32_trash_bits
208+
; CHECK-NEXT: %cst:sgpr_32 KnownBits:00000000000000001111111111111111 SignBits:16
209+
; CHECK-NEXT: %bfe:sgpr_32 KnownBits:00000000000000000000000000001111 SignBits:28
210+
%cst:sgpr_32(s32) = G_CONSTANT i32 65535
211+
%bfe:sgpr_32(s32) = S_BFE_U32 %cst, 262252, implicit-def $scc
212+
$sgpr0 = COPY %bfe
213+
...
214+
---
215+
name: test_s_bfe_i32_trash_bits
216+
body: |
217+
bb.0:
218+
; Extract [12:16)
219+
; Check that the 6th bit is ignored for i32. The lower 6 bits are
220+
; 101100 but we should mask out the first 1 for the 32 bit version.
221+
; CHECK-LABEL: name: @test_s_bfe_i32_trash_bits
222+
; CHECK-NEXT: %cst:sgpr_32 KnownBits:00000000000000001111111111111111 SignBits:16
223+
; CHECK-NEXT: %bfe:sgpr_32 KnownBits:11111111111111111111111111111111 SignBits:32
224+
%cst:sgpr_32(s32) = G_CONSTANT i32 65535
225+
%bfe:sgpr_32(s32) = S_BFE_I32 %cst, 262252, implicit-def $scc
226+
$sgpr0 = COPY %bfe
227+
...
228+
---
229+
name: test_s_bfe_u64_constants_sixth_bit
230+
body: |
231+
bb.0:
232+
; Extract [32:48)
233+
; Check we correctly read 6 bits for the width on 64 bit BFEs.
234+
; CHECK-LABEL: name: @test_s_bfe_u64_constants_sixth_bit
235+
; CHECK-NEXT: %cst:sgpr_64 KnownBits:0000000000000000111111111111111100000000000000000000000000000000 SignBits:16
236+
; CHECK-NEXT: %bfe:sgpr_64 KnownBits:0000000000000000000000000000000000000000000000001111111111111111 SignBits:48
237+
%cst:sgpr_64(s64) = G_CONSTANT i64 281470681743360
238+
%bfe:sgpr_64(s64) = S_BFE_U64 %cst, 1048608, implicit-def $scc
239+
$sgpr0_sgpr1 = COPY %bfe
240+
...
241+
---
242+
name: test_s_bfe_i64_constants_sixth_bit
243+
body: |
244+
bb.0:
245+
; Extract [32:48)
246+
; Check we correctly read 6 bits for the width on 64 bit BFEs.
247+
; CHECK-LABEL: name: @test_s_bfe_i64_constants_sixth_bit
248+
; CHECK-NEXT: %cst:sgpr_64 KnownBits:0000000000000000111111111111111100000000000000000000000000000000 SignBits:16
249+
; CHECK-NEXT: %bfe:sgpr_64 KnownBits:1111111111111111111111111111111111111111111111111111111111111111 SignBits:64
250+
%cst:sgpr_64(s64) = G_CONSTANT i64 281470681743360
251+
%bfe:sgpr_64(s64) = S_BFE_I64 %cst, 1048608, implicit-def $scc
252+
$sgpr0_sgpr1 = COPY %bfe
253+
...

0 commit comments

Comments
 (0)