124 lines · plain
1; The goal of the test is to check that newly inserted `ptrcast` internal2; intrinsic functions for PHI's operands are inserted at the correct3; positions, and don't break rules of instruction domination and PHI nodes4; grouping at top of basic block.5 6; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s7; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}8 9 10; CHECK-DAG: OpName %[[#Case1:]] "case1"11; CHECK-DAG: OpName %[[#Case2:]] "case2"12; CHECK-DAG: OpName %[[#Case3:]] "case3"13 14%struct1 = type { i64 }15%struct2 = type { i64, i64 }16 17@.str.1 = private unnamed_addr addrspace(1) constant [3 x i8] c"OK\00", align 118@.str.2 = private unnamed_addr addrspace(1) constant [6 x i8] c"WRONG\00", align 119 20; CHECK: %[[#Case1]] = OpFunction21define spir_func void @case1(i1 %b1, i1 %b2, i1 %b3) {22entry:23 %tmp.1 = alloca i8, align 124; CHECK: OpBranchConditional %[[#]] %[[#l1:]] %[[#l2:]]25 br i1 %b1, label %l1, label %l226 27l1:28 %str = phi ptr addrspace(1) [ @.str.1, %entry ], [ @.str.2, %l2 ], [ @.str.2, %l3 ]29 %v1 = load i8, ptr addrspace(1) %str, align 130 store i8 %v1, ptr %tmp.1, align 131 br label %exit32 33; CHECK: %[[#l2]] = OpLabel34; CHECK: OpBranchConditional %[[#]] %[[#l1]] %[[#l3:]]35l2:36 br i1 %b2, label %l1, label %l337 38; CHECK: %[[#l3]] = OpLabel39; CHECK: OpBranchConditional %[[#]] %[[#l1]] %[[#exit:]]40l3:41 br i1 %b3, label %l1, label %exit42 43; CHECK: %[[#l1]] = OpLabel44; CHECK-NEXT: OpPhi45; CHECK: OpBranch %[[#exit]]46 47; CHECK: %[[#exit]] = OpLabel48; CHECK: OpReturn49exit:50 ret void51 52}53 54; CHECK: %[[#Case2]] = OpFunction55define spir_func void @case2(i1 %b1, i1 %b2, i1 %b3, ptr addrspace(1) byval(%struct1) %str1, ptr addrspace(1) byval(%struct2) %str2) {56entry:57 %tmp.2 = alloca i8, align 158; CHECK: OpBranchConditional %[[#]] %[[#l1:]] %[[#l2:]]59 br i1 %b1, label %l1, label %l260 61l1:62 %str = phi ptr addrspace(1) [ %str1, %entry ], [ %str2, %l2 ], [ %str2, %l3 ]63 %v2 = load i8, ptr addrspace(1) %str, align 164 store i8 %v2, ptr %tmp.2, align 165 br label %exit66 67; CHECK: %[[#l2]] = OpLabel68; CHECK: OpBranchConditional %[[#]] %[[#l1]] %[[#l3:]]69l2:70 br i1 %b2, label %l1, label %l371 72; CHECK: %[[#l3]] = OpLabel73; CHECK: OpBranchConditional %[[#]] %[[#l1]] %[[#exit:]]74l3:75 br i1 %b3, label %l1, label %exit76 77; CHECK: %[[#l1]] = OpLabel78; CHECK-NEXT: OpPhi79; CHECK: OpBranch %[[#exit]]80 81; CHECK: %[[#exit]] = OpLabel82; CHECK: OpReturn83exit:84 ret void85}86 87; CHECK: %[[#Case3]] = OpFunction88define spir_func void @case3(i1 %b1, i1 %b2, i1 %b3, ptr addrspace(1) byval(%struct1) %_arg_str1, ptr addrspace(1) byval(%struct2) %_arg_str2) {89 90; CHECK: OpBranchConditional %[[#]] %[[#l1:]] %[[#l2:]]91entry:92 %tmp.3 = alloca i8, align 193 br i1 %b1, label %l1, label %l294 95l1:96 %str = phi ptr addrspace(1) [ %_arg_str1, %entry ], [ %str2, %l2 ], [ %str3, %l3 ]97 %v3 = load i8, ptr addrspace(1) %str, align 198 store i8 %v3, ptr %tmp.3, align 199 br label %exit100 101; CHECK: %[[#l2]] = OpLabel102; CHECK: OpInBoundsPtrAccessChain103; CHECK: OpBranchConditional %[[#]] %[[#l1]] %[[#l3:]]104l2:105 %str2 = getelementptr inbounds %struct2, ptr addrspace(1) %_arg_str2, i32 1106 br i1 %b2, label %l1, label %l3107 108; CHECK: %[[#l3]] = OpLabel109; CHECK: OpInBoundsPtrAccessChain110; CHECK: OpBranchConditional %[[#]] %[[#l1]] %[[#exit:]]111l3:112 %str3 = getelementptr inbounds %struct2, ptr addrspace(1) %_arg_str2, i32 2113 br i1 %b3, label %l1, label %exit114 115; CHECK: %[[#l1]] = OpLabel116; CHECK-NEXT: OpPhi117; CHECK: OpBranch %[[#exit]]118 119; CHECK: %[[#exit]] = OpLabel120; CHECK: OpReturn121exit:122 ret void123}124