llvm-project/llvm/test/CodeGen/SPIRV/ComparePointers.ll
Alex Voicu 995b0f1883
[SPIRV] Handle inttoptr constant expressions in global initialisers (#166494)
`inttoptr` usage in global initialisers is valid, and rather common when it comes to the machinery around vtables (construction vtables are particularly fond). This was not handled by the BE, even though SPIR-V allows forming `SpecConstantOp`s with the `OpConvertUToPtr` opcode, which is what these would map to. We augment instruction selection to address this.
2025-11-07 01:59:36 +02:00

70 lines
2.6 KiB
LLVM

; RUN: llc -O0 -mtriple=spirv64v1.3-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64v1.3-unknown-unknown %s -o - -filetype=obj | spirv-val %}
;; kernel void test(int global *in, int global *in2) {
;; if (!in)
;; return;
;; if (in == 1)
;; return;
;; if (in > in2)
;; return;
;; if (in < in2)
;; return;
;; }
; CHECK-SPIRV: OpSpecConstantOp %[[#]] ConvertPtrToU
; CHECK-SPIRV: OpConvertPtrToU
; CHECK-SPIRV: OpINotEqual
; CHECK-SPIRV: OpConvertPtrToU
; CHECK-SPIRV: OpConvertPtrToU
; CHECK-SPIRV: OpIEqual
; CHECK-SPIRV: OpConvertPtrToU
; CHECK-SPIRV: OpConvertPtrToU
; CHECK-SPIRV: OpUGreaterThan
; CHECK-SPIRV: OpConvertPtrToU
; CHECK-SPIRV: OpConvertPtrToU
; CHECK-SPIRV: OpULessThan
define dso_local spir_kernel void @test(i32 addrspace(1)* noundef %in, i32 addrspace(1)* noundef %in2) {
entry:
%in.addr = alloca i32 addrspace(1)*, align 8
%in2.addr = alloca i32 addrspace(1)*, align 8
store i32 addrspace(1)* %in, i32 addrspace(1)** %in.addr, align 8
store i32 addrspace(1)* %in2, i32 addrspace(1)** %in2.addr, align 8
%0 = load i32 addrspace(1)*, i32 addrspace(1)** %in.addr, align 8
%tobool = icmp ne i32 addrspace(1)* %0, null
br i1 %tobool, label %if.end, label %if.then
if.then: ; preds = %entry
br label %if.end8
if.end: ; preds = %entry
%1 = load i32 addrspace(1)*, i32 addrspace(1)** %in.addr, align 8
%cmp = icmp eq i32 addrspace(1)* %1, inttoptr (i64 1 to i32 addrspace(1)*)
br i1 %cmp, label %if.then1, label %if.end2
if.then1: ; preds = %if.end
br label %if.end8
if.end2: ; preds = %if.end
%2 = load i32 addrspace(1)*, i32 addrspace(1)** %in.addr, align 8
%3 = load i32 addrspace(1)*, i32 addrspace(1)** %in2.addr, align 8
%cmp3 = icmp ugt i32 addrspace(1)* %2, %3
br i1 %cmp3, label %if.then4, label %if.end5
if.then4: ; preds = %if.end2
br label %if.end8
if.end5: ; preds = %if.end2
%4 = load i32 addrspace(1)*, i32 addrspace(1)** %in.addr, align 8
%5 = load i32 addrspace(1)*, i32 addrspace(1)** %in2.addr, align 8
%cmp6 = icmp ult i32 addrspace(1)* %4, %5
br i1 %cmp6, label %if.then7, label %if.end8
if.then7: ; preds = %if.end5
br label %if.end8
if.end8: ; preds = %if.then, %if.then1, %if.then4, %if.then7, %if.end5
ret void
}