18129b6b5SArtem Belevich; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 28129b6b5SArtem Belevich; RUN: opt < %s -passes=instcombine -mtriple=nvptx64-nvidia-cuda -S | FileCheck %s 38129b6b5SArtem Belevichtarget datalayout = "e-i64:64-i128:128-v16:16-v32:32-n16:32:64" 48129b6b5SArtem Belevichtarget triple = "nvptx64-nvidia-cuda" 58129b6b5SArtem Belevich 68129b6b5SArtem Belevich; Source data in different AS. 78129b6b5SArtem Belevich@shared_data = dso_local addrspace(3) global i32 undef, align 4 88129b6b5SArtem Belevich@global_data = dso_local addrspace(1) externally_initialized global i32 0, align 4 98129b6b5SArtem Belevich@const_data = dso_local addrspace(4) externally_initialized constant i32 3, align 4 108129b6b5SArtem Belevich 118129b6b5SArtem Belevich; Results get stored here. 128129b6b5SArtem Belevich@gen = dso_local addrspace(1) externally_initialized global i8 0, align 1 138129b6b5SArtem Belevich@g1 = dso_local addrspace(1) externally_initialized global i8 0, align 1 148129b6b5SArtem Belevich@g2 = dso_local addrspace(1) externally_initialized global i8 0, align 1 158129b6b5SArtem Belevich@s1 = dso_local addrspace(1) externally_initialized global i8 0, align 1 168129b6b5SArtem Belevich@s2 = dso_local addrspace(1) externally_initialized global i8 0, align 1 178129b6b5SArtem Belevich@c1 = dso_local addrspace(1) externally_initialized global i8 0, align 1 188129b6b5SArtem Belevich@c2 = dso_local addrspace(1) externally_initialized global i8 0, align 1 198129b6b5SArtem Belevich@l = dso_local addrspace(1) externally_initialized global i8 0, align 1 208129b6b5SArtem Belevich 218129b6b5SArtem Belevichdeclare i1 @llvm.nvvm.isspacep.global(ptr nocapture) 228129b6b5SArtem Belevichdeclare i1 @llvm.nvvm.isspacep.shared(ptr nocapture) 238129b6b5SArtem Belevichdeclare i1 @llvm.nvvm.isspacep.const(ptr nocapture) 248129b6b5SArtem Belevichdeclare i1 @llvm.nvvm.isspacep.local(ptr nocapture) 258129b6b5SArtem Belevich 268129b6b5SArtem Belevichdefine dso_local void @check_global(ptr nocapture noundef readnone %out, ptr nocapture noundef readnone %genp, 278129b6b5SArtem Belevich; CHECK-LABEL: define dso_local void @check_global( 28*29441e4fSNikita Popov; CHECK-SAME: ptr noundef readnone captures(none) [[OUT:%.*]], ptr noundef readnone captures(none) [[GENP:%.*]], ptr addrspace(1) [[GP:%.*]], ptr addrspace(3) [[SP:%.*]], ptr addrspace(4) [[CP:%.*]], ptr addrspace(5) [[LP:%.*]]) local_unnamed_addr { 298129b6b5SArtem Belevich; CHECK-NEXT: [[ENTRY:.*:]] 308129b6b5SArtem Belevich; CHECK-NEXT: [[GEN0:%.*]] = tail call i1 @llvm.nvvm.isspacep.global(ptr [[GENP]]) 318129b6b5SArtem Belevich; CHECK-NEXT: [[STOREDV:%.*]] = zext i1 [[GEN0]] to i8 328129b6b5SArtem Belevich; CHECK-NEXT: store i8 [[STOREDV]], ptr addrspacecast (ptr addrspace(1) @gen to ptr), align 1 338129b6b5SArtem Belevich; CHECK-NEXT: store i8 1, ptr addrspacecast (ptr addrspace(1) @g1 to ptr), align 1 348129b6b5SArtem Belevich; CHECK-NEXT: store i8 1, ptr addrspacecast (ptr addrspace(1) @g2 to ptr), align 1 358129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @s1 to ptr), align 1 368129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @s2 to ptr), align 1 378129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @c1 to ptr), align 1 388129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @c2 to ptr), align 1 398129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @l to ptr), align 1 408129b6b5SArtem Belevich; CHECK-NEXT: ret void 418129b6b5SArtem Belevich; 428129b6b5SArtem Belevich ptr addrspace(1) %gp, 438129b6b5SArtem Belevich ptr addrspace(3) %sp, 448129b6b5SArtem Belevich ptr addrspace(4) %cp, 458129b6b5SArtem Belevich ptr addrspace(5) %lp) local_unnamed_addr { 468129b6b5SArtem Belevichentry: 478129b6b5SArtem Belevich ; No constant folding for generic pointers of unknown origin. 488129b6b5SArtem Belevich %gen0 = tail call i1 @llvm.nvvm.isspacep.global(ptr %genp) 498129b6b5SArtem Belevich %storedv = zext i1 %gen0 to i8 508129b6b5SArtem Belevich store i8 %storedv, ptr addrspacecast (ptr addrspace(1) @gen to ptr), align 1 518129b6b5SArtem Belevich 528129b6b5SArtem Belevich %isg1 = tail call i1 @llvm.nvvm.isspacep.global(ptr addrspacecast (ptr addrspace(1) @global_data to ptr)) 538129b6b5SArtem Belevich %isg18 = zext i1 %isg1 to i8 548129b6b5SArtem Belevich store i8 %isg18, ptr addrspacecast (ptr addrspace(1) @g1 to ptr), align 1 558129b6b5SArtem Belevich 568129b6b5SArtem Belevich %gp_asc = addrspacecast ptr addrspace(1) %gp to ptr 578129b6b5SArtem Belevich %isg2 = tail call i1 @llvm.nvvm.isspacep.global(ptr %gp_asc) 588129b6b5SArtem Belevich %isg28 = zext i1 %isg2 to i8 598129b6b5SArtem Belevich store i8 %isg28, ptr addrspacecast (ptr addrspace(1) @g2 to ptr), align 1 608129b6b5SArtem Belevich 618129b6b5SArtem Belevich %iss1 = tail call i1 @llvm.nvvm.isspacep.global(ptr addrspacecast (ptr addrspace(3) @shared_data to ptr)) 628129b6b5SArtem Belevich %iss18 = zext i1 %iss1 to i8 638129b6b5SArtem Belevich store i8 %iss18, ptr addrspacecast (ptr addrspace(1) @s1 to ptr), align 1 648129b6b5SArtem Belevich 658129b6b5SArtem Belevich %sp_asc = addrspacecast ptr addrspace(3) %sp to ptr 668129b6b5SArtem Belevich %iss2 = tail call i1 @llvm.nvvm.isspacep.global(ptr %sp_asc) 678129b6b5SArtem Belevich %iss28 = zext i1 %iss2 to i8 688129b6b5SArtem Belevich store i8 %iss28, ptr addrspacecast (ptr addrspace(1) @s2 to ptr), align 1 698129b6b5SArtem Belevich 708129b6b5SArtem Belevich %isc1 = tail call i1 @llvm.nvvm.isspacep.global(ptr addrspacecast (ptr addrspace(4) @const_data to ptr)) 718129b6b5SArtem Belevich %isc18 = zext i1 %isc1 to i8 728129b6b5SArtem Belevich store i8 %isc18, ptr addrspacecast (ptr addrspace(1) @c1 to ptr), align 1 738129b6b5SArtem Belevich 748129b6b5SArtem Belevich %cp_asc = addrspacecast ptr addrspace(4) %cp to ptr 758129b6b5SArtem Belevich %isc2 = tail call i1 @llvm.nvvm.isspacep.global(ptr %cp_asc) 768129b6b5SArtem Belevich %isc28 = zext i1 %isc2 to i8 778129b6b5SArtem Belevich store i8 %isc28, ptr addrspacecast (ptr addrspace(1) @c2 to ptr), align 1 788129b6b5SArtem Belevich 798129b6b5SArtem Belevich ; Local data can't ihave a constant address, so we can't have a constant ASC expression 808129b6b5SArtem Belevich ; We can only use an ASC instruction. 818129b6b5SArtem Belevich %lp_asc = addrspacecast ptr addrspace(5) %lp to ptr 828129b6b5SArtem Belevich %isl = call i1 @llvm.nvvm.isspacep.global(ptr nonnull %lp_asc) 838129b6b5SArtem Belevich %isl8 = zext i1 %isl to i8 848129b6b5SArtem Belevich store i8 %isl8, ptr addrspacecast (ptr addrspace(1) @l to ptr), align 1 858129b6b5SArtem Belevich 868129b6b5SArtem Belevich ret void 878129b6b5SArtem Belevich} 888129b6b5SArtem Belevich 898129b6b5SArtem Belevichdefine dso_local void @check_shared(ptr nocapture noundef readnone %out, ptr nocapture noundef readnone %genp, 908129b6b5SArtem Belevich; CHECK-LABEL: define dso_local void @check_shared( 91*29441e4fSNikita Popov; CHECK-SAME: ptr noundef readnone captures(none) [[OUT:%.*]], ptr noundef readnone captures(none) [[GENP:%.*]], ptr addrspace(1) [[GP:%.*]], ptr addrspace(3) [[SP:%.*]], ptr addrspace(4) [[CP:%.*]], ptr addrspace(5) [[LP:%.*]]) local_unnamed_addr { 928129b6b5SArtem Belevich; CHECK-NEXT: [[ENTRY:.*:]] 938129b6b5SArtem Belevich; CHECK-NEXT: [[GEN0:%.*]] = tail call i1 @llvm.nvvm.isspacep.shared(ptr [[GENP]]) 948129b6b5SArtem Belevich; CHECK-NEXT: [[STOREDV:%.*]] = zext i1 [[GEN0]] to i8 958129b6b5SArtem Belevich; CHECK-NEXT: store i8 [[STOREDV]], ptr addrspacecast (ptr addrspace(1) @gen to ptr), align 1 968129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @g1 to ptr), align 1 978129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @g2 to ptr), align 1 988129b6b5SArtem Belevich; CHECK-NEXT: store i8 1, ptr addrspacecast (ptr addrspace(1) @s1 to ptr), align 1 998129b6b5SArtem Belevich; CHECK-NEXT: store i8 1, ptr addrspacecast (ptr addrspace(1) @s2 to ptr), align 1 1008129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @c1 to ptr), align 1 1018129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @c2 to ptr), align 1 1028129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @l to ptr), align 1 1038129b6b5SArtem Belevich; CHECK-NEXT: ret void 1048129b6b5SArtem Belevich; 1058129b6b5SArtem Belevich ptr addrspace(1) %gp, 1068129b6b5SArtem Belevich ptr addrspace(3) %sp, 1078129b6b5SArtem Belevich ptr addrspace(4) %cp, 1088129b6b5SArtem Belevich ptr addrspace(5) %lp) local_unnamed_addr { 1098129b6b5SArtem Belevichentry: 1108129b6b5SArtem Belevich ; No constant folding for generic pointers of unknown origin. 1118129b6b5SArtem Belevich %gen0 = tail call i1 @llvm.nvvm.isspacep.shared(ptr %genp) 1128129b6b5SArtem Belevich %storedv = zext i1 %gen0 to i8 1138129b6b5SArtem Belevich store i8 %storedv, ptr addrspacecast (ptr addrspace(1) @gen to ptr), align 1 1148129b6b5SArtem Belevich 1158129b6b5SArtem Belevich %isg1 = tail call i1 @llvm.nvvm.isspacep.shared(ptr addrspacecast (ptr addrspace(1) @global_data to ptr)) 1168129b6b5SArtem Belevich %isg18 = zext i1 %isg1 to i8 1178129b6b5SArtem Belevich store i8 %isg18, ptr addrspacecast (ptr addrspace(1) @g1 to ptr), align 1 1188129b6b5SArtem Belevich 1198129b6b5SArtem Belevich %gp_asc = addrspacecast ptr addrspace(1) %gp to ptr 1208129b6b5SArtem Belevich %isg2 = tail call i1 @llvm.nvvm.isspacep.shared(ptr %gp_asc) 1218129b6b5SArtem Belevich %isg28 = zext i1 %isg2 to i8 1228129b6b5SArtem Belevich store i8 %isg28, ptr addrspacecast (ptr addrspace(1) @g2 to ptr), align 1 1238129b6b5SArtem Belevich 1248129b6b5SArtem Belevich %iss1 = tail call i1 @llvm.nvvm.isspacep.shared(ptr addrspacecast (ptr addrspace(3) @shared_data to ptr)) 1258129b6b5SArtem Belevich %iss18 = zext i1 %iss1 to i8 1268129b6b5SArtem Belevich store i8 %iss18, ptr addrspacecast (ptr addrspace(1) @s1 to ptr), align 1 1278129b6b5SArtem Belevich 1288129b6b5SArtem Belevich %sp_asc = addrspacecast ptr addrspace(3) %sp to ptr 1298129b6b5SArtem Belevich %iss2 = tail call i1 @llvm.nvvm.isspacep.shared(ptr %sp_asc) 1308129b6b5SArtem Belevich %iss28 = zext i1 %iss2 to i8 1318129b6b5SArtem Belevich store i8 %iss28, ptr addrspacecast (ptr addrspace(1) @s2 to ptr), align 1 1328129b6b5SArtem Belevich 1338129b6b5SArtem Belevich %isc1 = tail call i1 @llvm.nvvm.isspacep.shared(ptr addrspacecast (ptr addrspace(4) @const_data to ptr)) 1348129b6b5SArtem Belevich %isc18 = zext i1 %isc1 to i8 1358129b6b5SArtem Belevich store i8 %isc18, ptr addrspacecast (ptr addrspace(1) @c1 to ptr), align 1 1368129b6b5SArtem Belevich 1378129b6b5SArtem Belevich %cp_asc = addrspacecast ptr addrspace(4) %cp to ptr 1388129b6b5SArtem Belevich %isc2 = tail call i1 @llvm.nvvm.isspacep.shared(ptr %cp_asc) 1398129b6b5SArtem Belevich %isc28 = zext i1 %isc2 to i8 1408129b6b5SArtem Belevich store i8 %isc28, ptr addrspacecast (ptr addrspace(1) @c2 to ptr), align 1 1418129b6b5SArtem Belevich 1428129b6b5SArtem Belevich ; Local data can't have a constant address, so we can't have a constant ASC expression 1438129b6b5SArtem Belevich ; We can only use an ASC instruction. 1448129b6b5SArtem Belevich %lp_asc = addrspacecast ptr addrspace(5) %lp to ptr 1458129b6b5SArtem Belevich %isl = call i1 @llvm.nvvm.isspacep.shared(ptr nonnull %lp_asc) 1468129b6b5SArtem Belevich %isl8 = zext i1 %isl to i8 1478129b6b5SArtem Belevich store i8 %isl8, ptr addrspacecast (ptr addrspace(1) @l to ptr), align 1 1488129b6b5SArtem Belevich 1498129b6b5SArtem Belevich ret void 1508129b6b5SArtem Belevich} 1518129b6b5SArtem Belevich 1528129b6b5SArtem Belevichdefine dso_local void @check_const(ptr nocapture noundef readnone %out, ptr nocapture noundef readnone %genp, 1538129b6b5SArtem Belevich; CHECK-LABEL: define dso_local void @check_const( 154*29441e4fSNikita Popov; CHECK-SAME: ptr noundef readnone captures(none) [[OUT:%.*]], ptr noundef readnone captures(none) [[GENP:%.*]], ptr addrspace(1) [[GP:%.*]], ptr addrspace(3) [[SP:%.*]], ptr addrspace(4) [[CP:%.*]], ptr addrspace(5) [[LP:%.*]]) local_unnamed_addr { 1558129b6b5SArtem Belevich; CHECK-NEXT: [[ENTRY:.*:]] 1568129b6b5SArtem Belevich; CHECK-NEXT: [[GEN0:%.*]] = tail call i1 @llvm.nvvm.isspacep.const(ptr [[GENP]]) 1578129b6b5SArtem Belevich; CHECK-NEXT: [[STOREDV:%.*]] = zext i1 [[GEN0]] to i8 1588129b6b5SArtem Belevich; CHECK-NEXT: store i8 [[STOREDV]], ptr addrspacecast (ptr addrspace(1) @gen to ptr), align 1 1598129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @g1 to ptr), align 1 1608129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @g2 to ptr), align 1 1618129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @s1 to ptr), align 1 1628129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @s2 to ptr), align 1 1638129b6b5SArtem Belevich; CHECK-NEXT: store i8 1, ptr addrspacecast (ptr addrspace(1) @c1 to ptr), align 1 1648129b6b5SArtem Belevich; CHECK-NEXT: store i8 1, ptr addrspacecast (ptr addrspace(1) @c2 to ptr), align 1 1658129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @l to ptr), align 1 1668129b6b5SArtem Belevich; CHECK-NEXT: ret void 1678129b6b5SArtem Belevich; 1688129b6b5SArtem Belevich ptr addrspace(1) %gp, 1698129b6b5SArtem Belevich ptr addrspace(3) %sp, 1708129b6b5SArtem Belevich ptr addrspace(4) %cp, 1718129b6b5SArtem Belevich ptr addrspace(5) %lp) local_unnamed_addr { 1728129b6b5SArtem Belevichentry: 1738129b6b5SArtem Belevich ; No constant folding for generic pointers of unknown origin. 1748129b6b5SArtem Belevich %gen0 = tail call i1 @llvm.nvvm.isspacep.const(ptr %genp) 1758129b6b5SArtem Belevich %storedv = zext i1 %gen0 to i8 1768129b6b5SArtem Belevich store i8 %storedv, ptr addrspacecast (ptr addrspace(1) @gen to ptr), align 1 1778129b6b5SArtem Belevich 1788129b6b5SArtem Belevich %isg1 = tail call i1 @llvm.nvvm.isspacep.const(ptr addrspacecast (ptr addrspace(1) @global_data to ptr)) 1798129b6b5SArtem Belevich %isg18 = zext i1 %isg1 to i8 1808129b6b5SArtem Belevich store i8 %isg18, ptr addrspacecast (ptr addrspace(1) @g1 to ptr), align 1 1818129b6b5SArtem Belevich 1828129b6b5SArtem Belevich %gp_asc = addrspacecast ptr addrspace(1) %gp to ptr 1838129b6b5SArtem Belevich %isg2 = tail call i1 @llvm.nvvm.isspacep.const(ptr %gp_asc) 1848129b6b5SArtem Belevich %isg28 = zext i1 %isg2 to i8 1858129b6b5SArtem Belevich store i8 %isg28, ptr addrspacecast (ptr addrspace(1) @g2 to ptr), align 1 1868129b6b5SArtem Belevich 1878129b6b5SArtem Belevich %iss1 = tail call i1 @llvm.nvvm.isspacep.const(ptr addrspacecast (ptr addrspace(3) @shared_data to ptr)) 1888129b6b5SArtem Belevich %iss18 = zext i1 %iss1 to i8 1898129b6b5SArtem Belevich store i8 %iss18, ptr addrspacecast (ptr addrspace(1) @s1 to ptr), align 1 1908129b6b5SArtem Belevich 1918129b6b5SArtem Belevich %sp_asc = addrspacecast ptr addrspace(3) %sp to ptr 1928129b6b5SArtem Belevich %iss2 = tail call i1 @llvm.nvvm.isspacep.const(ptr %sp_asc) 1938129b6b5SArtem Belevich %iss28 = zext i1 %iss2 to i8 1948129b6b5SArtem Belevich store i8 %iss28, ptr addrspacecast (ptr addrspace(1) @s2 to ptr), align 1 1958129b6b5SArtem Belevich 1968129b6b5SArtem Belevich %isc1 = tail call i1 @llvm.nvvm.isspacep.const(ptr addrspacecast (ptr addrspace(4) @const_data to ptr)) 1978129b6b5SArtem Belevich %isc18 = zext i1 %isc1 to i8 1988129b6b5SArtem Belevich store i8 %isc18, ptr addrspacecast (ptr addrspace(1) @c1 to ptr), align 1 1998129b6b5SArtem Belevich 2008129b6b5SArtem Belevich %cp_asc = addrspacecast ptr addrspace(4) %cp to ptr 2018129b6b5SArtem Belevich %isc2 = tail call i1 @llvm.nvvm.isspacep.const(ptr %cp_asc) 2028129b6b5SArtem Belevich %isc28 = zext i1 %isc2 to i8 2038129b6b5SArtem Belevich store i8 %isc28, ptr addrspacecast (ptr addrspace(1) @c2 to ptr), align 1 2048129b6b5SArtem Belevich 2058129b6b5SArtem Belevich ; Local data can't have a constant address, so we can't have a constant ASC expression 2068129b6b5SArtem Belevich ; We can only use an ASC instruction. 2078129b6b5SArtem Belevich %lp_asc = addrspacecast ptr addrspace(5) %lp to ptr 2088129b6b5SArtem Belevich %isl = call i1 @llvm.nvvm.isspacep.const(ptr nonnull %lp_asc) 2098129b6b5SArtem Belevich %isl8 = zext i1 %isl to i8 2108129b6b5SArtem Belevich store i8 %isl8, ptr addrspacecast (ptr addrspace(1) @l to ptr), align 1 2118129b6b5SArtem Belevich 2128129b6b5SArtem Belevich ret void 2138129b6b5SArtem Belevich} 2148129b6b5SArtem Belevich 2158129b6b5SArtem Belevichdefine dso_local void @check_local(ptr nocapture noundef readnone %out, ptr nocapture noundef readnone %genp, 2168129b6b5SArtem Belevich; CHECK-LABEL: define dso_local void @check_local( 217*29441e4fSNikita Popov; CHECK-SAME: ptr noundef readnone captures(none) [[OUT:%.*]], ptr noundef readnone captures(none) [[GENP:%.*]], ptr addrspace(1) [[GP:%.*]], ptr addrspace(3) [[SP:%.*]], ptr addrspace(4) [[CP:%.*]], ptr addrspace(5) [[LP:%.*]]) local_unnamed_addr { 2188129b6b5SArtem Belevich; CHECK-NEXT: [[ENTRY:.*:]] 2198129b6b5SArtem Belevich; CHECK-NEXT: [[GEN0:%.*]] = tail call i1 @llvm.nvvm.isspacep.local(ptr [[GENP]]) 2208129b6b5SArtem Belevich; CHECK-NEXT: [[STOREDV:%.*]] = zext i1 [[GEN0]] to i8 2218129b6b5SArtem Belevich; CHECK-NEXT: store i8 [[STOREDV]], ptr addrspacecast (ptr addrspace(1) @gen to ptr), align 1 2228129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @g1 to ptr), align 1 2238129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @g2 to ptr), align 1 2248129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @s1 to ptr), align 1 2258129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @s2 to ptr), align 1 2268129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @c1 to ptr), align 1 2278129b6b5SArtem Belevich; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @c2 to ptr), align 1 2288129b6b5SArtem Belevich; CHECK-NEXT: store i8 1, ptr addrspacecast (ptr addrspace(1) @l to ptr), align 1 2298129b6b5SArtem Belevich; CHECK-NEXT: ret void 2308129b6b5SArtem Belevich; 2318129b6b5SArtem Belevich ptr addrspace(1) %gp, 2328129b6b5SArtem Belevich ptr addrspace(3) %sp, 2338129b6b5SArtem Belevich ptr addrspace(4) %cp, 2348129b6b5SArtem Belevich ptr addrspace(5) %lp) local_unnamed_addr { 2358129b6b5SArtem Belevichentry: 2368129b6b5SArtem Belevich ; No constant folding for generic pointers of unknown origin. 2378129b6b5SArtem Belevich %gen0 = tail call i1 @llvm.nvvm.isspacep.local(ptr %genp) 2388129b6b5SArtem Belevich %storedv = zext i1 %gen0 to i8 2398129b6b5SArtem Belevich store i8 %storedv, ptr addrspacecast (ptr addrspace(1) @gen to ptr), align 1 2408129b6b5SArtem Belevich 2418129b6b5SArtem Belevich %isg1 = tail call i1 @llvm.nvvm.isspacep.local(ptr addrspacecast (ptr addrspace(1) @global_data to ptr)) 2428129b6b5SArtem Belevich %isg18 = zext i1 %isg1 to i8 2438129b6b5SArtem Belevich store i8 %isg18, ptr addrspacecast (ptr addrspace(1) @g1 to ptr), align 1 2448129b6b5SArtem Belevich 2458129b6b5SArtem Belevich %gp_asc = addrspacecast ptr addrspace(1) %gp to ptr 2468129b6b5SArtem Belevich %isg2 = tail call i1 @llvm.nvvm.isspacep.local(ptr %gp_asc) 2478129b6b5SArtem Belevich %isg28 = zext i1 %isg2 to i8 2488129b6b5SArtem Belevich store i8 %isg28, ptr addrspacecast (ptr addrspace(1) @g2 to ptr), align 1 2498129b6b5SArtem Belevich 2508129b6b5SArtem Belevich %iss1 = tail call i1 @llvm.nvvm.isspacep.local(ptr addrspacecast (ptr addrspace(3) @shared_data to ptr)) 2518129b6b5SArtem Belevich %iss18 = zext i1 %iss1 to i8 2528129b6b5SArtem Belevich store i8 %iss18, ptr addrspacecast (ptr addrspace(1) @s1 to ptr), align 1 2538129b6b5SArtem Belevich 2548129b6b5SArtem Belevich %sp_asc = addrspacecast ptr addrspace(3) %sp to ptr 2558129b6b5SArtem Belevich %iss2 = tail call i1 @llvm.nvvm.isspacep.local(ptr %sp_asc) 2568129b6b5SArtem Belevich %iss28 = zext i1 %iss2 to i8 2578129b6b5SArtem Belevich store i8 %iss28, ptr addrspacecast (ptr addrspace(1) @s2 to ptr), align 1 2588129b6b5SArtem Belevich 2598129b6b5SArtem Belevich %isc1 = tail call i1 @llvm.nvvm.isspacep.local(ptr addrspacecast (ptr addrspace(4) @const_data to ptr)) 2608129b6b5SArtem Belevich %isc18 = zext i1 %isc1 to i8 2618129b6b5SArtem Belevich store i8 %isc18, ptr addrspacecast (ptr addrspace(1) @c1 to ptr), align 1 2628129b6b5SArtem Belevich 2638129b6b5SArtem Belevich %cp_asc = addrspacecast ptr addrspace(4) %cp to ptr 2648129b6b5SArtem Belevich %isc2 = tail call i1 @llvm.nvvm.isspacep.local(ptr %cp_asc) 2658129b6b5SArtem Belevich %isc28 = zext i1 %isc2 to i8 2668129b6b5SArtem Belevich store i8 %isc28, ptr addrspacecast (ptr addrspace(1) @c2 to ptr), align 1 2678129b6b5SArtem Belevich 2688129b6b5SArtem Belevich ; Local data can't have a constant address, so we can't have a constant ASC expression 2698129b6b5SArtem Belevich ; We can only use an ASC instruction. 2708129b6b5SArtem Belevich %lp_asc = addrspacecast ptr addrspace(5) %lp to ptr 2718129b6b5SArtem Belevich %isl = call i1 @llvm.nvvm.isspacep.local(ptr nonnull %lp_asc) 2728129b6b5SArtem Belevich %isl8 = zext i1 %isl to i8 2738129b6b5SArtem Belevich store i8 %isl8, ptr addrspacecast (ptr addrspace(1) @l to ptr), align 1 2748129b6b5SArtem Belevich 2758129b6b5SArtem Belevich ret void 2768129b6b5SArtem Belevich} 2778129b6b5SArtem Belevich 278