xref: /llvm-project/llvm/test/Transforms/InstCombine/NVPTX/isspacep.ll (revision 29441e4f5fa5f5c7709f7cf180815ba97f611297)
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