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