Skip to content

Commit 5ff993a

Browse files
[SPIR-V] Fix legalize info for G_BITREVERSE (#93699)
This PR fixes legalize info for G_BITREVERSE.
1 parent 955c223 commit 5ff993a

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

llvm/lib/Target/SPIRV/SPIRVLegalizerInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
182182

183183
getActionDefinitionsBuilder({G_LOAD, G_STORE}).legalIf(typeInSet(1, allPtrs));
184184

185-
getActionDefinitionsBuilder(G_BITREVERSE).legalFor(allFloatScalarsAndVectors);
185+
getActionDefinitionsBuilder(G_BITREVERSE).legalFor(allIntScalarsAndVectors);
186186

187187
getActionDefinitionsBuilder(G_FMA).legalFor(allFloatScalarsAndVectors);
188188

llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,11 @@ generateAssignInstrs(MachineFunction &MF, SPIRVGlobalRegistry *GR,
472472
insertAssignInstr(Reg, Ty, nullptr, GR, MIB, MRI);
473473
} else if (MIOp == TargetOpcode::G_GLOBAL_VALUE) {
474474
propagateSPIRVType(&MI, GR, MRI, MIB);
475+
} else if (MIOp == TargetOpcode::G_BITREVERSE) {
476+
Register Reg = MI.getOperand(0).getReg();
477+
LLT RegType = MRI.getType(Reg);
478+
if (RegType.getSizeInBits() < 32)
479+
MRI.setType(Reg, LLT::scalar(32));
475480
}
476481

477482
if (MII == Begin)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
; The goal of the test case is to ensure that there's no crash
2+
; on translation of integers with bit width less than 8.
3+
4+
; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s --spirv-ext=+SPV_KHR_bit_instructions -o - | FileCheck %s --check-prefix=CHECK-SPIRV
5+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s --spirv-ext=+SPV_KHR_bit_instructions -o - -filetype=obj | spirv-val %}
6+
7+
; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s --spirv-ext=+SPV_KHR_bit_instructions -o - | FileCheck %s --check-prefix=CHECK-SPIRV
8+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s --spirv-ext=+SPV_KHR_bit_instructions -o - -filetype=obj | spirv-val %}
9+
10+
; CHECK-SPIRV: OpCapability BitInstructions
11+
; CHECK-SPIRV: OpExtension "SPV_KHR_bit_instructions"
12+
; CHECK-SPIRV: %[[#CharTy:]] = OpTypeInt 8 0
13+
; CHECK-SPIRV: %[[#]] = OpBitReverse %[[#CharTy]] %[[#]]
14+
15+
define spir_func signext i2 @foo(i2 noundef signext %a) {
16+
entry:
17+
%b = tail call i2 @llvm.bitreverse.i2(i2 %a)
18+
ret i2 %b
19+
}
20+
21+
declare i2 @llvm.bitreverse.i2(i2)

0 commit comments

Comments
 (0)