1; RUN: opt -S -codegenprepare -mtriple=amdgcn--amdhsa < %s | FileCheck %s 2 3; CHECK-LABEL: @no_sink_local_to_flat( 4; CHECK: addrspacecast 5; CHECK: br 6; CHECK-NOT: addrspacecast 7define i64 @no_sink_local_to_flat(i1 %pred, i64 addrspace(3)* %ptr) { 8 %ptr_cast = addrspacecast i64 addrspace(3)* %ptr to i64* 9 br i1 %pred, label %l1, label %l2 10 11l1: 12 %v1 = load i64, i64 addrspace(3)* %ptr 13 ret i64 %v1 14 15l2: 16 %v2 = load i64, i64* %ptr_cast 17 ret i64 %v2 18} 19 20; CHECK-LABEL: @no_sink_private_to_flat( 21; CHECK: addrspacecast 22; CHECK: br 23; CHECK-NOT: addrspacecast 24define i64 @no_sink_private_to_flat(i1 %pred, i64 addrspace(5)* %ptr) { 25 %ptr_cast = addrspacecast i64 addrspace(5)* %ptr to i64* 26 br i1 %pred, label %l1, label %l2 27 28l1: 29 %v1 = load i64, i64 addrspace(5)* %ptr 30 ret i64 %v1 31 32l2: 33 %v2 = load i64, i64* %ptr_cast 34 ret i64 %v2 35} 36 37 38; CHECK-LABEL: @sink_global_to_flat( 39; CHECK-NOT: addrspacecast 40; CHECK: br 41; CHECK: addrspacecast 42define i64 @sink_global_to_flat(i1 %pred, i64 addrspace(1)* %ptr) { 43 %ptr_cast = addrspacecast i64 addrspace(1)* %ptr to i64* 44 br i1 %pred, label %l1, label %l2 45 46l1: 47 %v1 = load i64, i64 addrspace(1)* %ptr 48 ret i64 %v1 49 50l2: 51 %v2 = load i64, i64* %ptr_cast 52 ret i64 %v2 53} 54 55; CHECK-LABEL: @sink_flat_to_global( 56; CHECK-NOT: addrspacecast 57; CHECK: br 58; CHECK: addrspacecast 59define i64 @sink_flat_to_global(i1 %pred, i64* %ptr) { 60 %ptr_cast = addrspacecast i64* %ptr to i64 addrspace(1)* 61 br i1 %pred, label %l1, label %l2 62 63l1: 64 %v1 = load i64, i64* %ptr 65 ret i64 %v1 66 67l2: 68 %v2 = load i64, i64 addrspace(1)* %ptr_cast 69 ret i64 %v2 70} 71 72; CHECK-LABEL: @sink_flat_to_constant( 73; CHECK-NOT: addrspacecast 74; CHECK: br 75; CHECK: addrspacecast 76define i64 @sink_flat_to_constant(i1 %pred, i64* %ptr) { 77 %ptr_cast = addrspacecast i64* %ptr to i64 addrspace(4)* 78 br i1 %pred, label %l1, label %l2 79 80l1: 81 %v1 = load i64, i64* %ptr 82 ret i64 %v1 83 84l2: 85 %v2 = load i64, i64 addrspace(4)* %ptr_cast 86 ret i64 %v2 87} 88 89; CHECK-LABEL: @sink_flat_to_local( 90; CHECK-NOT: addrspacecast 91; CHECK: br 92; CHECK: addrspacecast 93define i64 @sink_flat_to_local(i1 %pred, i64* %ptr) { 94 %ptr_cast = addrspacecast i64* %ptr to i64 addrspace(3)* 95 br i1 %pred, label %l1, label %l2 96 97l1: 98 %v1 = load i64, i64* %ptr 99 ret i64 %v1 100 101l2: 102 %v2 = load i64, i64 addrspace(3)* %ptr_cast 103 ret i64 %v2 104} 105 106; CHECK-LABEL: @sink_flat_to_private( 107; CHECK-NOT: addrspacecast 108; CHECK: br 109; CHECK: addrspacecast 110define i64 @sink_flat_to_private(i1 %pred, i64* %ptr) { 111 %ptr_cast = addrspacecast i64* %ptr to i64 addrspace(5)* 112 br i1 %pred, label %l1, label %l2 113 114l1: 115 %v1 = load i64, i64* %ptr 116 ret i64 %v1 117 118l2: 119 %v2 = load i64, i64 addrspace(5)* %ptr_cast 120 ret i64 %v2 121} 122