xref: /llvm-project/llvm/test/CodeGen/SPIRV/phi-insert-point.ll (revision 42633cf27bd2cfb44e9f332c33cfd6750b9d7be4)
137d00635SVyacheslav Levytskyy; The goal of the test is to check that internal intrinsic functions for PHI's
237d00635SVyacheslav Levytskyy; operand are inserted at the correct positions, and don't break rules of
337d00635SVyacheslav Levytskyy; instruction domination and PHI nodes grouping at top of basic block.
437d00635SVyacheslav Levytskyy
5*42633cf2SVyacheslav Levytskyy; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
637d00635SVyacheslav Levytskyy; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
737d00635SVyacheslav Levytskyy
837d00635SVyacheslav Levytskyy; CHECK-DAG: OpName %[[#Foo:]] "foo"
937d00635SVyacheslav Levytskyy; CHECK-DAG: OpName %[[#Bar:]] "bar"
1037d00635SVyacheslav Levytskyy; CHECK: %[[#Foo]] = OpFunction
1137d00635SVyacheslav Levytskyy; CHECK: OpPhi
1237d00635SVyacheslav Levytskyy; CHECK-NEXT: OpPhi
1337d00635SVyacheslav Levytskyy; CHECK-NEXT: OpPhi
1437d00635SVyacheslav Levytskyy; CHECK-NEXT: OpPhi
1537d00635SVyacheslav Levytskyy; CHECK: %[[#Bar]] = OpFunction
1637d00635SVyacheslav Levytskyy; CHECK: OpPhi
1737d00635SVyacheslav Levytskyy; CHECK-NEXT: OpPhi
1837d00635SVyacheslav Levytskyy; CHECK-NEXT: OpPhi
1937d00635SVyacheslav Levytskyy; CHECK-NEXT: OpPhi
2037d00635SVyacheslav Levytskyy
2137d00635SVyacheslav Levytskyy%struct = type { i64, i64 }
2237d00635SVyacheslav Levytskyy
2337d00635SVyacheslav Levytskyydefine spir_kernel void @foo(i64 %arg_val, ptr addrspace(4) byval(%struct) %arg_ptr) {
2437d00635SVyacheslav Levytskyyentry:
2537d00635SVyacheslav Levytskyy  %fl = icmp eq i64 %arg_val, 0
2637d00635SVyacheslav Levytskyy  br i1 %fl, label %ok, label %err
2737d00635SVyacheslav Levytskyy
2837d00635SVyacheslav Levytskyyerr:
2937d00635SVyacheslav Levytskyy  br label %ok
3037d00635SVyacheslav Levytskyy
3137d00635SVyacheslav Levytskyyok:
3237d00635SVyacheslav Levytskyy  %r1 = phi i64 [ undef, %err ], [ %arg_val, %entry ]
3337d00635SVyacheslav Levytskyy  %r2 = phi i64 [ undef, %err ], [ %arg_val, %entry ]
3437d00635SVyacheslav Levytskyy  %r3 = phi ptr addrspace(4) [ undef, %err ], [ %arg_ptr, %entry ]
3537d00635SVyacheslav Levytskyy  %r4 = phi ptr addrspace(4) [ undef, %err ], [ %arg_ptr, %entry ]
3637d00635SVyacheslav Levytskyy  br label %exit
3737d00635SVyacheslav Levytskyy
3837d00635SVyacheslav Levytskyyexit:
3937d00635SVyacheslav Levytskyy  ret void
4037d00635SVyacheslav Levytskyy}
4137d00635SVyacheslav Levytskyy
4237d00635SVyacheslav Levytskyydefine spir_kernel void @bar(i64 %arg_val, i64 %arg_val_def, ptr addrspace(4) byval(%struct) %arg_ptr, ptr addrspace(4) %arg_ptr_def) {
4337d00635SVyacheslav Levytskyyentry:
4437d00635SVyacheslav Levytskyy  %fl = icmp eq i64 %arg_val, 0
4537d00635SVyacheslav Levytskyy  br i1 %fl, label %ok, label %err
4637d00635SVyacheslav Levytskyy
4737d00635SVyacheslav Levytskyyerr:
4837d00635SVyacheslav Levytskyy  br label %ok
4937d00635SVyacheslav Levytskyy
5037d00635SVyacheslav Levytskyyok:
5137d00635SVyacheslav Levytskyy  %r1 = phi i64 [ %arg_val_def, %err ], [ %arg_val, %entry ]
5237d00635SVyacheslav Levytskyy  %r2 = phi i64 [ %arg_val_def, %err ], [ %arg_val, %entry ]
5337d00635SVyacheslav Levytskyy  %r3 = phi ptr addrspace(4) [ %arg_ptr_def, %err ], [ %arg_ptr, %entry ]
5437d00635SVyacheslav Levytskyy  %r4 = phi ptr addrspace(4) [ %arg_ptr_def, %err ], [ %arg_ptr, %entry ]
5537d00635SVyacheslav Levytskyy  br label %exit
5637d00635SVyacheslav Levytskyy
5737d00635SVyacheslav Levytskyyexit:
5837d00635SVyacheslav Levytskyy  ret void
5937d00635SVyacheslav Levytskyy}
60