1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals 2; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM 3; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM 4; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM 5; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM 6 7target triple = "amdgcn-amd-amdhsa" 8 9@ReachableKernel = internal addrspace(3) global i32 3, align 4 10@UnreachableKernel = internal addrspace(3) global i32 42, align 4 11@ReachableKernelAS0 = internal global i32 7, align 4 12 13;. 14; CHECK: @[[REACHABLEKERNEL:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global i32 3, align 4 15; CHECK: @[[UNREACHABLEKERNEL:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global i32 42, align 4 16; CHECK: @[[REACHABLEKERNELAS0:[a-zA-Z0-9_$"\\.-]+]] = internal global i32 7, align 4 17; CHECK: @[[REACHABLENONKERNEL:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global i32 0, align 4 18; CHECK: @[[UNREACHABLENONKERNEL:[a-zA-Z0-9_$"\\.-]+]] = internal addrspace(3) global i32 0, align 4 19;. 20define dso_local void @kernel(i32 %C) norecurse "kernel" { 21; IS__TUNIT____: Function Attrs: norecurse nosync nounwind 22; IS__TUNIT____-LABEL: define {{[^@]+}}@kernel 23; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR0:[0-9]+]] { 24; IS__TUNIT____-NEXT: entry: 25; IS__TUNIT____-NEXT: call void @level1Kernel(i32 [[C]]) #[[ATTR3:[0-9]+]] 26; IS__TUNIT____-NEXT: ret void 27; 28; IS__CGSCC____: Function Attrs: norecurse nosync nounwind 29; IS__CGSCC____-LABEL: define {{[^@]+}}@kernel 30; IS__CGSCC____-SAME: (i32 [[C:%.*]]) #[[ATTR0:[0-9]+]] { 31; IS__CGSCC____-NEXT: entry: 32; IS__CGSCC____-NEXT: call void @level1Kernel(i32 [[C]]) #[[ATTR4:[0-9]+]] 33; IS__CGSCC____-NEXT: ret void 34; 35entry: 36 call void @level1Kernel(i32 %C) 37 ret void 38} 39 40define internal void @level1Kernel(i32 %C) { 41; IS__TUNIT____: Function Attrs: norecurse nosync nounwind 42; IS__TUNIT____-LABEL: define {{[^@]+}}@level1Kernel 43; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR1:[0-9]+]] { 44; IS__TUNIT____-NEXT: entry: 45; IS__TUNIT____-NEXT: call void @level2Kernelall_early() #[[ATTR4:[0-9]+]] 46; IS__TUNIT____-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[C]], 0 47; IS__TUNIT____-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 48; IS__TUNIT____: if.then: 49; IS__TUNIT____-NEXT: call void @level2Kernela() #[[ATTR3]] 50; IS__TUNIT____-NEXT: br label [[IF_END:%.*]] 51; IS__TUNIT____: if.else: 52; IS__TUNIT____-NEXT: call void @level2Kernelb() #[[ATTR3]] 53; IS__TUNIT____-NEXT: br label [[IF_END]] 54; IS__TUNIT____: if.end: 55; IS__TUNIT____-NEXT: call void @level2Kernelall_late() #[[ATTR5:[0-9]+]] 56; IS__TUNIT____-NEXT: ret void 57; 58; IS__CGSCC____: Function Attrs: norecurse nosync nounwind 59; IS__CGSCC____-LABEL: define {{[^@]+}}@level1Kernel 60; IS__CGSCC____-SAME: (i32 [[C:%.*]]) #[[ATTR1:[0-9]+]] { 61; IS__CGSCC____-NEXT: entry: 62; IS__CGSCC____-NEXT: call void @level2Kernelall_early() #[[ATTR5:[0-9]+]] 63; IS__CGSCC____-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[C]], 0 64; IS__CGSCC____-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 65; IS__CGSCC____: if.then: 66; IS__CGSCC____-NEXT: call void @level2Kernela() #[[ATTR4]] 67; IS__CGSCC____-NEXT: br label [[IF_END:%.*]] 68; IS__CGSCC____: if.else: 69; IS__CGSCC____-NEXT: call void @level2Kernelb() #[[ATTR4]] 70; IS__CGSCC____-NEXT: br label [[IF_END]] 71; IS__CGSCC____: if.end: 72; IS__CGSCC____-NEXT: call void @level2Kernelall_late() #[[ATTR6:[0-9]+]] 73; IS__CGSCC____-NEXT: ret void 74; 75entry: 76 call void @level2Kernelall_early() 77 %tobool = icmp ne i32 %C, 0 78 br i1 %tobool, label %if.then, label %if.else 79 80if.then: ; preds = %entry 81 call void @level2Kernela() 82 br label %if.end 83 84if.else: ; preds = %entry 85 call void @level2Kernelb() 86 br label %if.end 87 88if.end: ; preds = %if.else, %if.then 89 call void @level2Kernelall_late() 90 ret void 91} 92 93define internal void @level2Kernelall_early() { 94; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly 95; CHECK-LABEL: define {{[^@]+}}@level2Kernelall_early 96; CHECK-SAME: () #[[ATTR2:[0-9]+]] { 97; CHECK-NEXT: entry: 98; CHECK-NEXT: store i32 1, i32* @ReachableKernelAS0, align 4 99; CHECK-NEXT: store i32 1, i32* addrspacecast (i32 addrspace(3)* @ReachableKernel to i32*), align 4 100; CHECK-NEXT: ret void 101; 102entry: 103 store i32 1, i32* @ReachableKernelAS0, align 4 104 store i32 1, i32* addrspacecast (i32 addrspace(3)* @ReachableKernel to i32*), align 4 105 ret void 106} 107 108define internal void @level2Kernela() { 109; IS__TUNIT____: Function Attrs: norecurse nosync nounwind 110; IS__TUNIT____-LABEL: define {{[^@]+}}@level2Kernela 111; IS__TUNIT____-SAME: () #[[ATTR1]] { 112; IS__TUNIT____-NEXT: entry: 113; IS__TUNIT____-NEXT: [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableKernel to i32*), align 4 114; IS__TUNIT____-NEXT: [[TMP1:%.*]] = load i32, i32* @ReachableKernelAS0, align 4 115; IS__TUNIT____-NEXT: call void @use(i32 [[TMP0]], i32 [[TMP1]], i32 noundef 42) #[[ATTR6:[0-9]+]] 116; IS__TUNIT____-NEXT: ret void 117; 118; IS__CGSCC____: Function Attrs: norecurse nosync nounwind 119; IS__CGSCC____-LABEL: define {{[^@]+}}@level2Kernela 120; IS__CGSCC____-SAME: () #[[ATTR1]] { 121; IS__CGSCC____-NEXT: entry: 122; IS__CGSCC____-NEXT: [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableKernel to i32*), align 4 123; IS__CGSCC____-NEXT: [[TMP1:%.*]] = load i32, i32* @ReachableKernelAS0, align 4 124; IS__CGSCC____-NEXT: [[TMP2:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableKernel to i32*), align 4 125; IS__CGSCC____-NEXT: call void @use(i32 [[TMP0]], i32 [[TMP1]], i32 noundef 42) #[[ATTR4]] 126; IS__CGSCC____-NEXT: ret void 127; 128entry: 129 %0 = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableKernel to i32*), align 4 130 %1 = load i32, i32* @ReachableKernelAS0, align 4 131 %2 = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableKernel to i32*), align 4 132 call void @use(i32 %0, i32 %1, i32 %2) 133 ret void 134} 135 136define internal void @level2Kernelb() { 137; IS__TUNIT____: Function Attrs: norecurse nosync nounwind 138; IS__TUNIT____-LABEL: define {{[^@]+}}@level2Kernelb 139; IS__TUNIT____-SAME: () #[[ATTR1]] { 140; IS__TUNIT____-NEXT: entry: 141; IS__TUNIT____-NEXT: [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableKernel to i32*), align 4 142; IS__TUNIT____-NEXT: [[TMP1:%.*]] = load i32, i32* @ReachableKernelAS0, align 4 143; IS__TUNIT____-NEXT: call void @use(i32 [[TMP0]], i32 [[TMP1]], i32 noundef 42) #[[ATTR6]] 144; IS__TUNIT____-NEXT: ret void 145; 146; IS__CGSCC____: Function Attrs: norecurse nosync nounwind 147; IS__CGSCC____-LABEL: define {{[^@]+}}@level2Kernelb 148; IS__CGSCC____-SAME: () #[[ATTR1]] { 149; IS__CGSCC____-NEXT: entry: 150; IS__CGSCC____-NEXT: [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableKernel to i32*), align 4 151; IS__CGSCC____-NEXT: [[TMP1:%.*]] = load i32, i32* @ReachableKernelAS0, align 4 152; IS__CGSCC____-NEXT: [[TMP2:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableKernel to i32*), align 4 153; IS__CGSCC____-NEXT: call void @use(i32 [[TMP0]], i32 [[TMP1]], i32 noundef 42) #[[ATTR4]] 154; IS__CGSCC____-NEXT: ret void 155; 156entry: 157 %0 = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableKernel to i32*), align 4 158 %1 = load i32, i32* @ReachableKernelAS0, align 4 159 %2 = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableKernel to i32*), align 4 160 call void @use(i32 %0, i32 %1, i32 %2) 161 ret void 162} 163 164define internal void @level2Kernelall_late() { 165; IS__TUNIT____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly 166; IS__TUNIT____-LABEL: define {{[^@]+}}@level2Kernelall_late 167; IS__TUNIT____-SAME: () #[[ATTR2]] { 168; IS__TUNIT____-NEXT: entry: 169; IS__TUNIT____-NEXT: ret void 170; 171; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn 172; IS__CGSCC____-LABEL: define {{[^@]+}}@level2Kernelall_late 173; IS__CGSCC____-SAME: () #[[ATTR3:[0-9]+]] { 174; IS__CGSCC____-NEXT: entry: 175; IS__CGSCC____-NEXT: ret void 176; 177entry: 178 store i32 1, i32 *addrspacecast (i32 addrspace(3)* @UnreachableKernel to i32*), align 4 179 ret void 180} 181 182@ReachableNonKernel = internal addrspace(3) global i32 0, align 4 183@UnreachableNonKernel = internal addrspace(3) global i32 0, align 4 184 185define dso_local void @non_kernel(i32 %C) norecurse { 186; IS__TUNIT____: Function Attrs: norecurse nosync nounwind 187; IS__TUNIT____-LABEL: define {{[^@]+}}@non_kernel 188; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR1]] { 189; IS__TUNIT____-NEXT: entry: 190; IS__TUNIT____-NEXT: call void @level1(i32 [[C]]) #[[ATTR3]] 191; IS__TUNIT____-NEXT: ret void 192; 193; IS__CGSCC____: Function Attrs: norecurse nosync nounwind 194; IS__CGSCC____-LABEL: define {{[^@]+}}@non_kernel 195; IS__CGSCC____-SAME: (i32 [[C:%.*]]) #[[ATTR1]] { 196; IS__CGSCC____-NEXT: entry: 197; IS__CGSCC____-NEXT: call void @level1(i32 [[C]]) #[[ATTR4]] 198; IS__CGSCC____-NEXT: ret void 199; 200entry: 201 call void @level1(i32 %C) 202 ret void 203} 204 205define internal void @level1(i32 %C) { 206; IS__TUNIT____: Function Attrs: norecurse nosync nounwind 207; IS__TUNIT____-LABEL: define {{[^@]+}}@level1 208; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR1]] { 209; IS__TUNIT____-NEXT: entry: 210; IS__TUNIT____-NEXT: [[LOCAL:%.*]] = alloca i32, align 4 211; IS__TUNIT____-NEXT: call void @level2all_early(i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[LOCAL]]) #[[ATTR4]] 212; IS__TUNIT____-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[C]], 0 213; IS__TUNIT____-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 214; IS__TUNIT____: if.then: 215; IS__TUNIT____-NEXT: call void @level2a() #[[ATTR3]] 216; IS__TUNIT____-NEXT: br label [[IF_END:%.*]] 217; IS__TUNIT____: if.else: 218; IS__TUNIT____-NEXT: call void @level2b() #[[ATTR3]] 219; IS__TUNIT____-NEXT: br label [[IF_END]] 220; IS__TUNIT____: if.end: 221; IS__TUNIT____-NEXT: call void @level2all_late(i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[LOCAL]]) #[[ATTR5]] 222; IS__TUNIT____-NEXT: ret void 223; 224; IS__CGSCC_OPM: Function Attrs: norecurse nosync nounwind 225; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@level1 226; IS__CGSCC_OPM-SAME: (i32 [[C:%.*]]) #[[ATTR1]] { 227; IS__CGSCC_OPM-NEXT: entry: 228; IS__CGSCC_OPM-NEXT: [[LOCAL:%.*]] = alloca i32, align 4 229; IS__CGSCC_OPM-NEXT: call void @level2all_early(i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) undef) #[[ATTR5]] 230; IS__CGSCC_OPM-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[C]], 0 231; IS__CGSCC_OPM-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 232; IS__CGSCC_OPM: if.then: 233; IS__CGSCC_OPM-NEXT: call void @level2a(i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) undef) #[[ATTR4]] 234; IS__CGSCC_OPM-NEXT: br label [[IF_END:%.*]] 235; IS__CGSCC_OPM: if.else: 236; IS__CGSCC_OPM-NEXT: call void @level2b(i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) undef) #[[ATTR4]] 237; IS__CGSCC_OPM-NEXT: br label [[IF_END]] 238; IS__CGSCC_OPM: if.end: 239; IS__CGSCC_OPM-NEXT: call void @level2all_late(i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) undef) #[[ATTR7:[0-9]+]] 240; IS__CGSCC_OPM-NEXT: ret void 241; 242; IS__CGSCC_NPM: Function Attrs: norecurse nosync nounwind 243; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@level1 244; IS__CGSCC_NPM-SAME: (i32 [[C:%.*]]) #[[ATTR1]] { 245; IS__CGSCC_NPM-NEXT: entry: 246; IS__CGSCC_NPM-NEXT: [[LOCAL:%.*]] = alloca i32, align 4 247; IS__CGSCC_NPM-NEXT: call void @level2all_early(i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) undef) #[[ATTR5]] 248; IS__CGSCC_NPM-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[C]], 0 249; IS__CGSCC_NPM-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 250; IS__CGSCC_NPM: if.then: 251; IS__CGSCC_NPM-NEXT: call void @level2a(i32 undef) #[[ATTR4]] 252; IS__CGSCC_NPM-NEXT: br label [[IF_END:%.*]] 253; IS__CGSCC_NPM: if.else: 254; IS__CGSCC_NPM-NEXT: call void @level2b(i32 undef) #[[ATTR7:[0-9]+]] 255; IS__CGSCC_NPM-NEXT: br label [[IF_END]] 256; IS__CGSCC_NPM: if.end: 257; IS__CGSCC_NPM-NEXT: call void @level2all_late(i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) undef) #[[ATTR8:[0-9]+]] 258; IS__CGSCC_NPM-NEXT: ret void 259; 260entry: 261 %local = alloca i32 262 call void @level2all_early(i32* %local) 263 %tobool = icmp ne i32 %C, 0 264 br i1 %tobool, label %if.then, label %if.else 265 266if.then: ; preds = %entry 267 call void @level2a(i32* %local) 268 br label %if.end 269 270if.else: ; preds = %entry 271 call void @level2b(i32* %local) 272 br label %if.end 273 274if.end: ; preds = %if.else, %if.then 275 call void @level2all_late(i32* %local) 276 ret void 277} 278 279define internal void @level2all_early(i32* %addr) { 280; IS__TUNIT____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly 281; IS__TUNIT____-LABEL: define {{[^@]+}}@level2all_early 282; IS__TUNIT____-SAME: (i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] { 283; IS__TUNIT____-NEXT: entry: 284; IS__TUNIT____-NEXT: store i32 1, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 285; IS__TUNIT____-NEXT: ret void 286; 287; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly 288; IS__CGSCC____-LABEL: define {{[^@]+}}@level2all_early 289; IS__CGSCC____-SAME: (i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] { 290; IS__CGSCC____-NEXT: entry: 291; IS__CGSCC____-NEXT: store i32 1, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 292; IS__CGSCC____-NEXT: ret void 293; 294entry: 295 store i32 1, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 296 store i32 17, i32* %addr, align 4 297 ret void 298} 299 300define internal void @level2a(i32* %addr) { 301; IS__TUNIT____: Function Attrs: norecurse nosync nounwind 302; IS__TUNIT____-LABEL: define {{[^@]+}}@level2a 303; IS__TUNIT____-SAME: () #[[ATTR1]] { 304; IS__TUNIT____-NEXT: entry: 305; IS__TUNIT____-NEXT: [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 306; IS__TUNIT____-NEXT: [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 307; IS__TUNIT____-NEXT: call void @use(i32 [[TMP0]], i32 [[TMP1]], i32 17) #[[ATTR6]] 308; IS__TUNIT____-NEXT: ret void 309; 310; IS__CGSCC_OPM: Function Attrs: norecurse nosync nounwind 311; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@level2a 312; IS__CGSCC_OPM-SAME: (i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR1]] { 313; IS__CGSCC_OPM-NEXT: entry: 314; IS__CGSCC_OPM-NEXT: [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 315; IS__CGSCC_OPM-NEXT: [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 316; IS__CGSCC_OPM-NEXT: [[TMP2:%.*]] = load i32, i32* undef, align 4 317; IS__CGSCC_OPM-NEXT: call void @use(i32 [[TMP0]], i32 [[TMP1]], i32 17) #[[ATTR4]] 318; IS__CGSCC_OPM-NEXT: ret void 319; 320; IS__CGSCC_NPM: Function Attrs: norecurse nosync nounwind 321; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@level2a 322; IS__CGSCC_NPM-SAME: (i32 [[TMP0:%.*]]) #[[ATTR1]] { 323; IS__CGSCC_NPM-NEXT: entry: 324; IS__CGSCC_NPM-NEXT: [[ADDR_PRIV:%.*]] = alloca i32, align 4 325; IS__CGSCC_NPM-NEXT: [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 326; IS__CGSCC_NPM-NEXT: [[TMP2:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 327; IS__CGSCC_NPM-NEXT: [[TMP3:%.*]] = load i32, i32* [[ADDR_PRIV]], align 4 328; IS__CGSCC_NPM-NEXT: call void @use(i32 [[TMP1]], i32 [[TMP2]], i32 17) #[[ATTR4]] 329; IS__CGSCC_NPM-NEXT: ret void 330; 331entry: 332 %0 = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 333 %1 = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 334 %2 = load i32, i32* %addr 335 call void @use(i32 %0, i32 %1, i32 %2) 336 ret void 337} 338 339define internal void @level2b(i32* %addr) { 340; IS__TUNIT____: Function Attrs: norecurse nosync nounwind 341; IS__TUNIT____-LABEL: define {{[^@]+}}@level2b 342; IS__TUNIT____-SAME: () #[[ATTR1]] { 343; IS__TUNIT____-NEXT: entry: 344; IS__TUNIT____-NEXT: [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 345; IS__TUNIT____-NEXT: [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 346; IS__TUNIT____-NEXT: call void @use(i32 [[TMP0]], i32 [[TMP1]], i32 17) #[[ATTR6]] 347; IS__TUNIT____-NEXT: ret void 348; 349; IS__CGSCC_OPM: Function Attrs: norecurse nosync nounwind 350; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@level2b 351; IS__CGSCC_OPM-SAME: (i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR1]] { 352; IS__CGSCC_OPM-NEXT: entry: 353; IS__CGSCC_OPM-NEXT: [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 354; IS__CGSCC_OPM-NEXT: [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 355; IS__CGSCC_OPM-NEXT: [[TMP2:%.*]] = load i32, i32* undef, align 4 356; IS__CGSCC_OPM-NEXT: call void @use(i32 [[TMP0]], i32 [[TMP1]], i32 17) #[[ATTR4]] 357; IS__CGSCC_OPM-NEXT: ret void 358; 359; IS__CGSCC_NPM: Function Attrs: norecurse nosync nounwind 360; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@level2b 361; IS__CGSCC_NPM-SAME: (i32 [[TMP0:%.*]]) #[[ATTR1]] { 362; IS__CGSCC_NPM-NEXT: entry: 363; IS__CGSCC_NPM-NEXT: [[ADDR_PRIV:%.*]] = alloca i32, align 4 364; IS__CGSCC_NPM-NEXT: [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 365; IS__CGSCC_NPM-NEXT: [[TMP2:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 366; IS__CGSCC_NPM-NEXT: [[TMP3:%.*]] = load i32, i32* [[ADDR_PRIV]], align 4 367; IS__CGSCC_NPM-NEXT: call void @use(i32 [[TMP1]], i32 [[TMP2]], i32 17) #[[ATTR4]] 368; IS__CGSCC_NPM-NEXT: ret void 369; 370entry: 371 %0 = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 372 %1 = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 373 %2 = load i32, i32* %addr 374 call void @use(i32 %0, i32 %1, i32 %2) 375 ret void 376} 377 378define internal void @level2all_late(i32* %addr) { 379; IS__TUNIT____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly 380; IS__TUNIT____-LABEL: define {{[^@]+}}@level2all_late 381; IS__TUNIT____-SAME: (i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] { 382; IS__TUNIT____-NEXT: entry: 383; IS__TUNIT____-NEXT: store i32 1, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 384; IS__TUNIT____-NEXT: ret void 385; 386; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly 387; IS__CGSCC____-LABEL: define {{[^@]+}}@level2all_late 388; IS__CGSCC____-SAME: (i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] { 389; IS__CGSCC____-NEXT: entry: 390; IS__CGSCC____-NEXT: store i32 1, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 391; IS__CGSCC____-NEXT: ret void 392; 393entry: 394 store i32 1, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 395 store i32 5, i32* %addr, align 4 396 ret void 397} 398 399declare dso_local void @use(i32, i32, i32) nosync norecurse nounwind 400 401;. 402; IS__TUNIT____: attributes #[[ATTR0]] = { norecurse nosync nounwind "kernel" } 403; IS__TUNIT____: attributes #[[ATTR1]] = { norecurse nosync nounwind } 404; IS__TUNIT____: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn writeonly } 405; IS__TUNIT____: attributes #[[ATTR3]] = { nosync nounwind } 406; IS__TUNIT____: attributes #[[ATTR4]] = { nofree nosync nounwind willreturn writeonly } 407; IS__TUNIT____: attributes #[[ATTR5]] = { nosync nounwind writeonly } 408; IS__TUNIT____: attributes #[[ATTR6]] = { nounwind } 409;. 410; IS__CGSCC_OPM: attributes #[[ATTR0]] = { norecurse nosync nounwind "kernel" } 411; IS__CGSCC_OPM: attributes #[[ATTR1]] = { norecurse nosync nounwind } 412; IS__CGSCC_OPM: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn writeonly } 413; IS__CGSCC_OPM: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind readnone willreturn } 414; IS__CGSCC_OPM: attributes #[[ATTR4]] = { nounwind } 415; IS__CGSCC_OPM: attributes #[[ATTR5]] = { nounwind willreturn writeonly } 416; IS__CGSCC_OPM: attributes #[[ATTR6]] = { nounwind readnone } 417; IS__CGSCC_OPM: attributes #[[ATTR7]] = { nounwind writeonly } 418;. 419; IS__CGSCC_NPM: attributes #[[ATTR0]] = { norecurse nosync nounwind "kernel" } 420; IS__CGSCC_NPM: attributes #[[ATTR1]] = { norecurse nosync nounwind } 421; IS__CGSCC_NPM: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn writeonly } 422; IS__CGSCC_NPM: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind readnone willreturn } 423; IS__CGSCC_NPM: attributes #[[ATTR4]] = { nounwind } 424; IS__CGSCC_NPM: attributes #[[ATTR5]] = { nounwind willreturn writeonly } 425; IS__CGSCC_NPM: attributes #[[ATTR6]] = { nounwind readnone } 426; IS__CGSCC_NPM: attributes #[[ATTR7]] = { nosync nounwind } 427; IS__CGSCC_NPM: attributes #[[ATTR8]] = { nosync nounwind writeonly } 428;. 429