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 noundef [[TMP0]], i32 noundef [[TMP1]], i32 noundef 42) #[[ATTR6:[0-9]+]] 116; IS__TUNIT____-NEXT: ret void 117; 118; IS__CGSCC____: Function Attrs: nosync nounwind 119; IS__CGSCC____-LABEL: define {{[^@]+}}@level2Kernela 120; IS__CGSCC____-SAME: () #[[ATTR3:[0-9]+]] { 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 noundef [[TMP0]], i32 noundef [[TMP1]], i32 noundef [[TMP2]]) #[[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 noundef [[TMP0]], i32 noundef [[TMP1]], i32 noundef 42) #[[ATTR6]] 144; IS__TUNIT____-NEXT: ret void 145; 146; IS__CGSCC____: Function Attrs: nosync nounwind 147; IS__CGSCC____-LABEL: define {{[^@]+}}@level2Kernelb 148; IS__CGSCC____-SAME: () #[[ATTR3]] { 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 noundef [[TMP0]], i32 noundef [[TMP1]], i32 noundef [[TMP2]]) #[[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 willreturn writeonly 172; IS__CGSCC____-LABEL: define {{[^@]+}}@level2Kernelall_late 173; IS__CGSCC____-SAME: () #[[ATTR2]] { 174; IS__CGSCC____-NEXT: entry: 175; IS__CGSCC____-NEXT: store i32 1, i32* addrspacecast (i32 addrspace(3)* @UnreachableKernel to i32*), align 4 176; IS__CGSCC____-NEXT: ret void 177; 178entry: 179 store i32 1, i32 *addrspacecast (i32 addrspace(3)* @UnreachableKernel to i32*), align 4 180 ret void 181} 182 183@ReachableNonKernel = internal addrspace(3) global i32 0, align 4 184@UnreachableNonKernel = internal addrspace(3) global i32 0, align 4 185 186define dso_local void @non_kernel(i32 %C) norecurse { 187; IS__TUNIT____: Function Attrs: norecurse nosync nounwind 188; IS__TUNIT____-LABEL: define {{[^@]+}}@non_kernel 189; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR1]] { 190; IS__TUNIT____-NEXT: entry: 191; IS__TUNIT____-NEXT: call void @level1(i32 [[C]]) #[[ATTR3]] 192; IS__TUNIT____-NEXT: ret void 193; 194; IS__CGSCC____: Function Attrs: norecurse nosync nounwind 195; IS__CGSCC____-LABEL: define {{[^@]+}}@non_kernel 196; IS__CGSCC____-SAME: (i32 [[C:%.*]]) #[[ATTR1]] { 197; IS__CGSCC____-NEXT: entry: 198; IS__CGSCC____-NEXT: call void @level1(i32 [[C]]) #[[ATTR4]] 199; IS__CGSCC____-NEXT: ret void 200; 201entry: 202 call void @level1(i32 %C) 203 ret void 204} 205 206define internal void @level1(i32 %C) { 207; IS__TUNIT____: Function Attrs: norecurse nosync nounwind 208; IS__TUNIT____-LABEL: define {{[^@]+}}@level1 209; IS__TUNIT____-SAME: (i32 [[C:%.*]]) #[[ATTR1]] { 210; IS__TUNIT____-NEXT: entry: 211; IS__TUNIT____-NEXT: [[LOCAL:%.*]] = alloca i32, align 4 212; IS__TUNIT____-NEXT: call void @level2all_early(i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[LOCAL]]) #[[ATTR4]] 213; IS__TUNIT____-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[C]], 0 214; IS__TUNIT____-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 215; IS__TUNIT____: if.then: 216; IS__TUNIT____-NEXT: call void @level2a() #[[ATTR3]] 217; IS__TUNIT____-NEXT: br label [[IF_END:%.*]] 218; IS__TUNIT____: if.else: 219; IS__TUNIT____-NEXT: call void @level2b() #[[ATTR3]] 220; IS__TUNIT____-NEXT: br label [[IF_END]] 221; IS__TUNIT____: if.end: 222; IS__TUNIT____-NEXT: call void @level2all_late(i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[LOCAL]]) #[[ATTR5]] 223; IS__TUNIT____-NEXT: ret void 224; 225; IS__CGSCC____: Function Attrs: norecurse nosync nounwind 226; IS__CGSCC____-LABEL: define {{[^@]+}}@level1 227; IS__CGSCC____-SAME: (i32 [[C:%.*]]) #[[ATTR1]] { 228; IS__CGSCC____-NEXT: entry: 229; IS__CGSCC____-NEXT: [[LOCAL:%.*]] = alloca i32, align 4 230; IS__CGSCC____-NEXT: call void @level2all_early(i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[LOCAL]]) #[[ATTR5]] 231; IS__CGSCC____-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[C]], 0 232; IS__CGSCC____-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 233; IS__CGSCC____: if.then: 234; IS__CGSCC____-NEXT: call void @level2a(i32* noalias nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOCAL]]) #[[ATTR4]] 235; IS__CGSCC____-NEXT: br label [[IF_END:%.*]] 236; IS__CGSCC____: if.else: 237; IS__CGSCC____-NEXT: call void @level2b(i32* noalias nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[LOCAL]]) #[[ATTR4]] 238; IS__CGSCC____-NEXT: br label [[IF_END]] 239; IS__CGSCC____: if.end: 240; IS__CGSCC____-NEXT: call void @level2all_late(i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[LOCAL]]) #[[ATTR6]] 241; IS__CGSCC____-NEXT: ret void 242; 243entry: 244 %local = alloca i32 245 call void @level2all_early(i32* %local) 246 %tobool = icmp ne i32 %C, 0 247 br i1 %tobool, label %if.then, label %if.else 248 249if.then: ; preds = %entry 250 call void @level2a(i32* %local) 251 br label %if.end 252 253if.else: ; preds = %entry 254 call void @level2b(i32* %local) 255 br label %if.end 256 257if.end: ; preds = %if.else, %if.then 258 call void @level2all_late(i32* %local) 259 ret void 260} 261 262define internal void @level2all_early(i32* %addr) { 263; IS__TUNIT____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly 264; IS__TUNIT____-LABEL: define {{[^@]+}}@level2all_early 265; IS__TUNIT____-SAME: (i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] { 266; IS__TUNIT____-NEXT: entry: 267; IS__TUNIT____-NEXT: store i32 1, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 268; IS__TUNIT____-NEXT: ret void 269; 270; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly 271; IS__CGSCC____-LABEL: define {{[^@]+}}@level2all_early 272; IS__CGSCC____-SAME: (i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] { 273; IS__CGSCC____-NEXT: entry: 274; IS__CGSCC____-NEXT: store i32 1, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 275; IS__CGSCC____-NEXT: store i32 17, i32* [[ADDR]], align 4 276; IS__CGSCC____-NEXT: ret void 277; 278entry: 279 store i32 1, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 280 store i32 17, i32* %addr, align 4 281 ret void 282} 283 284define internal void @level2a(i32* %addr) { 285; IS__TUNIT____: Function Attrs: norecurse nosync nounwind 286; IS__TUNIT____-LABEL: define {{[^@]+}}@level2a 287; IS__TUNIT____-SAME: () #[[ATTR1]] { 288; IS__TUNIT____-NEXT: entry: 289; IS__TUNIT____-NEXT: [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 290; IS__TUNIT____-NEXT: [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 291; IS__TUNIT____-NEXT: call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 17) #[[ATTR6]] 292; IS__TUNIT____-NEXT: ret void 293; 294; IS__CGSCC____: Function Attrs: nosync nounwind 295; IS__CGSCC____-LABEL: define {{[^@]+}}@level2a 296; IS__CGSCC____-SAME: (i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR3]] { 297; IS__CGSCC____-NEXT: entry: 298; IS__CGSCC____-NEXT: [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 299; IS__CGSCC____-NEXT: [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 300; IS__CGSCC____-NEXT: [[QQQQ2:%.*]] = load i32, i32* [[ADDR]], align 4 301; IS__CGSCC____-NEXT: call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 [[QQQQ2]]) #[[ATTR4]] 302; IS__CGSCC____-NEXT: ret void 303; 304entry: 305 %0 = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 306 %1 = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 307 %qqqq2 = load i32, i32* %addr 308 call void @use(i32 %0, i32 %1, i32 %qqqq2) 309 ret void 310} 311 312define internal void @level2b(i32* %addr) { 313; IS__TUNIT____: Function Attrs: norecurse nosync nounwind 314; IS__TUNIT____-LABEL: define {{[^@]+}}@level2b 315; IS__TUNIT____-SAME: () #[[ATTR1]] { 316; IS__TUNIT____-NEXT: entry: 317; IS__TUNIT____-NEXT: [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 318; IS__TUNIT____-NEXT: [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 319; IS__TUNIT____-NEXT: call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 17) #[[ATTR6]] 320; IS__TUNIT____-NEXT: ret void 321; 322; IS__CGSCC____: Function Attrs: nosync nounwind 323; IS__CGSCC____-LABEL: define {{[^@]+}}@level2b 324; IS__CGSCC____-SAME: (i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR3]] { 325; IS__CGSCC____-NEXT: entry: 326; IS__CGSCC____-NEXT: [[TMP0:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 327; IS__CGSCC____-NEXT: [[TMP1:%.*]] = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 328; IS__CGSCC____-NEXT: [[TMP2:%.*]] = load i32, i32* [[ADDR]], align 4 329; IS__CGSCC____-NEXT: call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 [[TMP2]]) #[[ATTR4]] 330; IS__CGSCC____-NEXT: ret void 331; 332entry: 333 %0 = load i32, i32* addrspacecast (i32 addrspace(3)* @ReachableNonKernel to i32*), align 4 334 %1 = load i32, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 335 %2 = load i32, i32* %addr 336 call void @use(i32 %0, i32 %1, i32 %2) 337 ret void 338} 339 340define internal void @level2all_late(i32* %addr) { 341; IS__TUNIT____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly 342; IS__TUNIT____-LABEL: define {{[^@]+}}@level2all_late 343; IS__TUNIT____-SAME: (i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] { 344; IS__TUNIT____-NEXT: entry: 345; IS__TUNIT____-NEXT: store i32 1, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 346; IS__TUNIT____-NEXT: ret void 347; 348; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind willreturn writeonly 349; IS__CGSCC____-LABEL: define {{[^@]+}}@level2all_late 350; IS__CGSCC____-SAME: (i32* noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] { 351; IS__CGSCC____-NEXT: entry: 352; IS__CGSCC____-NEXT: store i32 1, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 353; IS__CGSCC____-NEXT: store i32 5, i32* [[ADDR]], align 4 354; IS__CGSCC____-NEXT: ret void 355; 356entry: 357 store i32 1, i32* addrspacecast (i32 addrspace(3)* @UnreachableNonKernel to i32*), align 4 358 store i32 5, i32* %addr, align 4 359 ret void 360} 361 362declare dso_local void @use(i32, i32, i32) nosync norecurse nounwind 363 364;. 365; IS__TUNIT____: attributes #[[ATTR0]] = { norecurse nosync nounwind "kernel" } 366; IS__TUNIT____: attributes #[[ATTR1]] = { norecurse nosync nounwind } 367; IS__TUNIT____: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn writeonly } 368; IS__TUNIT____: attributes #[[ATTR3]] = { nosync nounwind } 369; IS__TUNIT____: attributes #[[ATTR4]] = { nofree nosync nounwind willreturn writeonly } 370; IS__TUNIT____: attributes #[[ATTR5]] = { nosync nounwind writeonly } 371; IS__TUNIT____: attributes #[[ATTR6]] = { nounwind } 372;. 373; IS__CGSCC____: attributes #[[ATTR0]] = { norecurse nosync nounwind "kernel" } 374; IS__CGSCC____: attributes #[[ATTR1]] = { norecurse nosync nounwind } 375; IS__CGSCC____: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn writeonly } 376; IS__CGSCC____: attributes #[[ATTR3]] = { nosync nounwind } 377; IS__CGSCC____: attributes #[[ATTR4]] = { nounwind } 378; IS__CGSCC____: attributes #[[ATTR5]] = { nounwind willreturn writeonly } 379; IS__CGSCC____: attributes #[[ATTR6]] = { nounwind writeonly } 380;. 381