16540f163SKrzysztof Drewniak; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 26540f163SKrzysztof Drewniak; RUN: opt -S -mcpu=gfx900 -amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s 36540f163SKrzysztof Drewniak; RUN: opt -S -mcpu=gfx900 -passes=amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s 46540f163SKrzysztof Drewniak 56540f163SKrzysztof Drewniaktarget 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" 66540f163SKrzysztof Drewniaktarget triple = "amdgcn--" 76540f163SKrzysztof Drewniak 86540f163SKrzysztof Drewniak@buf = external addrspace(8) global i8 96540f163SKrzysztof Drewniak@flat = external global i8 106540f163SKrzysztof Drewniak 116540f163SKrzysztof Drewniakdefine ptr addrspace(7) @null() { 126540f163SKrzysztof Drewniak; CHECK-LABEL: define { ptr addrspace(8), i32 } @null 136540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0:[0-9]+]] { 146540f163SKrzysztof Drewniak; CHECK-NEXT: ret { ptr addrspace(8), i32 } zeroinitializer 156540f163SKrzysztof Drewniak; 166540f163SKrzysztof Drewniak ret ptr addrspace(7) null 176540f163SKrzysztof Drewniak} 186540f163SKrzysztof Drewniak 196540f163SKrzysztof Drewniakdefine <2 x ptr addrspace(7)> @null_vector() { 206540f163SKrzysztof Drewniak; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @null_vector 216540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 226540f163SKrzysztof Drewniak; CHECK-NEXT: ret { <2 x ptr addrspace(8)>, <2 x i32> } zeroinitializer 236540f163SKrzysztof Drewniak; 246540f163SKrzysztof Drewniak ret <2 x ptr addrspace(7)> zeroinitializer 256540f163SKrzysztof Drewniak} 266540f163SKrzysztof Drewniak 276540f163SKrzysztof Drewniakdefine ptr addrspace(7) @undef() { 286540f163SKrzysztof Drewniak; CHECK-LABEL: define { ptr addrspace(8), i32 } @undef 296540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 306540f163SKrzysztof Drewniak; CHECK-NEXT: ret { ptr addrspace(8), i32 } undef 316540f163SKrzysztof Drewniak; 326540f163SKrzysztof Drewniak ret ptr addrspace(7) undef 336540f163SKrzysztof Drewniak} 346540f163SKrzysztof Drewniak 356540f163SKrzysztof Drewniakdefine <2 x ptr addrspace(7)> @undef_vec() { 366540f163SKrzysztof Drewniak; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @undef_vec 376540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 386540f163SKrzysztof Drewniak; CHECK-NEXT: ret { <2 x ptr addrspace(8)>, <2 x i32> } undef 396540f163SKrzysztof Drewniak; 406540f163SKrzysztof Drewniak ret <2 x ptr addrspace(7)> undef 416540f163SKrzysztof Drewniak} 426540f163SKrzysztof Drewniak 436540f163SKrzysztof Drewniakdefine ptr addrspace(7) @poison() { 446540f163SKrzysztof Drewniak; CHECK-LABEL: define { ptr addrspace(8), i32 } @poison 456540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 466540f163SKrzysztof Drewniak; CHECK-NEXT: ret { ptr addrspace(8), i32 } poison 476540f163SKrzysztof Drewniak; 486540f163SKrzysztof Drewniak ret ptr addrspace(7) poison 496540f163SKrzysztof Drewniak} 506540f163SKrzysztof Drewniak 516540f163SKrzysztof Drewniakdefine <2 x ptr addrspace(7)> @poison_vec() { 526540f163SKrzysztof Drewniak; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @poison_vec 536540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 546540f163SKrzysztof Drewniak; CHECK-NEXT: ret { <2 x ptr addrspace(8)>, <2 x i32> } poison 556540f163SKrzysztof Drewniak; 566540f163SKrzysztof Drewniak ret <2 x ptr addrspace(7)> poison 576540f163SKrzysztof Drewniak} 586540f163SKrzysztof Drewniak 596540f163SKrzysztof Drewniakdefine ptr addrspace(7) @cast_global() { 606540f163SKrzysztof Drewniak; CHECK-LABEL: define { ptr addrspace(8), i32 } @cast_global 616540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 626540f163SKrzysztof Drewniak; CHECK-NEXT: ret { ptr addrspace(8), i32 } { ptr addrspace(8) @buf, i32 0 } 636540f163SKrzysztof Drewniak; 646540f163SKrzysztof Drewniak ret ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)) 656540f163SKrzysztof Drewniak} 666540f163SKrzysztof Drewniak 676540f163SKrzysztof Drewniakdefine ptr addrspace(7) @cast_null() { 686540f163SKrzysztof Drewniak; CHECK-LABEL: define { ptr addrspace(8), i32 } @cast_null 696540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 706540f163SKrzysztof Drewniak; CHECK-NEXT: ret { ptr addrspace(8), i32 } zeroinitializer 716540f163SKrzysztof Drewniak; 726540f163SKrzysztof Drewniak ret ptr addrspace(7) addrspacecast (ptr addrspace(8) null to ptr addrspace(7)) 736540f163SKrzysztof Drewniak} 746540f163SKrzysztof Drewniak 756540f163SKrzysztof Drewniakdefine <2 x ptr addrspace(7)> @cast_vec() { 766540f163SKrzysztof Drewniak; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @cast_vec 776540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 786540f163SKrzysztof Drewniak; 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 } 796540f163SKrzysztof Drewniak; 806540f163SKrzysztof Drewniak ret <2 x ptr addrspace(7)> addrspacecast ( 816540f163SKrzysztof Drewniak <2 x ptr addrspace(8)> <ptr addrspace(8) @buf, ptr addrspace(8) null> 826540f163SKrzysztof Drewniak to <2 x ptr addrspace(7)>) 836540f163SKrzysztof Drewniak} 846540f163SKrzysztof Drewniak 856540f163SKrzysztof Drewniakdefine ptr addrspace(7) @gep() { 866540f163SKrzysztof Drewniak; CHECK-LABEL: define { ptr addrspace(8), i32 } @gep 876540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 886540f163SKrzysztof Drewniak; CHECK-NEXT: ret { ptr addrspace(8), i32 } { ptr addrspace(8) @buf, i32 36 } 896540f163SKrzysztof Drewniak; 906540f163SKrzysztof Drewniak ret ptr addrspace(7) getelementptr inbounds ( 916540f163SKrzysztof Drewniak [4 x i32], 926540f163SKrzysztof Drewniak ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)), 936540f163SKrzysztof Drewniak i64 2, i32 1) 946540f163SKrzysztof Drewniak} 956540f163SKrzysztof Drewniak 966540f163SKrzysztof Drewniakdefine <2 x ptr addrspace(7)> @gep_vector() { 976540f163SKrzysztof Drewniak; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @gep_vector 986540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 996540f163SKrzysztof Drewniak; 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> } 1006540f163SKrzysztof Drewniak; 1016540f163SKrzysztof Drewniak ret <2 x ptr addrspace(7)> getelementptr ( 1026540f163SKrzysztof Drewniak i32, 1036540f163SKrzysztof Drewniak <2 x ptr addrspace(7)> 1046540f163SKrzysztof Drewniak <ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)), 1056540f163SKrzysztof Drewniak ptr addrspace(7) null>, 1066540f163SKrzysztof Drewniak <2 x i32> <i32 3, i32 1>) 1076540f163SKrzysztof Drewniak} 1086540f163SKrzysztof Drewniak 1096540f163SKrzysztof Drewniakdefine ptr @gep_of_p7() { 1106540f163SKrzysztof Drewniak; CHECK-LABEL: define ptr @gep_of_p7 1116540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 1126540f163SKrzysztof Drewniak; CHECK-NEXT: ret ptr getelementptr inbounds (ptr addrspace(7), ptr @flat, i64 2) 1136540f163SKrzysztof Drewniak; 1146540f163SKrzysztof Drewniak ret ptr getelementptr inbounds (ptr addrspace(7), ptr @flat, i64 2) 1156540f163SKrzysztof Drewniak} 1166540f163SKrzysztof Drewniak 1176540f163SKrzysztof Drewniakdefine ptr @gep_of_p7_vector() { 1186540f163SKrzysztof Drewniak; CHECK-LABEL: define ptr @gep_of_p7_vector 1196540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 1206540f163SKrzysztof Drewniak; CHECK-NEXT: ret ptr getelementptr (<2 x ptr addrspace(7)>, ptr @flat, i64 2) 1216540f163SKrzysztof Drewniak; 1226540f163SKrzysztof Drewniak ret ptr getelementptr (<2 x ptr addrspace(7)>, ptr @flat, i64 2) 1236540f163SKrzysztof Drewniak} 1246540f163SKrzysztof Drewniak 1256540f163SKrzysztof Drewniakdefine ptr @gep_of_p7_struct() { 1266540f163SKrzysztof Drewniak; CHECK-LABEL: define ptr @gep_of_p7_struct 1276540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 1286540f163SKrzysztof Drewniak; CHECK-NEXT: ret ptr getelementptr ({ ptr addrspace(7), i32 }, ptr @flat, i64 2) 1296540f163SKrzysztof Drewniak; 1306540f163SKrzysztof Drewniak ret ptr getelementptr ({ptr addrspace(7), i32}, ptr @flat, i64 2) 1316540f163SKrzysztof Drewniak} 1326540f163SKrzysztof Drewniak 1336540f163SKrzysztof Drewniakdefine ptr addrspace(7) @gep_p7_from_p7() { 1346540f163SKrzysztof Drewniak; CHECK-LABEL: define { ptr addrspace(8), i32 } @gep_p7_from_p7 1356540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 1366540f163SKrzysztof Drewniak; CHECK-NEXT: ret { ptr addrspace(8), i32 } { ptr addrspace(8) @buf, i32 48 } 1376540f163SKrzysztof Drewniak; 1386540f163SKrzysztof Drewniak ret ptr addrspace(7) getelementptr (ptr addrspace(7), 1396540f163SKrzysztof Drewniak ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)), 1406540f163SKrzysztof Drewniak i64 2) 1416540f163SKrzysztof Drewniak} 1426540f163SKrzysztof Drewniak 1436540f163SKrzysztof Drewniakdefine i160 @ptrtoint() { 1446540f163SKrzysztof Drewniak; CHECK-LABEL: define i160 @ptrtoint 1456540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 146*6c01011dSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = shl nuw i160 ptrtoint (ptr addrspace(8) @buf to i160), 32 147*6c01011dSNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = or i160 [[TMP1]], 12 148*6c01011dSNikita Popov; CHECK-NEXT: ret i160 [[TMP2]] 1496540f163SKrzysztof Drewniak; 1506540f163SKrzysztof Drewniak ret i160 ptrtoint( 1516540f163SKrzysztof Drewniak ptr addrspace(7) getelementptr( 1526540f163SKrzysztof Drewniak i32, ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)), 1536540f163SKrzysztof Drewniak i32 3) to i160) 1546540f163SKrzysztof Drewniak} 1556540f163SKrzysztof Drewniak 1566540f163SKrzysztof Drewniakdefine i256 @ptrtoint_long() { 1576540f163SKrzysztof Drewniak; CHECK-LABEL: define i256 @ptrtoint_long 1586540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 159*6c01011dSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = shl nuw nsw i256 ptrtoint (ptr addrspace(8) @buf to i256), 32 160*6c01011dSNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = or i256 [[TMP1]], 12 161*6c01011dSNikita Popov; CHECK-NEXT: ret i256 [[TMP2]] 1626540f163SKrzysztof Drewniak; 1636540f163SKrzysztof Drewniak ret i256 ptrtoint( 1646540f163SKrzysztof Drewniak ptr addrspace(7) getelementptr( 1656540f163SKrzysztof Drewniak i32, ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)), 1666540f163SKrzysztof Drewniak i32 3) to i256) 1676540f163SKrzysztof Drewniak} 1686540f163SKrzysztof Drewniak 1696540f163SKrzysztof Drewniakdefine i64 @ptrtoint_short() { 1706540f163SKrzysztof Drewniak; CHECK-LABEL: define i64 @ptrtoint_short 1716540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 172*6c01011dSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = shl i64 ptrtoint (ptr addrspace(8) @buf to i64), 32 173*6c01011dSNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = or i64 [[TMP1]], 12 174*6c01011dSNikita Popov; CHECK-NEXT: ret i64 [[TMP2]] 1756540f163SKrzysztof Drewniak; 1766540f163SKrzysztof Drewniak ret i64 ptrtoint( 1776540f163SKrzysztof Drewniak ptr addrspace(7) getelementptr( 1786540f163SKrzysztof Drewniak i32, ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)), 1796540f163SKrzysztof Drewniak i32 3) to i64) 1806540f163SKrzysztof Drewniak} 1816540f163SKrzysztof Drewniak 1826540f163SKrzysztof Drewniakdefine i32 @ptrtoint_very_short() { 1836540f163SKrzysztof Drewniak; CHECK-LABEL: define i32 @ptrtoint_very_short 1846540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 1855ef768d2SNikita Popov; CHECK-NEXT: ret i32 12 1866540f163SKrzysztof Drewniak; 1876540f163SKrzysztof Drewniak ret i32 ptrtoint( 1886540f163SKrzysztof Drewniak ptr addrspace(7) getelementptr( 1896540f163SKrzysztof Drewniak i32, ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)), 1906540f163SKrzysztof Drewniak i32 3) to i32) 1916540f163SKrzysztof Drewniak} 1926540f163SKrzysztof Drewniak 1936540f163SKrzysztof Drewniak 1946540f163SKrzysztof Drewniakdefine <2 x i160> @ptrtoint_vec() { 1956540f163SKrzysztof Drewniak; CHECK-LABEL: define <2 x i160> @ptrtoint_vec 1966540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 1976540f163SKrzysztof Drewniak; CHECK-NEXT: ret <2 x i160> zeroinitializer 1986540f163SKrzysztof Drewniak; 1996540f163SKrzysztof Drewniak ret <2 x i160> ptrtoint (<2 x ptr addrspace(7)> zeroinitializer to <2 x i160>) 2006540f163SKrzysztof Drewniak} 2016540f163SKrzysztof Drewniak 2026540f163SKrzysztof Drewniakdefine ptr addrspace(7) @inttoptr() { 2036540f163SKrzysztof Drewniak; CHECK-LABEL: define { ptr addrspace(8), i32 } @inttoptr 2046540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 2056540f163SKrzysztof Drewniak; CHECK-NEXT: ret { ptr addrspace(8), i32 } zeroinitializer 2066540f163SKrzysztof Drewniak; 2076540f163SKrzysztof Drewniak ret ptr addrspace(7) inttoptr (i160 0 to ptr addrspace(7)) 2086540f163SKrzysztof Drewniak} 2096540f163SKrzysztof Drewniak 2106540f163SKrzysztof Drewniakdefine <2 x ptr addrspace(7)> @inttoptr_vec() { 2116540f163SKrzysztof Drewniak; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @inttoptr_vec 2126540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 2136540f163SKrzysztof Drewniak; CHECK-NEXT: ret { <2 x ptr addrspace(8)>, <2 x i32> } { <2 x ptr addrspace(8)> zeroinitializer, <2 x i32> <i32 1, i32 2> } 2146540f163SKrzysztof Drewniak; 2156540f163SKrzysztof Drewniak ret <2 x ptr addrspace(7)> inttoptr (<2 x i160> <i160 1, i160 2> to <2 x ptr addrspace(7)>) 2166540f163SKrzysztof Drewniak} 2176540f163SKrzysztof Drewniak 2186540f163SKrzysztof Drewniakdefine i32 @fancy_zero() { 2196540f163SKrzysztof Drewniak; CHECK-LABEL: define i32 @fancy_zero 2206540f163SKrzysztof Drewniak; CHECK-SAME: () #[[ATTR0]] { 2215ef768d2SNikita Popov; CHECK-NEXT: ret i32 0 2226540f163SKrzysztof Drewniak; 2236540f163SKrzysztof Drewniak ret i32 ptrtoint ( 2246540f163SKrzysztof Drewniak ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)) 2256540f163SKrzysztof Drewniak to i32) 2266540f163SKrzysztof Drewniak} 227