brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · 9fd3d8e Raw
128 lines · plain
1; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s2; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}3 4; CHECK-DAG: OpName [[ADD:%.*]] "test_add"5; CHECK-DAG: OpName [[SUB:%.*]] "test_sub"6; CHECK-DAG: OpName [[MIN:%.*]] "test_min"7; CHECK-DAG: OpName [[MAX:%.*]] "test_max"8; CHECK-DAG: OpName [[UMIN:%.*]] "test_umin"9; CHECK-DAG: OpName [[UMAX:%.*]] "test_umax"10; CHECK-DAG: OpName [[AND:%.*]] "test_and"11; CHECK-DAG: OpName [[OR:%.*]] "test_or"12; CHECK-DAG: OpName [[XOR:%.*]] "test_xor"13 14; CHECK-DAG: [[I32Ty:%.*]] = OpTypeInt 32 015; CHECK-DAG: [[PtrI32Ty:%.*]] = OpTypePointer Function [[I32Ty]]16;; AllSvmDevices scope is encoded with constant 017; CHECK-DAG: [[SCOPE:%.*]] = OpConstantNull [[I32Ty]]18;; "sequentially consistent" maps to constant 1619; CHECK-DAG: [[SEQ:%.*]] = OpConstant [[I32Ty]] 1620 21; CHECK:      [[ADD]] = OpFunction [[I32Ty]]22; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[PtrI32Ty]]23; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[I32Ty]]24; CHECK-NEXT: OpLabel25; CHECK-NEXT: [[R:%.*]] = OpAtomicIAdd [[I32Ty]] [[A]] [[SCOPE]] [[SEQ]] [[B]]26; CHECK-NEXT: OpReturnValue [[R]]27; CHECK-NEXT: OpFunctionEnd28define i32 @test_add(i32* %ptr, i32 %val) {29  %r = atomicrmw add i32* %ptr, i32 %val seq_cst30  ret i32 %r31}32 33; CHECK:      [[SUB]] = OpFunction [[I32Ty]]34; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[PtrI32Ty]]35; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[I32Ty]]36; CHECK-NEXT: OpLabel37; CHECK-NEXT: [[R:%.*]] = OpAtomicISub [[I32Ty]] [[A]] [[SCOPE]] [[SEQ]] [[B]]38; CHECK-NEXT: OpReturnValue [[R]]39; CHECK-NEXT: OpFunctionEnd40define i32 @test_sub(i32* %ptr, i32 %val) {41  %r = atomicrmw sub i32* %ptr, i32 %val seq_cst42  ret i32 %r43}44 45; CHECK:      [[MIN]] = OpFunction [[I32Ty]]46; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[PtrI32Ty]]47; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[I32Ty]]48; CHECK-NEXT: OpLabel49; CHECK-NEXT: [[R:%.*]] = OpAtomicSMin [[I32Ty]] [[A]] [[SCOPE]] [[SEQ]] [[B]]50; CHECK-NEXT: OpReturnValue [[R]]51; CHECK-NEXT: OpFunctionEnd52define i32 @test_min(i32* %ptr, i32 %val) {53  %r = atomicrmw min i32* %ptr, i32 %val seq_cst54  ret i32 %r55}56 57; CHECK:      [[MAX]] = OpFunction [[I32Ty]]58; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[PtrI32Ty]]59; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[I32Ty]]60; CHECK-NEXT: OpLabel61; CHECK-NEXT: [[R:%.*]] = OpAtomicSMax [[I32Ty]] [[A]] [[SCOPE]] [[SEQ]] [[B]]62; CHECK-NEXT: OpReturnValue [[R]]63; CHECK-NEXT: OpFunctionEnd64define i32 @test_max(i32* %ptr, i32 %val) {65  %r = atomicrmw max i32* %ptr, i32 %val seq_cst66  ret i32 %r67}68 69; CHECK:      [[UMIN]] = OpFunction [[I32Ty]]70; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[PtrI32Ty]]71; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[I32Ty]]72; CHECK-NEXT: OpLabel73; CHECK-NEXT: [[R:%.*]] = OpAtomicUMin [[I32Ty]] [[A]] [[SCOPE]] [[SEQ]] [[B]]74; CHECK-NEXT: OpReturnValue [[R]]75; CHECK-NEXT: OpFunctionEnd76define i32 @test_umin(i32* %ptr, i32 %val) {77  %r = atomicrmw umin i32* %ptr, i32 %val seq_cst78  ret i32 %r79}80 81; CHECK:      [[UMAX]] = OpFunction [[I32Ty]]82; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[PtrI32Ty]]83; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[I32Ty]]84; CHECK-NEXT: OpLabel85; CHECK-NEXT: [[R:%.*]] = OpAtomicUMax [[I32Ty]] [[A]] [[SCOPE]] [[SEQ]] [[B]]86; CHECK-NEXT: OpReturnValue [[R]]87; CHECK-NEXT: OpFunctionEnd88define i32 @test_umax(i32* %ptr, i32 %val) {89  %r = atomicrmw umax i32* %ptr, i32 %val seq_cst90  ret i32 %r91}92 93; CHECK:      [[AND]] = OpFunction [[I32Ty]]94; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[PtrI32Ty]]95; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[I32Ty]]96; CHECK-NEXT: OpLabel97; CHECK-NEXT: [[R:%.*]] = OpAtomicAnd [[I32Ty]] [[A]] [[SCOPE]] [[SEQ]] [[B]]98; CHECK-NEXT: OpReturnValue [[R]]99; CHECK-NEXT: OpFunctionEnd100define i32 @test_and(i32* %ptr, i32 %val) {101  %r = atomicrmw and i32* %ptr, i32 %val seq_cst102  ret i32 %r103}104 105; CHECK:      [[OR]] = OpFunction [[I32Ty]]106; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[PtrI32Ty]]107; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[I32Ty]]108; CHECK-NEXT: OpLabel109; CHECK-NEXT: [[R:%.*]] = OpAtomicOr [[I32Ty]] [[A]] [[SCOPE]] [[SEQ]] [[B]]110; CHECK-NEXT: OpReturnValue [[R]]111; CHECK-NEXT: OpFunctionEnd112define i32 @test_or(i32* %ptr, i32 %val) {113  %r = atomicrmw or i32* %ptr, i32 %val seq_cst114  ret i32 %r115}116 117; CHECK:      [[XOR]] = OpFunction [[I32Ty]]118; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[PtrI32Ty]]119; CHECK-NEXT: [[B:%.*]] = OpFunctionParameter [[I32Ty]]120; CHECK-NEXT: OpLabel121; CHECK-NEXT: [[R:%.*]] = OpAtomicXor [[I32Ty]] [[A]] [[SCOPE]] [[SEQ]] [[B]]122; CHECK-NEXT: OpReturnValue [[R]]123; CHECK-NEXT: OpFunctionEnd124define i32 @test_xor(i32* %ptr, i32 %val) {125  %r = atomicrmw xor i32* %ptr, i32 %val seq_cst126  ret i32 %r127}128