Skip to content

Commit 980f2b6

Browse files
LLVM IR add/sub instructions result in logical SPIR-V instructions when applied to bool type
1 parent 07530bd commit 980f2b6

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

llvm/lib/Target/SPIRV/SPIRVISelLowering.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,17 @@ void SPIRVTargetLowering::finalizeLowering(MachineFunction &MF) const {
414414
validateForwardCalls(STI, MRI, GR, MI);
415415
break;
416416

417+
// ensure that LLVM IR add/sub instructions result in logical SPIR-V
418+
// instructions when applied to bool type
419+
case SPIRV::OpIAddS:
420+
case SPIRV::OpIAddV:
421+
case SPIRV::OpISubS:
422+
case SPIRV::OpISubV:
423+
if (GR.isScalarOrVectorOfType(MI.getOperand(1).getReg(),
424+
SPIRV::OpTypeBool))
425+
MI.setDesc(STI.getInstrInfo()->get(SPIRV::OpLogicalNotEqual));
426+
break;
427+
417428
// ensure that LLVM IR bitwise instructions result in logical SPIR-V
418429
// instructions when applied to bool type
419430
case SPIRV::OpBitwiseOrS:

llvm/test/CodeGen/SPIRV/instructions/scalar-integer-arithmetic.ll

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
2+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
3+
14
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
5+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
26

7+
; CHECK-DAG: OpName [[BOOL_ADD:%.+]] "bool_add"
8+
; CHECK-DAG: OpName [[BOOL_SUB:%.+]] "bool_sub"
39
; CHECK-DAG: OpName [[SCALAR_ADD:%.+]] "scalar_add"
410
; CHECK-DAG: OpName [[SCALAR_SUB:%.+]] "scalar_sub"
511
; CHECK-DAG: OpName [[SCALAR_MUL:%.+]] "scalar_mul"
@@ -10,13 +16,28 @@
1016

1117
; CHECK-NOT: DAG-FENCE
1218

19+
; CHECK-DAG: [[BOOL:%.+]] = OpTypeBool
1320
; CHECK-DAG: [[SCALAR:%.+]] = OpTypeInt 32
1421
; CHECK-DAG: [[SCALAR_FN:%.+]] = OpTypeFunction [[SCALAR]] [[SCALAR]] [[SCALAR]]
22+
; CHECK-DAG: [[BOOL_FN:%.+]] = OpTypeFunction [[BOOL]] [[BOOL]] [[BOOL]]
1523

1624
; CHECK-NOT: DAG-FENCE
1725

1826

1927
;; Test add on scalar:
28+
define i1 @bool_add(i1 %a, i1 %b) {
29+
%c = add i1 %a, %b
30+
ret i1 %c
31+
}
32+
33+
; CHECK: [[BOOL_ADD]] = OpFunction [[BOOL]] None [[BOOL_FN]]
34+
; CHECK-NEXT: [[A:%.+]] = OpFunctionParameter [[BOOL]]
35+
; CHECK-NEXT: [[B:%.+]] = OpFunctionParameter [[BOOL]]
36+
; CHECK: OpLabel
37+
; CHECK: [[C:%.+]] = OpLogicalNotEqual [[BOOL]] [[A]] [[B]]
38+
; CHECK: OpReturnValue [[C]]
39+
; CHECK-NEXT: OpFunctionEnd
40+
2041
define i32 @scalar_add(i32 %a, i32 %b) {
2142
%c = add i32 %a, %b
2243
ret i32 %c
@@ -32,6 +53,19 @@ define i32 @scalar_add(i32 %a, i32 %b) {
3253

3354

3455
;; Test sub on scalar:
56+
define i1 @bool_sub(i1 %a, i1 %b) {
57+
%c = sub i1 %a, %b
58+
ret i1 %c
59+
}
60+
61+
; CHECK: [[BOOL_SUB]] = OpFunction [[BOOL]] None [[BOOL_FN]]
62+
; CHECK-NEXT: [[A:%.+]] = OpFunctionParameter [[BOOL]]
63+
; CHECK-NEXT: [[B:%.+]] = OpFunctionParameter [[BOOL]]
64+
; CHECK: OpLabel
65+
; CHECK: [[C:%.+]] = OpLogicalNotEqual [[BOOL]] [[A]] [[B]]
66+
; CHECK: OpReturnValue [[C]]
67+
; CHECK-NEXT: OpFunctionEnd
68+
3569
define i32 @scalar_sub(i32 %a, i32 %b) {
3670
%c = sub i32 %a, %b
3771
ret i32 %c

0 commit comments

Comments
 (0)