19a22aeb9SMatt Arsenault; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2*9e9907f1SFangrui Song; RUN: llc -global-isel -mtriple=amdgcn -mcpu=fiji -stop-after=irtranslator -o - %s | FileCheck %s 39a22aeb9SMatt Arsenault 49a22aeb9SMatt Arsenaultdeclare align(8) dereferenceable(8) ptr @declared_with_ret_deref() #0 59a22aeb9SMatt Arsenaultdeclare align(8) ptr @unknown_decl() #0 69a22aeb9SMatt Arsenaultdeclare align(8) dereferenceable(4) ptr @declared_with_ret_deref4() #0 79a22aeb9SMatt Arsenaultdeclare align(8) dereferenceable_or_null(8) ptr @declared_with_ret_deref_or_null() #0 89a22aeb9SMatt Arsenaultdeclare align(8) nonnull ptr @nonnull_decl() #0 99a22aeb9SMatt Arsenaultdeclare align(8) dereferenceable_or_null(4) ptr @declared_with_ret_deref_or_null4() #0 109a22aeb9SMatt Arsenault 119a22aeb9SMatt Arsenault; Should have dereferenceable on mem operand 129a22aeb9SMatt Arsenaultdefine i64 @load_deref_declaration_only() { 139a22aeb9SMatt Arsenault ; CHECK-LABEL: name: load_deref_declaration_only 149a22aeb9SMatt Arsenault ; CHECK: bb.1 (%ir-block.0): 159a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $scc 169a22aeb9SMatt Arsenault ; CHECK-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @declared_with_ret_deref 179a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $sgpr0_sgpr1_sgpr2_sgpr3 189a22aeb9SMatt Arsenault ; CHECK-NEXT: $sgpr0_sgpr1_sgpr2_sgpr3 = COPY [[COPY]](<4 x s32>) 19ef38e6d9SSameer Sahasrabuddhe ; CHECK-NEXT: $sgpr30_sgpr31 = noconvergent G_SI_CALL [[GV]](p0), @declared_with_ret_deref, csr_amdgpu, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit-def $vgpr0, implicit-def $vgpr1 209a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr0 219a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr1 229a22aeb9SMatt Arsenault ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 239a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $scc 249a22aeb9SMatt Arsenault ; CHECK-NEXT: [[ASSERT_ALIGN:%[0-9]+]]:_(p0) = G_ASSERT_ALIGN [[MV]], 8 259a22aeb9SMatt Arsenault ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[ASSERT_ALIGN]](p0) :: (dereferenceable load (s64) from %ir.call) 269a22aeb9SMatt Arsenault ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[LOAD]](s64) 279a22aeb9SMatt Arsenault ; CHECK-NEXT: $vgpr0 = COPY [[UV]](s32) 289a22aeb9SMatt Arsenault ; CHECK-NEXT: $vgpr1 = COPY [[UV1]](s32) 299a22aeb9SMatt Arsenault ; CHECK-NEXT: SI_RETURN implicit $vgpr0, implicit $vgpr1 309a22aeb9SMatt Arsenault %call = call ptr @declared_with_ret_deref() 319a22aeb9SMatt Arsenault %load = load i64, ptr %call, align 8 329a22aeb9SMatt Arsenault ret i64 %load 339a22aeb9SMatt Arsenault} 349a22aeb9SMatt Arsenault 359a22aeb9SMatt Arsenault; No dereferenceable on mem operand 369a22aeb9SMatt Arsenaultdefine i64 @load_deref_unknown_decl() { 379a22aeb9SMatt Arsenault ; CHECK-LABEL: name: load_deref_unknown_decl 389a22aeb9SMatt Arsenault ; CHECK: bb.1 (%ir-block.0): 399a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $scc 409a22aeb9SMatt Arsenault ; CHECK-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @unknown_decl 419a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $sgpr0_sgpr1_sgpr2_sgpr3 429a22aeb9SMatt Arsenault ; CHECK-NEXT: $sgpr0_sgpr1_sgpr2_sgpr3 = COPY [[COPY]](<4 x s32>) 43ef38e6d9SSameer Sahasrabuddhe ; CHECK-NEXT: $sgpr30_sgpr31 = noconvergent G_SI_CALL [[GV]](p0), @unknown_decl, csr_amdgpu, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit-def $vgpr0, implicit-def $vgpr1 449a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr0 459a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr1 469a22aeb9SMatt Arsenault ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 479a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $scc 489a22aeb9SMatt Arsenault ; CHECK-NEXT: [[ASSERT_ALIGN:%[0-9]+]]:_(p0) = G_ASSERT_ALIGN [[MV]], 8 499a22aeb9SMatt Arsenault ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[ASSERT_ALIGN]](p0) :: (load (s64) from %ir.call) 509a22aeb9SMatt Arsenault ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[LOAD]](s64) 519a22aeb9SMatt Arsenault ; CHECK-NEXT: $vgpr0 = COPY [[UV]](s32) 529a22aeb9SMatt Arsenault ; CHECK-NEXT: $vgpr1 = COPY [[UV1]](s32) 539a22aeb9SMatt Arsenault ; CHECK-NEXT: SI_RETURN implicit $vgpr0, implicit $vgpr1 549a22aeb9SMatt Arsenault %call = call ptr @unknown_decl() 559a22aeb9SMatt Arsenault %load = load i64, ptr %call, align 8 569a22aeb9SMatt Arsenault ret i64 %load 579a22aeb9SMatt Arsenault} 589a22aeb9SMatt Arsenault 599a22aeb9SMatt Arsenault; Should have dereferenceable on mem operand 609a22aeb9SMatt Arsenaultdefine i64 @load_deref_callsite_only() { 619a22aeb9SMatt Arsenault ; CHECK-LABEL: name: load_deref_callsite_only 629a22aeb9SMatt Arsenault ; CHECK: bb.1 (%ir-block.0): 639a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $scc 649a22aeb9SMatt Arsenault ; CHECK-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @unknown_decl 659a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $sgpr0_sgpr1_sgpr2_sgpr3 669a22aeb9SMatt Arsenault ; CHECK-NEXT: $sgpr0_sgpr1_sgpr2_sgpr3 = COPY [[COPY]](<4 x s32>) 67ef38e6d9SSameer Sahasrabuddhe ; CHECK-NEXT: $sgpr30_sgpr31 = noconvergent G_SI_CALL [[GV]](p0), @unknown_decl, csr_amdgpu, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit-def $vgpr0, implicit-def $vgpr1 689a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr0 699a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr1 709a22aeb9SMatt Arsenault ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 719a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $scc 729a22aeb9SMatt Arsenault ; CHECK-NEXT: [[ASSERT_ALIGN:%[0-9]+]]:_(p0) = G_ASSERT_ALIGN [[MV]], 8 739a22aeb9SMatt Arsenault ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[ASSERT_ALIGN]](p0) :: (dereferenceable load (s64) from %ir.call) 749a22aeb9SMatt Arsenault ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[LOAD]](s64) 759a22aeb9SMatt Arsenault ; CHECK-NEXT: $vgpr0 = COPY [[UV]](s32) 769a22aeb9SMatt Arsenault ; CHECK-NEXT: $vgpr1 = COPY [[UV1]](s32) 779a22aeb9SMatt Arsenault ; CHECK-NEXT: SI_RETURN implicit $vgpr0, implicit $vgpr1 789a22aeb9SMatt Arsenault %call = call dereferenceable(8) ptr @unknown_decl() 799a22aeb9SMatt Arsenault %load = load i64, ptr %call, align 8 809a22aeb9SMatt Arsenault ret i64 %load 819a22aeb9SMatt Arsenault} 829a22aeb9SMatt Arsenault 839a22aeb9SMatt Arsenault; Both loads should have effective dereferenceable(8) since the 849a22aeb9SMatt Arsenault; maximum should be used. 859a22aeb9SMatt Arsenaultdefine i64 @load_deref_maxmimum_callsite_declaration_only() { 869a22aeb9SMatt Arsenault ; CHECK-LABEL: name: load_deref_maxmimum_callsite_declaration_only 879a22aeb9SMatt Arsenault ; CHECK: bb.1 (%ir-block.0): 889a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $scc 899a22aeb9SMatt Arsenault ; CHECK-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @declared_with_ret_deref 909a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $sgpr0_sgpr1_sgpr2_sgpr3 919a22aeb9SMatt Arsenault ; CHECK-NEXT: $sgpr0_sgpr1_sgpr2_sgpr3 = COPY [[COPY]](<4 x s32>) 92ef38e6d9SSameer Sahasrabuddhe ; CHECK-NEXT: $sgpr30_sgpr31 = noconvergent G_SI_CALL [[GV]](p0), @declared_with_ret_deref, csr_amdgpu, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit-def $vgpr0, implicit-def $vgpr1 939a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr0 949a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr1 959a22aeb9SMatt Arsenault ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 969a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $scc 979a22aeb9SMatt Arsenault ; CHECK-NEXT: [[ASSERT_ALIGN:%[0-9]+]]:_(p0) = G_ASSERT_ALIGN [[MV]], 8 989a22aeb9SMatt Arsenault ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[ASSERT_ALIGN]](p0) :: (dereferenceable load (s64) from %ir.call0) 999a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $scc 1009a22aeb9SMatt Arsenault ; CHECK-NEXT: [[GV1:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @declared_with_ret_deref4 1019a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(<4 x s32>) = COPY $sgpr0_sgpr1_sgpr2_sgpr3 1029a22aeb9SMatt Arsenault ; CHECK-NEXT: $sgpr0_sgpr1_sgpr2_sgpr3 = COPY [[COPY3]](<4 x s32>) 103ef38e6d9SSameer Sahasrabuddhe ; CHECK-NEXT: $sgpr30_sgpr31 = noconvergent G_SI_CALL [[GV1]](p0), @declared_with_ret_deref4, csr_amdgpu, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit-def $vgpr0, implicit-def $vgpr1 1049a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY4:%[0-9]+]]:_(s32) = COPY $vgpr0 1059a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY5:%[0-9]+]]:_(s32) = COPY $vgpr1 1069a22aeb9SMatt Arsenault ; CHECK-NEXT: [[MV1:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY4]](s32), [[COPY5]](s32) 1079a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $scc 1089a22aeb9SMatt Arsenault ; CHECK-NEXT: [[ASSERT_ALIGN1:%[0-9]+]]:_(p0) = G_ASSERT_ALIGN [[MV1]], 8 1099a22aeb9SMatt Arsenault ; CHECK-NEXT: [[LOAD1:%[0-9]+]]:_(s64) = G_LOAD [[ASSERT_ALIGN1]](p0) :: (dereferenceable load (s64) from %ir.call1) 1109a22aeb9SMatt Arsenault ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[LOAD]], [[LOAD1]] 1119a22aeb9SMatt Arsenault ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[ADD]](s64) 1129a22aeb9SMatt Arsenault ; CHECK-NEXT: $vgpr0 = COPY [[UV]](s32) 1139a22aeb9SMatt Arsenault ; CHECK-NEXT: $vgpr1 = COPY [[UV1]](s32) 1149a22aeb9SMatt Arsenault ; CHECK-NEXT: SI_RETURN implicit $vgpr0, implicit $vgpr1 1159a22aeb9SMatt Arsenault %call0 = call dereferenceable(4) ptr @declared_with_ret_deref() 1169a22aeb9SMatt Arsenault %load0 = load i64, ptr %call0, align 8 1179a22aeb9SMatt Arsenault %call1 = call dereferenceable(8) ptr @declared_with_ret_deref4() 1189a22aeb9SMatt Arsenault %load1 = load i64, ptr %call1, align 8 1199a22aeb9SMatt Arsenault %add = add i64 %load0, %load1 1209a22aeb9SMatt Arsenault ret i64 %add 1219a22aeb9SMatt Arsenault} 1229a22aeb9SMatt Arsenault 1239a22aeb9SMatt Arsenault; Should have deref_or_nullerenceable on mem operand 1249a22aeb9SMatt Arsenaultdefine i64 @load_deref_or_null_declaration_only() { 1259a22aeb9SMatt Arsenault ; CHECK-LABEL: name: load_deref_or_null_declaration_only 1269a22aeb9SMatt Arsenault ; CHECK: bb.1 (%ir-block.0): 1279a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $scc 1289a22aeb9SMatt Arsenault ; CHECK-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @declared_with_ret_deref_or_null 1299a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $sgpr0_sgpr1_sgpr2_sgpr3 1309a22aeb9SMatt Arsenault ; CHECK-NEXT: $sgpr0_sgpr1_sgpr2_sgpr3 = COPY [[COPY]](<4 x s32>) 131ef38e6d9SSameer Sahasrabuddhe ; CHECK-NEXT: $sgpr30_sgpr31 = noconvergent G_SI_CALL [[GV]](p0), @declared_with_ret_deref_or_null, csr_amdgpu, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit-def $vgpr0, implicit-def $vgpr1 1329a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr0 1339a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr1 1349a22aeb9SMatt Arsenault ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 1359a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $scc 1369a22aeb9SMatt Arsenault ; CHECK-NEXT: [[ASSERT_ALIGN:%[0-9]+]]:_(p0) = G_ASSERT_ALIGN [[MV]], 8 1379a22aeb9SMatt Arsenault ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[ASSERT_ALIGN]](p0) :: (dereferenceable load (s64) from %ir.call) 1389a22aeb9SMatt Arsenault ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[LOAD]](s64) 1399a22aeb9SMatt Arsenault ; CHECK-NEXT: $vgpr0 = COPY [[UV]](s32) 1409a22aeb9SMatt Arsenault ; CHECK-NEXT: $vgpr1 = COPY [[UV1]](s32) 1419a22aeb9SMatt Arsenault ; CHECK-NEXT: SI_RETURN implicit $vgpr0, implicit $vgpr1 1429a22aeb9SMatt Arsenault %call = call nonnull ptr @declared_with_ret_deref_or_null() 1439a22aeb9SMatt Arsenault %load = load i64, ptr %call, align 8 1449a22aeb9SMatt Arsenault ret i64 %load 1459a22aeb9SMatt Arsenault} 1469a22aeb9SMatt Arsenault 1479a22aeb9SMatt Arsenault; No deref_or_nullerenceable on mem operand 1489a22aeb9SMatt Arsenaultdefine i64 @load_deref_or_null_nonnull_decl() { 1499a22aeb9SMatt Arsenault ; CHECK-LABEL: name: load_deref_or_null_nonnull_decl 1509a22aeb9SMatt Arsenault ; CHECK: bb.1 (%ir-block.0): 1519a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $scc 1529a22aeb9SMatt Arsenault ; CHECK-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @nonnull_decl 1539a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $sgpr0_sgpr1_sgpr2_sgpr3 1549a22aeb9SMatt Arsenault ; CHECK-NEXT: $sgpr0_sgpr1_sgpr2_sgpr3 = COPY [[COPY]](<4 x s32>) 155ef38e6d9SSameer Sahasrabuddhe ; CHECK-NEXT: $sgpr30_sgpr31 = noconvergent G_SI_CALL [[GV]](p0), @nonnull_decl, csr_amdgpu, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit-def $vgpr0, implicit-def $vgpr1 1569a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr0 1579a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr1 1589a22aeb9SMatt Arsenault ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 1599a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $scc 1609a22aeb9SMatt Arsenault ; CHECK-NEXT: [[ASSERT_ALIGN:%[0-9]+]]:_(p0) = G_ASSERT_ALIGN [[MV]], 8 1619a22aeb9SMatt Arsenault ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[ASSERT_ALIGN]](p0) :: (load (s64) from %ir.call) 1629a22aeb9SMatt Arsenault ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[LOAD]](s64) 1639a22aeb9SMatt Arsenault ; CHECK-NEXT: $vgpr0 = COPY [[UV]](s32) 1649a22aeb9SMatt Arsenault ; CHECK-NEXT: $vgpr1 = COPY [[UV1]](s32) 1659a22aeb9SMatt Arsenault ; CHECK-NEXT: SI_RETURN implicit $vgpr0, implicit $vgpr1 1669a22aeb9SMatt Arsenault %call = call ptr @nonnull_decl() 1679a22aeb9SMatt Arsenault %load = load i64, ptr %call, align 8 1689a22aeb9SMatt Arsenault ret i64 %load 1699a22aeb9SMatt Arsenault} 1709a22aeb9SMatt Arsenault 1719a22aeb9SMatt Arsenault; Should have deref_or_nullerenceable on mem operand 1729a22aeb9SMatt Arsenaultdefine i64 @load_deref_or_null_callsite_only() { 1739a22aeb9SMatt Arsenault ; CHECK-LABEL: name: load_deref_or_null_callsite_only 1749a22aeb9SMatt Arsenault ; CHECK: bb.1 (%ir-block.0): 1759a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $scc 1769a22aeb9SMatt Arsenault ; CHECK-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @nonnull_decl 1779a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $sgpr0_sgpr1_sgpr2_sgpr3 1789a22aeb9SMatt Arsenault ; CHECK-NEXT: $sgpr0_sgpr1_sgpr2_sgpr3 = COPY [[COPY]](<4 x s32>) 179ef38e6d9SSameer Sahasrabuddhe ; CHECK-NEXT: $sgpr30_sgpr31 = noconvergent G_SI_CALL [[GV]](p0), @nonnull_decl, csr_amdgpu, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit-def $vgpr0, implicit-def $vgpr1 1809a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr0 1819a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr1 1829a22aeb9SMatt Arsenault ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 1839a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $scc 1849a22aeb9SMatt Arsenault ; CHECK-NEXT: [[ASSERT_ALIGN:%[0-9]+]]:_(p0) = G_ASSERT_ALIGN [[MV]], 8 1859a22aeb9SMatt Arsenault ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[ASSERT_ALIGN]](p0) :: (dereferenceable load (s64) from %ir.call) 1869a22aeb9SMatt Arsenault ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[LOAD]](s64) 1879a22aeb9SMatt Arsenault ; CHECK-NEXT: $vgpr0 = COPY [[UV]](s32) 1889a22aeb9SMatt Arsenault ; CHECK-NEXT: $vgpr1 = COPY [[UV1]](s32) 1899a22aeb9SMatt Arsenault ; CHECK-NEXT: SI_RETURN implicit $vgpr0, implicit $vgpr1 1909a22aeb9SMatt Arsenault %call = call dereferenceable_or_null(8) ptr @nonnull_decl() 1919a22aeb9SMatt Arsenault %load = load i64, ptr %call, align 8 1929a22aeb9SMatt Arsenault ret i64 %load 1939a22aeb9SMatt Arsenault} 1949a22aeb9SMatt Arsenault 1959a22aeb9SMatt Arsenault; Both loads should have effective deref_or_nullerenceable(8) since the 1969a22aeb9SMatt Arsenault; maximum should be used. 1979a22aeb9SMatt Arsenaultdefine i64 @load_deref_or_null_maxmimum_callsite_declaration_only() { 1989a22aeb9SMatt Arsenault ; CHECK-LABEL: name: load_deref_or_null_maxmimum_callsite_declaration_only 1999a22aeb9SMatt Arsenault ; CHECK: bb.1 (%ir-block.0): 2009a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $scc 2019a22aeb9SMatt Arsenault ; CHECK-NEXT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @declared_with_ret_deref_or_null 2029a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $sgpr0_sgpr1_sgpr2_sgpr3 2039a22aeb9SMatt Arsenault ; CHECK-NEXT: $sgpr0_sgpr1_sgpr2_sgpr3 = COPY [[COPY]](<4 x s32>) 204ef38e6d9SSameer Sahasrabuddhe ; CHECK-NEXT: $sgpr30_sgpr31 = noconvergent G_SI_CALL [[GV]](p0), @declared_with_ret_deref_or_null, csr_amdgpu, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit-def $vgpr0, implicit-def $vgpr1 2059a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr0 2069a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr1 2079a22aeb9SMatt Arsenault ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 2089a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $scc 2099a22aeb9SMatt Arsenault ; CHECK-NEXT: [[ASSERT_ALIGN:%[0-9]+]]:_(p0) = G_ASSERT_ALIGN [[MV]], 8 2109a22aeb9SMatt Arsenault ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[ASSERT_ALIGN]](p0) :: (dereferenceable load (s64) from %ir.call0) 2119a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $scc 2129a22aeb9SMatt Arsenault ; CHECK-NEXT: [[GV1:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @declared_with_ret_deref_or_null4 2139a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(<4 x s32>) = COPY $sgpr0_sgpr1_sgpr2_sgpr3 2149a22aeb9SMatt Arsenault ; CHECK-NEXT: $sgpr0_sgpr1_sgpr2_sgpr3 = COPY [[COPY3]](<4 x s32>) 215ef38e6d9SSameer Sahasrabuddhe ; CHECK-NEXT: $sgpr30_sgpr31 = noconvergent G_SI_CALL [[GV1]](p0), @declared_with_ret_deref_or_null4, csr_amdgpu, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit-def $vgpr0, implicit-def $vgpr1 2169a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY4:%[0-9]+]]:_(s32) = COPY $vgpr0 2179a22aeb9SMatt Arsenault ; CHECK-NEXT: [[COPY5:%[0-9]+]]:_(s32) = COPY $vgpr1 2189a22aeb9SMatt Arsenault ; CHECK-NEXT: [[MV1:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY4]](s32), [[COPY5]](s32) 2199a22aeb9SMatt Arsenault ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $scc 2209a22aeb9SMatt Arsenault ; CHECK-NEXT: [[ASSERT_ALIGN1:%[0-9]+]]:_(p0) = G_ASSERT_ALIGN [[MV1]], 8 2219a22aeb9SMatt Arsenault ; CHECK-NEXT: [[LOAD1:%[0-9]+]]:_(s64) = G_LOAD [[ASSERT_ALIGN1]](p0) :: (dereferenceable load (s64) from %ir.call1) 2229a22aeb9SMatt Arsenault ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[LOAD]], [[LOAD1]] 2239a22aeb9SMatt Arsenault ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[ADD]](s64) 2249a22aeb9SMatt Arsenault ; CHECK-NEXT: $vgpr0 = COPY [[UV]](s32) 2259a22aeb9SMatt Arsenault ; CHECK-NEXT: $vgpr1 = COPY [[UV1]](s32) 2269a22aeb9SMatt Arsenault ; CHECK-NEXT: SI_RETURN implicit $vgpr0, implicit $vgpr1 2279a22aeb9SMatt Arsenault %call0 = call dereferenceable_or_null(4) nonnull ptr @declared_with_ret_deref_or_null() 2289a22aeb9SMatt Arsenault %load0 = load i64, ptr %call0, align 8 2299a22aeb9SMatt Arsenault %call1 = call dereferenceable_or_null(8) nonnull ptr @declared_with_ret_deref_or_null4() 2309a22aeb9SMatt Arsenault %load1 = load i64, ptr %call1, align 8 2319a22aeb9SMatt Arsenault %add = add i64 %load0, %load1 2329a22aeb9SMatt Arsenault ret i64 %add 2339a22aeb9SMatt Arsenault} 2349a22aeb9SMatt Arsenault 2359a22aeb9SMatt Arsenaultattributes #0 = { "amdgpu-no-completion-action" "amdgpu-no-default-queue" "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-lds-kernel-id" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-queue-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" } 236