brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.7 KiB · c250eba Raw
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