|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| 2 | +; RUN: opt < %s -LowerWGScope -S | FileCheck %s |
| 3 | + |
| 4 | +%struct.snork = type { i32 } |
| 5 | +%struct.eggs = type { i8 } |
| 6 | +%struct.snork.0 = type { %struct.widget, %struct.widget, %struct.widget, %struct.ham } |
| 7 | +%struct.widget = type { %struct.wibble } |
| 8 | +%struct.wibble = type { [3 x i64] } |
| 9 | +%struct.ham = type { %struct.wibble } |
| 10 | + |
| 11 | +@global = internal addrspace(3) global [12 x %struct.snork] zeroinitializer, align 4 |
| 12 | + |
| 13 | +; CHECK: @[[WG_NEXT:[a-zA-Z0-9_.]+]] = internal unnamed_addr addrspace(3) global %struct.snork addrspace(4)* undef, align 8 |
| 14 | +; CHECK: @[[WG_DONE:[a-zA-Z0-9_.]+]] = internal unnamed_addr addrspace(3) global i1 undef, align 1 |
| 15 | + |
| 16 | +define internal spir_func void @spam(%struct.eggs addrspace(4)* %arg, %struct.snork.0* byval(%struct.snork.0) align 8 %arg1) align 2 !work_group_scope !0 { |
| 17 | +; CHECK: arrayctor.loop: |
| 18 | +; CHECK-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi [[STRUCT_SNORK:%.*]] addrspace(4)* [ getelementptr inbounds ([12 x %struct.snork], [12 x %struct.snork] addrspace(4)* addrspacecast ([12 x %struct.snork] addrspace(3)* @global to [12 x %struct.snork] addrspace(4)*), i32 0, i32 0), [[WG_CF:%.*]] ], [ [[WG_VAL_ARRAYCTOR_NEXT:%.*]], [[WG_CF2:%.*]] ] |
| 19 | +; CHECK-NEXT: [[TMP4:%.*]] = load i64, i64 addrspace(1)* @__spirv_BuiltInLocalInvocationIndex, align 4 |
| 20 | +; CHECK-NEXT: call void @_Z22__spirv_ControlBarrierjjj(i32 2, i32 2, i32 272) |
| 21 | +; CHECK-NEXT: [[CMPZ3:%.*]] = icmp eq i64 [[TMP4]], 0 |
| 22 | +; CHECK-NEXT: br i1 [[CMPZ3]], label [[WG_LEADER1:%.*]], label [[WG_CF2]] |
| 23 | +; CHECK: wg_leader1: |
| 24 | +; CHECK-NEXT: call spir_func void @bar(%struct.snork addrspace(4)* [[ARRAYCTOR_CUR]]) |
| 25 | +; CHECK-NEXT: [[ARRAYCTOR_NEXT:%.*]] = getelementptr inbounds [[STRUCT_SNORK]], [[STRUCT_SNORK]] addrspace(4)* [[ARRAYCTOR_CUR]], i64 1 |
| 26 | +; CHECK-NEXT: store [[STRUCT_SNORK]] addrspace(4)* [[ARRAYCTOR_NEXT]], [[STRUCT_SNORK]] addrspace(4)* addrspace(3)* @[[WG_NEXT]], align 8 |
| 27 | +; CHECK-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq [[STRUCT_SNORK]] addrspace(4)* [[ARRAYCTOR_NEXT]], getelementptr inbounds (%struct.snork, [[STRUCT_SNORK]] addrspace(4)* getelementptr inbounds ([12 x %struct.snork], [12 x %struct.snork] addrspace(4)* addrspacecast ([12 x %struct.snork] addrspace(3)* @global to [12 x %struct.snork] addrspace(4)*), i32 0, i32 0), i64 12) |
| 28 | +; CHECK-NEXT: store i1 [[ARRAYCTOR_DONE]], i1 addrspace(3)* @[[WG_DONE]], align 1 |
| 29 | +; CHECK-NEXT: br label [[WG_CF2]] |
| 30 | +; CHECK: wg_cf2: |
| 31 | +; CHECK-NEXT: call void @_Z22__spirv_ControlBarrierjjj(i32 2, i32 2, i32 272) #0 |
| 32 | +; CHECK-NEXT: [[WG_VAL_ARRAYCTOR_DONE:%.*]] = load i1, i1 addrspace(3)* @[[WG_DONE]], align 1 |
| 33 | +; CHECK-NEXT: [[WG_VAL_ARRAYCTOR_NEXT]] = load [[STRUCT_SNORK]] addrspace(4)*, [[STRUCT_SNORK]] addrspace(4)* addrspace(3)* @[[WG_NEXT]], align 8 |
| 34 | +; CHECK-NEXT: br i1 [[WG_VAL_ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP:%.*]] |
| 35 | +; CHECK: arrayctor.cont: |
| 36 | +; CHECK-NEXT: ret void |
| 37 | +; |
| 38 | +entry: |
| 39 | + %tmp = alloca %struct.eggs addrspace(4)*, align 8 |
| 40 | + store %struct.eggs addrspace(4)* %arg, %struct.eggs addrspace(4)** %tmp, align 8 |
| 41 | + %tmp2 = load %struct.eggs addrspace(4)*, %struct.eggs addrspace(4)** %tmp, align 8 |
| 42 | + br label %arrayctor.loop |
| 43 | + |
| 44 | +arrayctor.loop: ; preds = %arrayctor.loop, %entry |
| 45 | + %arrayctor.cur = phi %struct.snork addrspace(4)* [ getelementptr inbounds ([12 x %struct.snork], [12 x %struct.snork] addrspace(4)* addrspacecast ([12 x %struct.snork] addrspace(3)* @global to [12 x %struct.snork] addrspace(4)*), i32 0, i32 0), %entry ], [ %arrayctor.next, %arrayctor.loop ] |
| 46 | + call spir_func void @bar(%struct.snork addrspace(4)* %arrayctor.cur) |
| 47 | + %arrayctor.next = getelementptr inbounds %struct.snork, %struct.snork addrspace(4)* %arrayctor.cur, i64 1 |
| 48 | + %arrayctor.done = icmp eq %struct.snork addrspace(4)* %arrayctor.next, getelementptr inbounds (%struct.snork, %struct.snork addrspace(4)* getelementptr inbounds ([12 x %struct.snork], [12 x %struct.snork] addrspace(4)* addrspacecast ([12 x %struct.snork] addrspace(3)* @global to [12 x %struct.snork] addrspace(4)*), i32 0, i32 0), i64 12) |
| 49 | + br i1 %arrayctor.done, label %arrayctor.cont, label %arrayctor.loop |
| 50 | + |
| 51 | +arrayctor.cont: ; preds = %arrayctor.loop |
| 52 | + ret void |
| 53 | +} |
| 54 | + |
| 55 | +define linkonce_odr dso_local spir_func void @bar(%struct.snork addrspace(4)* %arg) unnamed_addr align 2 { |
| 56 | +bb: |
| 57 | + %tmp = alloca %struct.snork addrspace(4)*, align 8 |
| 58 | + store %struct.snork addrspace(4)* %arg, %struct.snork addrspace(4)** %tmp, align 8 |
| 59 | + %tmp1 = load %struct.snork addrspace(4)*, %struct.snork addrspace(4)** %tmp, align 8 |
| 60 | + %tmp2 = getelementptr inbounds %struct.snork, %struct.snork addrspace(4)* %tmp1, i32 0, i32 0 |
| 61 | + store i32 0, i32 addrspace(4)* %tmp2, align 4 |
| 62 | + ret void |
| 63 | +} |
| 64 | + |
| 65 | +!0 = !{} |
0 commit comments