1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3 2; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' -mtriple=amdgcn--amdhsa < %s | FileCheck %s 3 4define i64 @no_sink_local_to_flat(i1 %pred, ptr addrspace(3) %ptr) { 5; CHECK-LABEL: define i64 @no_sink_local_to_flat( 6; CHECK-SAME: i1 [[PRED:%.*]], ptr addrspace(3) [[PTR:%.*]]) { 7; CHECK-NEXT: [[PTR_CAST:%.*]] = addrspacecast ptr addrspace(3) [[PTR]] to ptr 8; CHECK-NEXT: br i1 [[PRED]], label [[L1:%.*]], label [[L2:%.*]] 9; CHECK: l1: 10; CHECK-NEXT: [[V1:%.*]] = load i64, ptr addrspace(3) [[PTR]], align 8 11; CHECK-NEXT: ret i64 [[V1]] 12; CHECK: l2: 13; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[PTR_CAST]], align 8 14; CHECK-NEXT: ret i64 [[V2]] 15; 16 %ptr_cast = addrspacecast ptr addrspace(3) %ptr to ptr 17 br i1 %pred, label %l1, label %l2 18 19l1: 20 %v1 = load i64, ptr addrspace(3) %ptr 21 ret i64 %v1 22 23l2: 24 %v2 = load i64, ptr %ptr_cast 25 ret i64 %v2 26} 27 28define i64 @no_sink_private_to_flat(i1 %pred, ptr addrspace(5) %ptr) { 29; CHECK-LABEL: define i64 @no_sink_private_to_flat( 30; CHECK-SAME: i1 [[PRED:%.*]], ptr addrspace(5) [[PTR:%.*]]) { 31; CHECK-NEXT: [[PTR_CAST:%.*]] = addrspacecast ptr addrspace(5) [[PTR]] to ptr 32; CHECK-NEXT: br i1 [[PRED]], label [[L1:%.*]], label [[L2:%.*]] 33; CHECK: l1: 34; CHECK-NEXT: [[V1:%.*]] = load i64, ptr addrspace(5) [[PTR]], align 8 35; CHECK-NEXT: ret i64 [[V1]] 36; CHECK: l2: 37; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[PTR_CAST]], align 8 38; CHECK-NEXT: ret i64 [[V2]] 39; 40 %ptr_cast = addrspacecast ptr addrspace(5) %ptr to ptr 41 br i1 %pred, label %l1, label %l2 42 43l1: 44 %v1 = load i64, ptr addrspace(5) %ptr 45 ret i64 %v1 46 47l2: 48 %v2 = load i64, ptr %ptr_cast 49 ret i64 %v2 50} 51 52 53define i64 @sink_global_to_flat(i1 %pred, ptr addrspace(1) %ptr) { 54; CHECK-LABEL: define i64 @sink_global_to_flat( 55; CHECK-SAME: i1 [[PRED:%.*]], ptr addrspace(1) [[PTR:%.*]]) { 56; CHECK-NEXT: br i1 [[PRED]], label [[L1:%.*]], label [[L2:%.*]] 57; CHECK: l1: 58; CHECK-NEXT: [[V1:%.*]] = load i64, ptr addrspace(1) [[PTR]], align 8 59; CHECK-NEXT: ret i64 [[V1]] 60; CHECK: l2: 61; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr addrspace(1) [[PTR]] to ptr 62; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[TMP1]], align 8 63; CHECK-NEXT: ret i64 [[V2]] 64; 65 %ptr_cast = addrspacecast ptr addrspace(1) %ptr to ptr 66 br i1 %pred, label %l1, label %l2 67 68l1: 69 %v1 = load i64, ptr addrspace(1) %ptr 70 ret i64 %v1 71 72l2: 73 %v2 = load i64, ptr %ptr_cast 74 ret i64 %v2 75} 76 77define i64 @sink_flat_to_global(i1 %pred, ptr %ptr) { 78; CHECK-LABEL: define i64 @sink_flat_to_global( 79; CHECK-SAME: i1 [[PRED:%.*]], ptr [[PTR:%.*]]) { 80; CHECK-NEXT: br i1 [[PRED]], label [[L1:%.*]], label [[L2:%.*]] 81; CHECK: l1: 82; CHECK-NEXT: [[V1:%.*]] = load i64, ptr [[PTR]], align 8 83; CHECK-NEXT: ret i64 [[V1]] 84; CHECK: l2: 85; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(1) 86; CHECK-NEXT: [[V2:%.*]] = load i64, ptr addrspace(1) [[TMP1]], align 8 87; CHECK-NEXT: ret i64 [[V2]] 88; 89 %ptr_cast = addrspacecast ptr %ptr to ptr addrspace(1) 90 br i1 %pred, label %l1, label %l2 91 92l1: 93 %v1 = load i64, ptr %ptr 94 ret i64 %v1 95 96l2: 97 %v2 = load i64, ptr addrspace(1) %ptr_cast 98 ret i64 %v2 99} 100 101define i64 @sink_flat_to_constant(i1 %pred, ptr %ptr) { 102; CHECK-LABEL: define i64 @sink_flat_to_constant( 103; CHECK-SAME: i1 [[PRED:%.*]], ptr [[PTR:%.*]]) { 104; CHECK-NEXT: br i1 [[PRED]], label [[L1:%.*]], label [[L2:%.*]] 105; CHECK: l1: 106; CHECK-NEXT: [[V1:%.*]] = load i64, ptr [[PTR]], align 8 107; CHECK-NEXT: ret i64 [[V1]] 108; CHECK: l2: 109; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(4) 110; CHECK-NEXT: [[V2:%.*]] = load i64, ptr addrspace(4) [[TMP1]], align 8 111; CHECK-NEXT: ret i64 [[V2]] 112; 113 %ptr_cast = addrspacecast ptr %ptr to ptr addrspace(4) 114 br i1 %pred, label %l1, label %l2 115 116l1: 117 %v1 = load i64, ptr %ptr 118 ret i64 %v1 119 120l2: 121 %v2 = load i64, ptr addrspace(4) %ptr_cast 122 ret i64 %v2 123} 124 125define i64 @sink_flat_to_local(i1 %pred, ptr %ptr) { 126; CHECK-LABEL: define i64 @sink_flat_to_local( 127; CHECK-SAME: i1 [[PRED:%.*]], ptr [[PTR:%.*]]) { 128; CHECK-NEXT: [[PTR_CAST:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(3) 129; CHECK-NEXT: br i1 [[PRED]], label [[L1:%.*]], label [[L2:%.*]] 130; CHECK: l1: 131; CHECK-NEXT: [[V1:%.*]] = load i64, ptr [[PTR]], align 8 132; CHECK-NEXT: ret i64 [[V1]] 133; CHECK: l2: 134; CHECK-NEXT: [[V2:%.*]] = load i64, ptr addrspace(3) [[PTR_CAST]], align 8 135; CHECK-NEXT: ret i64 [[V2]] 136; 137 %ptr_cast = addrspacecast ptr %ptr to ptr addrspace(3) 138 br i1 %pred, label %l1, label %l2 139 140l1: 141 %v1 = load i64, ptr %ptr 142 ret i64 %v1 143 144l2: 145 %v2 = load i64, ptr addrspace(3) %ptr_cast 146 ret i64 %v2 147} 148 149define i64 @sink_flat_to_private(i1 %pred, ptr %ptr) { 150; CHECK-LABEL: define i64 @sink_flat_to_private( 151; CHECK-SAME: i1 [[PRED:%.*]], ptr [[PTR:%.*]]) { 152; CHECK-NEXT: [[PTR_CAST:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(5) 153; CHECK-NEXT: br i1 [[PRED]], label [[L1:%.*]], label [[L2:%.*]] 154; CHECK: l1: 155; CHECK-NEXT: [[V1:%.*]] = load i64, ptr [[PTR]], align 8 156; CHECK-NEXT: ret i64 [[V1]] 157; CHECK: l2: 158; CHECK-NEXT: [[V2:%.*]] = load i64, ptr addrspace(5) [[PTR_CAST]], align 8 159; CHECK-NEXT: ret i64 [[V2]] 160; 161 %ptr_cast = addrspacecast ptr %ptr to ptr addrspace(5) 162 br i1 %pred, label %l1, label %l2 163 164l1: 165 %v1 = load i64, ptr %ptr 166 ret i64 %v1 167 168l2: 169 %v2 = load i64, ptr addrspace(5) %ptr_cast 170 ret i64 %v2 171} 172