1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 2; RUN: opt -S -mcpu=gfx900 -amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s 3; RUN: opt -S -mcpu=gfx900 -passes=amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s 4 5target datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-p7:160:256:256:32-p8:128:128-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8" 6target triple = "amdgcn--" 7 8@buf = external addrspace(8) global i8 9@flat = external global i8 10 11define ptr addrspace(7) @null() { 12; CHECK-LABEL: define { ptr addrspace(8), i32 } @null 13; CHECK-SAME: () #[[ATTR0:[0-9]+]] { 14; CHECK-NEXT: ret { ptr addrspace(8), i32 } zeroinitializer 15; 16 ret ptr addrspace(7) null 17} 18 19define <2 x ptr addrspace(7)> @null_vector() { 20; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @null_vector 21; CHECK-SAME: () #[[ATTR0]] { 22; CHECK-NEXT: ret { <2 x ptr addrspace(8)>, <2 x i32> } zeroinitializer 23; 24 ret <2 x ptr addrspace(7)> zeroinitializer 25} 26 27define ptr addrspace(7) @undef() { 28; CHECK-LABEL: define { ptr addrspace(8), i32 } @undef 29; CHECK-SAME: () #[[ATTR0]] { 30; CHECK-NEXT: ret { ptr addrspace(8), i32 } undef 31; 32 ret ptr addrspace(7) undef 33} 34 35define <2 x ptr addrspace(7)> @undef_vec() { 36; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @undef_vec 37; CHECK-SAME: () #[[ATTR0]] { 38; CHECK-NEXT: ret { <2 x ptr addrspace(8)>, <2 x i32> } undef 39; 40 ret <2 x ptr addrspace(7)> undef 41} 42 43define ptr addrspace(7) @poison() { 44; CHECK-LABEL: define { ptr addrspace(8), i32 } @poison 45; CHECK-SAME: () #[[ATTR0]] { 46; CHECK-NEXT: ret { ptr addrspace(8), i32 } poison 47; 48 ret ptr addrspace(7) poison 49} 50 51define <2 x ptr addrspace(7)> @poison_vec() { 52; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @poison_vec 53; CHECK-SAME: () #[[ATTR0]] { 54; CHECK-NEXT: ret { <2 x ptr addrspace(8)>, <2 x i32> } poison 55; 56 ret <2 x ptr addrspace(7)> poison 57} 58 59define ptr addrspace(7) @cast_global() { 60; CHECK-LABEL: define { ptr addrspace(8), i32 } @cast_global 61; CHECK-SAME: () #[[ATTR0]] { 62; CHECK-NEXT: ret { ptr addrspace(8), i32 } { ptr addrspace(8) @buf, i32 0 } 63; 64 ret ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)) 65} 66 67define ptr addrspace(7) @cast_null() { 68; CHECK-LABEL: define { ptr addrspace(8), i32 } @cast_null 69; CHECK-SAME: () #[[ATTR0]] { 70; CHECK-NEXT: ret { ptr addrspace(8), i32 } zeroinitializer 71; 72 ret ptr addrspace(7) addrspacecast (ptr addrspace(8) null to ptr addrspace(7)) 73} 74 75define <2 x ptr addrspace(7)> @cast_vec() { 76; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @cast_vec 77; CHECK-SAME: () #[[ATTR0]] { 78; CHECK-NEXT: ret { <2 x ptr addrspace(8)>, <2 x i32> } { <2 x ptr addrspace(8)> <ptr addrspace(8) @buf, ptr addrspace(8) null>, <2 x i32> zeroinitializer } 79; 80 ret <2 x ptr addrspace(7)> addrspacecast ( 81 <2 x ptr addrspace(8)> <ptr addrspace(8) @buf, ptr addrspace(8) null> 82 to <2 x ptr addrspace(7)>) 83} 84 85define ptr addrspace(7) @gep() { 86; CHECK-LABEL: define { ptr addrspace(8), i32 } @gep 87; CHECK-SAME: () #[[ATTR0]] { 88; CHECK-NEXT: ret { ptr addrspace(8), i32 } { ptr addrspace(8) @buf, i32 36 } 89; 90 ret ptr addrspace(7) getelementptr inbounds ( 91 [4 x i32], 92 ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)), 93 i64 2, i32 1) 94} 95 96define <2 x ptr addrspace(7)> @gep_vector() { 97; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @gep_vector 98; CHECK-SAME: () #[[ATTR0]] { 99; CHECK-NEXT: ret { <2 x ptr addrspace(8)>, <2 x i32> } { <2 x ptr addrspace(8)> <ptr addrspace(8) @buf, ptr addrspace(8) null>, <2 x i32> <i32 12, i32 4> } 100; 101 ret <2 x ptr addrspace(7)> getelementptr ( 102 i32, 103 <2 x ptr addrspace(7)> 104 <ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)), 105 ptr addrspace(7) null>, 106 <2 x i32> <i32 3, i32 1>) 107} 108 109define ptr @gep_of_p7() { 110; CHECK-LABEL: define ptr @gep_of_p7 111; CHECK-SAME: () #[[ATTR0]] { 112; CHECK-NEXT: ret ptr getelementptr inbounds (ptr addrspace(7), ptr @flat, i64 2) 113; 114 ret ptr getelementptr inbounds (ptr addrspace(7), ptr @flat, i64 2) 115} 116 117define ptr @gep_of_p7_vector() { 118; CHECK-LABEL: define ptr @gep_of_p7_vector 119; CHECK-SAME: () #[[ATTR0]] { 120; CHECK-NEXT: ret ptr getelementptr (<2 x ptr addrspace(7)>, ptr @flat, i64 2) 121; 122 ret ptr getelementptr (<2 x ptr addrspace(7)>, ptr @flat, i64 2) 123} 124 125define ptr @gep_of_p7_struct() { 126; CHECK-LABEL: define ptr @gep_of_p7_struct 127; CHECK-SAME: () #[[ATTR0]] { 128; CHECK-NEXT: ret ptr getelementptr ({ ptr addrspace(7), i32 }, ptr @flat, i64 2) 129; 130 ret ptr getelementptr ({ptr addrspace(7), i32}, ptr @flat, i64 2) 131} 132 133define ptr addrspace(7) @gep_p7_from_p7() { 134; CHECK-LABEL: define { ptr addrspace(8), i32 } @gep_p7_from_p7 135; CHECK-SAME: () #[[ATTR0]] { 136; CHECK-NEXT: ret { ptr addrspace(8), i32 } { ptr addrspace(8) @buf, i32 48 } 137; 138 ret ptr addrspace(7) getelementptr (ptr addrspace(7), 139 ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)), 140 i64 2) 141} 142 143define i160 @ptrtoint() { 144; CHECK-LABEL: define i160 @ptrtoint 145; CHECK-SAME: () #[[ATTR0]] { 146; CHECK-NEXT: [[TMP1:%.*]] = shl nuw i160 ptrtoint (ptr addrspace(8) @buf to i160), 32 147; CHECK-NEXT: [[TMP2:%.*]] = or i160 [[TMP1]], 12 148; CHECK-NEXT: ret i160 [[TMP2]] 149; 150 ret i160 ptrtoint( 151 ptr addrspace(7) getelementptr( 152 i32, ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)), 153 i32 3) to i160) 154} 155 156define i256 @ptrtoint_long() { 157; CHECK-LABEL: define i256 @ptrtoint_long 158; CHECK-SAME: () #[[ATTR0]] { 159; CHECK-NEXT: [[TMP1:%.*]] = shl nuw nsw i256 ptrtoint (ptr addrspace(8) @buf to i256), 32 160; CHECK-NEXT: [[TMP2:%.*]] = or i256 [[TMP1]], 12 161; CHECK-NEXT: ret i256 [[TMP2]] 162; 163 ret i256 ptrtoint( 164 ptr addrspace(7) getelementptr( 165 i32, ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)), 166 i32 3) to i256) 167} 168 169define i64 @ptrtoint_short() { 170; CHECK-LABEL: define i64 @ptrtoint_short 171; CHECK-SAME: () #[[ATTR0]] { 172; CHECK-NEXT: [[TMP1:%.*]] = shl i64 ptrtoint (ptr addrspace(8) @buf to i64), 32 173; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 12 174; CHECK-NEXT: ret i64 [[TMP2]] 175; 176 ret i64 ptrtoint( 177 ptr addrspace(7) getelementptr( 178 i32, ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)), 179 i32 3) to i64) 180} 181 182define i32 @ptrtoint_very_short() { 183; CHECK-LABEL: define i32 @ptrtoint_very_short 184; CHECK-SAME: () #[[ATTR0]] { 185; CHECK-NEXT: ret i32 12 186; 187 ret i32 ptrtoint( 188 ptr addrspace(7) getelementptr( 189 i32, ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)), 190 i32 3) to i32) 191} 192 193 194define <2 x i160> @ptrtoint_vec() { 195; CHECK-LABEL: define <2 x i160> @ptrtoint_vec 196; CHECK-SAME: () #[[ATTR0]] { 197; CHECK-NEXT: ret <2 x i160> zeroinitializer 198; 199 ret <2 x i160> ptrtoint (<2 x ptr addrspace(7)> zeroinitializer to <2 x i160>) 200} 201 202define ptr addrspace(7) @inttoptr() { 203; CHECK-LABEL: define { ptr addrspace(8), i32 } @inttoptr 204; CHECK-SAME: () #[[ATTR0]] { 205; CHECK-NEXT: ret { ptr addrspace(8), i32 } zeroinitializer 206; 207 ret ptr addrspace(7) inttoptr (i160 0 to ptr addrspace(7)) 208} 209 210define <2 x ptr addrspace(7)> @inttoptr_vec() { 211; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @inttoptr_vec 212; CHECK-SAME: () #[[ATTR0]] { 213; CHECK-NEXT: ret { <2 x ptr addrspace(8)>, <2 x i32> } { <2 x ptr addrspace(8)> zeroinitializer, <2 x i32> <i32 1, i32 2> } 214; 215 ret <2 x ptr addrspace(7)> inttoptr (<2 x i160> <i160 1, i160 2> to <2 x ptr addrspace(7)>) 216} 217 218define i32 @fancy_zero() { 219; CHECK-LABEL: define i32 @fancy_zero 220; CHECK-SAME: () #[[ATTR0]] { 221; CHECK-NEXT: ret i32 0 222; 223 ret i32 ptrtoint ( 224 ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)) 225 to i32) 226} 227