// RUN: mlir-opt -split-input-file -verify-diagnostics %s | FileCheck %s //===----------------------------------------------------------------------===// // spirv.AtomicAnd //===----------------------------------------------------------------------===// func.func @atomic_and(%ptr : !spirv.ptr, %value : i32) -> i32 { // CHECK: spirv.AtomicAnd %{{.*}}, %{{.*}} : !spirv.ptr %0 = spirv.AtomicAnd %ptr, %value : !spirv.ptr return %0 : i32 } // ----- func.func @atomic_and(%ptr : !spirv.ptr, %value : i32) -> i32 { // expected-error @+1 {{'spirv.AtomicAnd' op failed to verify that `value` type matches pointee type of `pointer`}} %0 = "spirv.AtomicAnd"(%ptr, %value) {memory_scope = #spirv.scope, semantics = #spirv.memory_semantics} : (!spirv.ptr, i32) -> (i32) return %0 : i32 } // ----- func.func @atomic_and(%ptr : !spirv.ptr, %value : i64) -> i64 { // expected-error @+1 {{'spirv.AtomicAnd' op failed to verify that `value` type matches pointee type of `pointer`}} %0 = "spirv.AtomicAnd"(%ptr, %value) {memory_scope = #spirv.scope, semantics = #spirv.memory_semantics} : (!spirv.ptr, i64) -> (i64) return %0 : i64 } // ----- func.func @atomic_and(%ptr : !spirv.ptr, %value : i32) -> i32 { // expected-error @+1 {{expected at most one of these four memory constraints to be set: `Acquire`, `Release`,`AcquireRelease` or `SequentiallyConsistent`}} %0 = spirv.AtomicAnd %ptr, %value : !spirv.ptr return %0 : i32 } // ----- //===----------------------------------------------------------------------===// // spirv.AtomicCompareExchange //===----------------------------------------------------------------------===// func.func @atomic_compare_exchange(%ptr: !spirv.ptr, %value: i32, %comparator: i32) -> i32 { // CHECK: spirv.AtomicCompareExchange %{{.*}}, %{{.*}}, %{{.*}} : !spirv.ptr %0 = spirv.AtomicCompareExchange %ptr, %value, %comparator: !spirv.ptr return %0: i32 } // ----- func.func @atomic_compare_exchange(%ptr: !spirv.ptr, %value: i64, %comparator: i32) -> i32 { // expected-error @+1 {{'spirv.AtomicCompareExchange' op failed to verify that `value` type matches pointee type of `pointer`}} %0 = "spirv.AtomicCompareExchange"(%ptr, %value, %comparator) {memory_scope = #spirv.scope, equal_semantics = #spirv.memory_semantics, unequal_semantics = #spirv.memory_semantics} : (!spirv.ptr, i64, i32) -> (i32) return %0: i32 } // ----- func.func @atomic_compare_exchange(%ptr: !spirv.ptr, %value: i32, %comparator: i16) -> i32 { // expected-error @+1 {{'spirv.AtomicCompareExchange' op failed to verify that `comparator` type matches pointee type of `pointer`}} %0 = "spirv.AtomicCompareExchange"(%ptr, %value, %comparator) {memory_scope = #spirv.scope, equal_semantics = #spirv.memory_semantics, unequal_semantics = #spirv.memory_semantics} : (!spirv.ptr, i32, i16) -> (i32) return %0: i32 } // ----- func.func @atomic_compare_exchange(%ptr: !spirv.ptr, %value: i32, %comparator: i32) -> i32 { // expected-error @+1 {{spirv.AtomicCompareExchange' op failed to verify that `result` type matches pointee type of `pointer`}} %0 = "spirv.AtomicCompareExchange"(%ptr, %value, %comparator) {memory_scope = #spirv.scope, equal_semantics = #spirv.memory_semantics, unequal_semantics = #spirv.memory_semantics} : (!spirv.ptr, i32, i32) -> (i32) return %0: i32 } // ----- //===----------------------------------------------------------------------===// // spirv.AtomicCompareExchangeWeak //===----------------------------------------------------------------------===// func.func @atomic_compare_exchange_weak(%ptr: !spirv.ptr, %value: i32, %comparator: i32) -> i32 { // CHECK: spirv.AtomicCompareExchangeWeak %{{.*}}, %{{.*}}, %{{.*}} : !spirv.ptr %0 = spirv.AtomicCompareExchangeWeak %ptr, %value, %comparator: !spirv.ptr return %0: i32 } // ----- func.func @atomic_compare_exchange_weak(%ptr: !spirv.ptr, %value: i64, %comparator: i32) -> i32 { // expected-error @+1 {{'spirv.AtomicCompareExchangeWeak' op failed to verify that `value` type matches pointee type of `pointer`}} %0 = "spirv.AtomicCompareExchangeWeak"(%ptr, %value, %comparator) {memory_scope = #spirv.scope, equal_semantics = #spirv.memory_semantics, unequal_semantics = #spirv.memory_semantics} : (!spirv.ptr, i64, i32) -> (i32) return %0: i32 } // ----- func.func @atomic_compare_exchange_weak(%ptr: !spirv.ptr, %value: i32, %comparator: i16) -> i32 { // expected-error @+1 {{'spirv.AtomicCompareExchangeWeak' op failed to verify that `comparator` type matches pointee type of `pointer`}} %0 = "spirv.AtomicCompareExchangeWeak"(%ptr, %value, %comparator) {memory_scope = #spirv.scope, equal_semantics = #spirv.memory_semantics, unequal_semantics = #spirv.memory_semantics} : (!spirv.ptr, i32, i16) -> (i32) return %0: i32 } // ----- func.func @atomic_compare_exchange_weak(%ptr: !spirv.ptr, %value: i32, %comparator: i32) -> i32 { // expected-error @+1 {{'spirv.AtomicCompareExchangeWeak' op failed to verify that `result` type matches pointee type of `pointer`}} %0 = "spirv.AtomicCompareExchangeWeak"(%ptr, %value, %comparator) {memory_scope = #spirv.scope, equal_semantics = #spirv.memory_semantics, unequal_semantics = #spirv.memory_semantics} : (!spirv.ptr, i32, i32) -> (i32) return %0: i32 } // ----- //===----------------------------------------------------------------------===// // spirv.AtomicExchange //===----------------------------------------------------------------------===// func.func @atomic_exchange(%ptr: !spirv.ptr, %value: i32) -> i32 { // CHECK: spirv.AtomicExchange %{{.*}}, %{{.*}} : !spirv.ptr %0 = spirv.AtomicExchange %ptr, %value: !spirv.ptr return %0: i32 } // ----- func.func @atomic_exchange(%ptr: !spirv.ptr, %value: i64) -> i32 { // expected-error @+1 {{'spirv.AtomicExchange' op failed to verify that `value` type matches pointee type of `pointer`}} %0 = "spirv.AtomicExchange"(%ptr, %value) {memory_scope = #spirv.scope, semantics = #spirv.memory_semantics} : (!spirv.ptr, i64) -> (i32) return %0: i32 } // ----- func.func @atomic_exchange(%ptr: !spirv.ptr, %value: i32) -> i32 { // expected-error @+1 {{'spirv.AtomicExchange' op failed to verify that `value` type matches pointee type of `pointer`}} %0 = "spirv.AtomicExchange"(%ptr, %value) {memory_scope = #spirv.scope, semantics = #spirv.memory_semantics} : (!spirv.ptr, i32) -> (i32) return %0: i32 } // ----- //===----------------------------------------------------------------------===// // spirv.AtomicIAdd //===----------------------------------------------------------------------===// func.func @atomic_iadd(%ptr : !spirv.ptr, %value : i32) -> i32 { // CHECK: spirv.AtomicIAdd %{{.*}}, %{{.*}} : !spirv.ptr %0 = spirv.AtomicIAdd %ptr, %value : !spirv.ptr return %0 : i32 } //===----------------------------------------------------------------------===// // spirv.AtomicIDecrement //===----------------------------------------------------------------------===// func.func @atomic_idecrement(%ptr : !spirv.ptr) -> i32 { // CHECK: spirv.AtomicIDecrement %{{.*}} : !spirv.ptr %0 = spirv.AtomicIDecrement %ptr : !spirv.ptr return %0 : i32 } //===----------------------------------------------------------------------===// // spirv.AtomicIIncrement //===----------------------------------------------------------------------===// func.func @atomic_iincrement(%ptr : !spirv.ptr) -> i32 { // CHECK: spirv.AtomicIIncrement %{{.*}} : !spirv.ptr %0 = spirv.AtomicIIncrement %ptr : !spirv.ptr return %0 : i32 } //===----------------------------------------------------------------------===// // spirv.AtomicISub //===----------------------------------------------------------------------===// func.func @atomic_isub(%ptr : !spirv.ptr, %value : i32) -> i32 { // CHECK: spirv.AtomicISub %{{.*}}, %{{.*}} : !spirv.ptr %0 = spirv.AtomicISub %ptr, %value : !spirv.ptr return %0 : i32 } //===----------------------------------------------------------------------===// // spirv.AtomicOr //===----------------------------------------------------------------------===// func.func @atomic_or(%ptr : !spirv.ptr, %value : i32) -> i32 { // CHECK: spirv.AtomicOr %{{.*}}, %{{.*}} : !spirv.ptr %0 = spirv.AtomicOr %ptr, %value : !spirv.ptr return %0 : i32 } //===----------------------------------------------------------------------===// // spirv.AtomicSMax //===----------------------------------------------------------------------===// func.func @atomic_smax(%ptr : !spirv.ptr, %value : i32) -> i32 { // CHECK: spirv.AtomicSMax %{{.*}}, %{{.*}} : !spirv.ptr %0 = spirv.AtomicSMax %ptr, %value : !spirv.ptr return %0 : i32 } //===----------------------------------------------------------------------===// // spirv.AtomicSMin //===----------------------------------------------------------------------===// func.func @atomic_smin(%ptr : !spirv.ptr, %value : i32) -> i32 { // CHECK: spirv.AtomicSMin %{{.*}}, %{{.*}} : !spirv.ptr %0 = spirv.AtomicSMin %ptr, %value : !spirv.ptr return %0 : i32 } //===----------------------------------------------------------------------===// // spirv.AtomicUMax //===----------------------------------------------------------------------===// func.func @atomic_umax(%ptr : !spirv.ptr, %value : i32) -> i32 { // CHECK: spirv.AtomicUMax %{{.*}}, %{{.*}} : !spirv.ptr %0 = spirv.AtomicUMax %ptr, %value : !spirv.ptr return %0 : i32 } //===----------------------------------------------------------------------===// // spirv.AtomicUMin //===----------------------------------------------------------------------===// func.func @atomic_umin(%ptr : !spirv.ptr, %value : i32) -> i32 { // CHECK: spirv.AtomicUMin %{{.*}}, %{{.*}} : !spirv.ptr %0 = spirv.AtomicUMin %ptr, %value : !spirv.ptr return %0 : i32 } //===----------------------------------------------------------------------===// // spirv.AtomicXor //===----------------------------------------------------------------------===// func.func @atomic_xor(%ptr : !spirv.ptr, %value : i32) -> i32 { // CHECK: spirv.AtomicXor %{{.*}}, %{{.*}} : !spirv.ptr %0 = spirv.AtomicXor %ptr, %value : !spirv.ptr return %0 : i32 } // ----- //===----------------------------------------------------------------------===// // spirv.EXT.AtomicFAdd //===----------------------------------------------------------------------===// func.func @atomic_fadd(%ptr : !spirv.ptr, %value : f32) -> f32 { // CHECK: spirv.EXT.AtomicFAdd %{{.*}}, %{{.*}} : !spirv.ptr %0 = spirv.EXT.AtomicFAdd %ptr, %value : !spirv.ptr return %0 : f32 } // ----- func.func @atomic_fadd(%ptr : !spirv.ptr, %value : f32) -> f32 { // expected-error @+1 {{'spirv.EXT.AtomicFAdd' op failed to verify that `result` type matches pointee type of `pointer`}} %0 = "spirv.EXT.AtomicFAdd"(%ptr, %value) {memory_scope = #spirv.scope, semantics = #spirv.memory_semantics} : (!spirv.ptr, f32) -> (f32) return %0 : f32 } // ----- func.func @atomic_fadd(%ptr : !spirv.ptr, %value : f64) -> f64 { // expected-error @+1 {{'spirv.EXT.AtomicFAdd' op failed to verify that `result` type matches pointee type of `pointer`}} %0 = "spirv.EXT.AtomicFAdd"(%ptr, %value) {memory_scope = #spirv.scope, semantics = #spirv.memory_semantics} : (!spirv.ptr, f64) -> (f64) return %0 : f64 } // ----- func.func @atomic_fadd(%ptr : !spirv.ptr, %value : f32) -> f32 { // expected-error @+1 {{expected at most one of these four memory constraints to be set: `Acquire`, `Release`,`AcquireRelease` or `SequentiallyConsistent`}} %0 = spirv.EXT.AtomicFAdd %ptr, %value : !spirv.ptr return %0 : f32 }