| ; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s |
| ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} |
| ; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s |
| ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %} |
| |
| ; CHECK-DAG: %[[#Int:]] = OpTypeInt 32 0 |
| ; CHECK-DAG: %[[#Bool:]] = OpTypeBool |
| ; CHECK-DAG: %[[#PointerType:]] = OpTypePointer CrossWorkgroup %[[#Int]] |
| ; CHECK-DAG: %[[#MemSem_SequentiallyConsistent:]] = OpConstant %[[#Int]] 528 |
| ; CHECK-DAG: %[[#Value:]] = OpConstant %[[#Int]] 42 |
| ; CHECK-DAG: %[[#One:]] = OpConstant %[[#Int]] 1 |
| ; CHECK-DAG: %[[#Scope_CrossDevice:]] = OpConstantNull %[[#Int]] |
| ; CHECK-DAG: %[[#Pointer:]] = OpVariable %[[#PointerType]] CrossWorkgroup |
| |
| @ui = common dso_local addrspace(1) global i32 0, align 4 |
| |
| ; CHECK: %[[#Load:]] = OpLoad %[[#Int]] %[[#Pointer]] Aligned 4 |
| ; CHECK: OpBranch %[[#Loop:]] |
| ; CHECK: %[[#Loop]] = OpLabel |
| ; CHECK: %[[#Phi:]] = OpPhi %[[#Int]] %[[#Load]] %[[#Entry:]] %[[#PhiNext:]] %[[#Loop]] |
| ; CHECK: %[[#Add:]] = OpIAdd %[[#Int]] %[[#Phi]] %[[#One]] |
| ; CHECK: %[[#GE:]] = OpUGreaterThanEqual %[[#Bool]] %[[#Phi]] %[[#Value]] |
| ; CHECK: %[[#Select:]] = OpSelect %[[#Int]] %[[#GE]] %[[#Scope_CrossDevice]] %[[#Add]] |
| ; CHECK: %[[#CmpXChg:]] = OpAtomicCompareExchange %[[#Int]] %[[#Ptr:]] %[[#Scope_CrossDevice]] |
| ; CHECK-SAME: %[[#MemSem_SequentiallyConsistent]] %[[#MemSem_SequentiallyConsistent]] %[[#Select]] %[[#Phi]] |
| ; CHECK: %[[#Cond:]] = OpCompositeExtract %[[#Bool]] %[[#CmpXChgComposite:]] 1 |
| ; CHECK: %[[#PhiNext]] = OpCompositeExtract %[[#Int]] %[[#CmpXChgComposite]] 0 |
| ; CHECK: OpBranchConditional %[[#Cond]] %[[#Exit:]] %[[#Loop]] |
| ; CHECK: %[[#Exit]] = OpLabel |
| |
| define dso_local spir_func void @atomicrmw_uinc_wrap() local_unnamed_addr { |
| entry: |
| %0 = atomicrmw uinc_wrap ptr addrspace(1) @ui, i32 42 seq_cst |
| ret void |
| } |
| |
| ; CHECK: %[[#Load:]] = OpLoad %[[#Int]] %[[#Pointer]] Aligned 4 |
| ; CHECK: OpBranch %[[#Loop:]] |
| ; CHECK: %[[#Loop]] = OpLabel |
| ; CHECK: %[[#Phi:]] = OpPhi %[[#Int]] %[[#Load]] %[[#Entry:]] %[[#PhiNext:]] %[[#Loop]] |
| ; CHECK: %[[#Sub:]] = OpISub %[[#Int]] %[[#Phi]] %[[#One]] |
| ; CHECK: %[[#Equal:]] = OpIEqual %[[#Bool]] %[[#Phi]] %[[#Scope_CrossDevice]] |
| ; CHECK: %[[#GT:]] = OpUGreaterThan %[[#Bool]] %[[#Phi]] %[[#Value]] |
| ; CHECK: %[[#Or:]] = OpLogicalOr %[[#Bool]] %[[#Equal]] %[[#GT]] |
| ; CHECK: %[[#Select:]] = OpSelect %[[#Int]] %[[#Or]] %[[#Value]] %[[#Sub]] |
| ; CHECK: %[[#CmpXChg:]] = OpAtomicCompareExchange %[[#Int]] %[[#Ptr:]] %[[#Scope_CrossDevice]] |
| ; CHECK-SAME: %[[#MemSem_SequentiallyConsistent]] %[[#MemSem_SequentiallyConsistent]] %[[#Select]] %[[#Phi]] |
| ; CHECK: %[[#Cond:]] = OpCompositeExtract %[[#Bool]] %[[#CmpXChgComposite:]] 1 |
| ; CHECK: %[[#PhiNext]] = OpCompositeExtract %[[#Int]] %[[#CmpXChgComposite]] 0 |
| ; CHECK: OpBranchConditional %[[#Cond]] %[[#Exit:]] %[[#Loop]] |
| ; CHECK: %[[#Exit]] = OpLabel |
| |
| define dso_local spir_func void @atomicrmw_udec_wrap() local_unnamed_addr { |
| entry: |
| %0 = atomicrmw udec_wrap ptr addrspace(1) @ui, i32 42 seq_cst |
| ret void |
| } |