455 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals2; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT3; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC4 5target triple = "amdgcn-amd-amdhsa"6 7%struct.ident_t = type { i32, i32, i32, i32, ptr }8@ReachableKernel = internal addrspace(3) global i32 3, align 49@UnreachableKernel = internal addrspace(3) global i32 42, align 410@ReachableKernelAS0 = internal global i32 7, align 411@AS3OneKernelAtATime = internal addrspace(3) global i32 42, align 412 13;.14; CHECK: @ReachableKernel = internal addrspace(3) global i32 3, align 415; CHECK: @UnreachableKernel = internal addrspace(3) global i32 42, align 416; CHECK: @ReachableKernelAS0 = internal global i32 7, align 417; CHECK: @AS3OneKernelAtATime = internal addrspace(3) global i32 42, align 418; CHECK: @ReachableNonKernel = internal addrspace(3) global i32 0, align 419; CHECK: @UnreachableNonKernel = internal addrspace(3) global i32 0, align 420;.21define dso_local void @kernel(i32 %C) norecurse "kernel" {22; TUNIT: Function Attrs: norecurse nosync nounwind23; TUNIT-LABEL: define {{[^@]+}}@kernel24; TUNIT-SAME: (i32 [[C:%.*]]) #[[ATTR0:[0-9]+]] {25; TUNIT-NEXT: entry:26; TUNIT-NEXT: call void @level1Kernel(i32 [[C]]) #[[ATTR1:[0-9]+]]27; TUNIT-NEXT: ret void28;29; CGSCC: Function Attrs: norecurse nosync nounwind30; CGSCC-LABEL: define {{[^@]+}}@kernel31; CGSCC-SAME: (i32 [[C:%.*]]) #[[ATTR0:[0-9]+]] {32; CGSCC-NEXT: entry:33; CGSCC-NEXT: call void @level1Kernel(i32 [[C]]) #[[ATTR4:[0-9]+]]34; CGSCC-NEXT: ret void35;36entry:37 call void @level1Kernel(i32 %C)38 ret void39}40 41define internal void @level1Kernel(i32 %C) {42; TUNIT: Function Attrs: norecurse nosync nounwind43; TUNIT-LABEL: define {{[^@]+}}@level1Kernel44; TUNIT-SAME: (i32 [[C:%.*]]) #[[ATTR1]] {45; TUNIT-NEXT: entry:46; TUNIT-NEXT: call void @level2Kernelall_early() #[[ATTR4:[0-9]+]]47; TUNIT-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[C]], 048; TUNIT-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]49; TUNIT: if.then:50; TUNIT-NEXT: call void @level2Kernela() #[[ATTR5:[0-9]+]]51; TUNIT-NEXT: br label [[IF_END:%.*]]52; TUNIT: if.else:53; TUNIT-NEXT: call void @level2Kernelb() #[[ATTR5]]54; TUNIT-NEXT: br label [[IF_END]]55; TUNIT: if.end:56; TUNIT-NEXT: call void @level2Kernelall_late() #[[ATTR6:[0-9]+]]57; TUNIT-NEXT: ret void58;59; CGSCC: Function Attrs: norecurse nosync nounwind60; CGSCC-LABEL: define {{[^@]+}}@level1Kernel61; CGSCC-SAME: (i32 [[C:%.*]]) #[[ATTR1:[0-9]+]] {62; CGSCC-NEXT: entry:63; CGSCC-NEXT: call void @level2Kernelall_early() #[[ATTR5:[0-9]+]]64; CGSCC-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[C]], 065; CGSCC-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]66; CGSCC: if.then:67; CGSCC-NEXT: call void @level2Kernela() #[[ATTR4]]68; CGSCC-NEXT: br label [[IF_END:%.*]]69; CGSCC: if.else:70; CGSCC-NEXT: call void @level2Kernelb() #[[ATTR4]]71; CGSCC-NEXT: br label [[IF_END]]72; CGSCC: if.end:73; CGSCC-NEXT: call void @level2Kernelall_late() #[[ATTR6:[0-9]+]]74; CGSCC-NEXT: ret void75;76entry:77 call void @level2Kernelall_early()78 %tobool = icmp ne i32 %C, 079 br i1 %tobool, label %if.then, label %if.else80 81if.then: ; preds = %entry82 call void @level2Kernela()83 br label %if.end84 85if.else: ; preds = %entry86 call void @level2Kernelb()87 br label %if.end88 89if.end: ; preds = %if.else, %if.then90 call void @level2Kernelall_late()91 ret void92}93 94define internal void @level2Kernelall_early() {95; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)96; CHECK-LABEL: define {{[^@]+}}@level2Kernelall_early97; CHECK-SAME: () #[[ATTR2:[0-9]+]] {98; CHECK-NEXT: entry:99; CHECK-NEXT: store i32 1, ptr @ReachableKernelAS0, align 4100; CHECK-NEXT: store i32 1, ptr addrspace(3) @ReachableKernel, align 4101; CHECK-NEXT: ret void102;103entry:104 store i32 1, ptr @ReachableKernelAS0, align 4105 store i32 1, ptr addrspacecast (ptr addrspace(3) @ReachableKernel to ptr), align 4106 ret void107}108 109define internal void @level2Kernela() {110; TUNIT: Function Attrs: norecurse nosync nounwind111; TUNIT-LABEL: define {{[^@]+}}@level2Kernela112; TUNIT-SAME: () #[[ATTR1]] {113; TUNIT-NEXT: entry:114; TUNIT-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(3) @ReachableKernel, align 4115; TUNIT-NEXT: [[TMP1:%.*]] = load i32, ptr @ReachableKernelAS0, align 4116; TUNIT-NEXT: [[TMP2:%.*]] = load i32, ptr addrspace(3) @UnreachableKernel, align 4117; TUNIT-NEXT: call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 noundef [[TMP2]]) #[[ATTR7:[0-9]+]]118; TUNIT-NEXT: ret void119;120; CGSCC: Function Attrs: nosync nounwind121; CGSCC-LABEL: define {{[^@]+}}@level2Kernela122; CGSCC-SAME: () #[[ATTR3:[0-9]+]] {123; CGSCC-NEXT: entry:124; CGSCC-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(3) @ReachableKernel, align 4125; CGSCC-NEXT: [[TMP1:%.*]] = load i32, ptr @ReachableKernelAS0, align 4126; CGSCC-NEXT: [[TMP2:%.*]] = load i32, ptr addrspace(3) @UnreachableKernel, align 4127; CGSCC-NEXT: call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 noundef [[TMP2]]) #[[ATTR4]]128; CGSCC-NEXT: ret void129;130entry:131 %0 = load i32, ptr addrspacecast (ptr addrspace(3) @ReachableKernel to ptr), align 4132 %1 = load i32, ptr @ReachableKernelAS0, align 4133 %2 = load i32, ptr addrspacecast (ptr addrspace(3) @UnreachableKernel to ptr), align 4134 call void @use(i32 %0, i32 %1, i32 %2)135 ret void136}137 138define internal void @level2Kernelb() {139; TUNIT: Function Attrs: norecurse nosync nounwind140; TUNIT-LABEL: define {{[^@]+}}@level2Kernelb141; TUNIT-SAME: () #[[ATTR1]] {142; TUNIT-NEXT: entry:143; TUNIT-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(3) @ReachableKernel, align 4144; TUNIT-NEXT: [[TMP1:%.*]] = load i32, ptr @ReachableKernelAS0, align 4145; TUNIT-NEXT: [[TMP2:%.*]] = load i32, ptr addrspace(3) @UnreachableKernel, align 4146; TUNIT-NEXT: call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 noundef [[TMP2]]) #[[ATTR7]]147; TUNIT-NEXT: ret void148;149; CGSCC: Function Attrs: nosync nounwind150; CGSCC-LABEL: define {{[^@]+}}@level2Kernelb151; CGSCC-SAME: () #[[ATTR3]] {152; CGSCC-NEXT: entry:153; CGSCC-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(3) @ReachableKernel, align 4154; CGSCC-NEXT: [[TMP1:%.*]] = load i32, ptr @ReachableKernelAS0, align 4155; CGSCC-NEXT: [[TMP2:%.*]] = load i32, ptr addrspace(3) @UnreachableKernel, align 4156; CGSCC-NEXT: call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 noundef [[TMP2]]) #[[ATTR4]]157; CGSCC-NEXT: ret void158;159entry:160 %0 = load i32, ptr addrspacecast (ptr addrspace(3) @ReachableKernel to ptr), align 4161 %1 = load i32, ptr @ReachableKernelAS0, align 4162 %2 = load i32, ptr addrspacecast (ptr addrspace(3) @UnreachableKernel to ptr), align 4163 call void @use(i32 %0, i32 %1, i32 %2)164 ret void165}166 167define internal void @level2Kernelall_late() {168; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)169; CHECK-LABEL: define {{[^@]+}}@level2Kernelall_late170; CHECK-SAME: () #[[ATTR2]] {171; CHECK-NEXT: entry:172; CHECK-NEXT: store i32 1, ptr addrspace(3) @UnreachableKernel, align 4173; CHECK-NEXT: ret void174;175entry:176 store i32 1, ptr addrspacecast (ptr addrspace(3) @UnreachableKernel to ptr), align 4177 ret void178}179 180@ReachableNonKernel = internal addrspace(3) global i32 0, align 4181@UnreachableNonKernel = internal addrspace(3) global i32 0, align 4182 183define dso_local void @non_kernel(i32 %C) norecurse {184; TUNIT: Function Attrs: norecurse nosync nounwind185; TUNIT-LABEL: define {{[^@]+}}@non_kernel186; TUNIT-SAME: (i32 [[C:%.*]]) #[[ATTR1]] {187; TUNIT-NEXT: entry:188; TUNIT-NEXT: call void @level1(i32 [[C]]) #[[ATTR1]]189; TUNIT-NEXT: ret void190;191; CGSCC: Function Attrs: norecurse nosync nounwind192; CGSCC-LABEL: define {{[^@]+}}@non_kernel193; CGSCC-SAME: (i32 [[C:%.*]]) #[[ATTR1]] {194; CGSCC-NEXT: entry:195; CGSCC-NEXT: call void @level1(i32 [[C]]) #[[ATTR4]]196; CGSCC-NEXT: ret void197;198entry:199 call void @level1(i32 %C)200 ret void201}202 203define internal void @level1(i32 %C) {204; TUNIT: Function Attrs: norecurse nosync nounwind205; TUNIT-LABEL: define {{[^@]+}}@level1206; TUNIT-SAME: (i32 [[C:%.*]]) #[[ATTR1]] {207; TUNIT-NEXT: entry:208; TUNIT-NEXT: [[LOCAL_ALLOCA:%.*]] = alloca i32, align 4, addrspace(5)209; TUNIT-NEXT: [[LOCAL:%.*]] = addrspacecast ptr addrspace(5) [[LOCAL_ALLOCA]] to ptr210; TUNIT-NEXT: call void @level2all_early(ptr nofree noundef nonnull writeonly align 4 captures(none) dereferenceable(4) [[LOCAL]]) #[[ATTR4]]211; TUNIT-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[C]], 0212; TUNIT-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]213; TUNIT: if.then:214; TUNIT-NEXT: call void @level2a() #[[ATTR5]]215; TUNIT-NEXT: br label [[IF_END:%.*]]216; TUNIT: if.else:217; TUNIT-NEXT: call void @level2b() #[[ATTR5]]218; TUNIT-NEXT: br label [[IF_END]]219; TUNIT: if.end:220; TUNIT-NEXT: call void @level2all_late(ptr nofree noundef writeonly align 4 captures(none) dereferenceable_or_null(4) [[LOCAL]]) #[[ATTR6]]221; TUNIT-NEXT: ret void222;223; CGSCC: Function Attrs: norecurse nosync nounwind224; CGSCC-LABEL: define {{[^@]+}}@level1225; CGSCC-SAME: (i32 [[C:%.*]]) #[[ATTR1]] {226; CGSCC-NEXT: entry:227; CGSCC-NEXT: [[LOCAL_ALLOCA:%.*]] = alloca i32, align 4, addrspace(5)228; CGSCC-NEXT: [[LOCAL:%.*]] = addrspacecast ptr addrspace(5) [[LOCAL_ALLOCA]] to ptr229; CGSCC-NEXT: call void @level2all_early(ptr nofree noundef nonnull writeonly align 4 captures(none) dereferenceable(4) [[LOCAL]]) #[[ATTR5]]230; CGSCC-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[C]], 0231; CGSCC-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]232; CGSCC: if.then:233; CGSCC-NEXT: call void @level2a(ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOCAL]]) #[[ATTR4]]234; CGSCC-NEXT: br label [[IF_END:%.*]]235; CGSCC: if.else:236; CGSCC-NEXT: call void @level2b(ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[LOCAL]]) #[[ATTR4]]237; CGSCC-NEXT: br label [[IF_END]]238; CGSCC: if.end:239; CGSCC-NEXT: call void @level2all_late(ptr nofree noundef nonnull writeonly align 4 captures(none) dereferenceable(4) [[LOCAL]]) #[[ATTR6]]240; CGSCC-NEXT: ret void241;242entry:243 %local.alloca = alloca i32, addrspace(5)244 %local = addrspacecast ptr addrspace(5) %local.alloca to ptr245 call void @level2all_early(ptr %local)246 %tobool = icmp ne i32 %C, 0247 br i1 %tobool, label %if.then, label %if.else248 249if.then: ; preds = %entry250 call void @level2a(ptr %local)251 br label %if.end252 253if.else: ; preds = %entry254 call void @level2b(ptr %local)255 br label %if.end256 257if.end: ; preds = %if.else, %if.then258 call void @level2all_late(ptr %local)259 ret void260}261 262define internal void @level2all_early(ptr %addr) {263; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)264; TUNIT-LABEL: define {{[^@]+}}@level2all_early265; TUNIT-SAME: (ptr nofree noundef nonnull writeonly align 4 captures(none) dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] {266; TUNIT-NEXT: entry:267; TUNIT-NEXT: store i32 1, ptr addrspace(3) @ReachableNonKernel, align 4268; TUNIT-NEXT: [[TMP0:%.*]] = addrspacecast ptr [[ADDR]] to ptr addrspace(5)269; TUNIT-NEXT: ret void270;271; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)272; CGSCC-LABEL: define {{[^@]+}}@level2all_early273; CGSCC-SAME: (ptr nofree noundef nonnull writeonly align 4 captures(none) dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] {274; CGSCC-NEXT: entry:275; CGSCC-NEXT: store i32 1, ptr addrspace(3) @ReachableNonKernel, align 4276; CGSCC-NEXT: store i32 17, ptr [[ADDR]], align 4277; CGSCC-NEXT: ret void278;279entry:280 store i32 1, ptr addrspacecast (ptr addrspace(3) @ReachableNonKernel to ptr), align 4281 store i32 17, ptr %addr, align 4282 ret void283}284 285define internal void @level2a(ptr %addr) {286; TUNIT: Function Attrs: norecurse nosync nounwind memory(readwrite, argmem: none)287; TUNIT-LABEL: define {{[^@]+}}@level2a288; TUNIT-SAME: () #[[ATTR3:[0-9]+]] {289; TUNIT-NEXT: entry:290; TUNIT-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(3) @ReachableNonKernel, align 4291; TUNIT-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(3) @UnreachableNonKernel, align 4292; TUNIT-NEXT: call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 17) #[[ATTR7]]293; TUNIT-NEXT: ret void294;295; CGSCC: Function Attrs: nosync nounwind296; CGSCC-LABEL: define {{[^@]+}}@level2a297; CGSCC-SAME: (ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[ADDR:%.*]]) #[[ATTR3]] {298; CGSCC-NEXT: entry:299; CGSCC-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(3) @ReachableNonKernel, align 4300; CGSCC-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(3) @UnreachableNonKernel, align 4301; CGSCC-NEXT: [[QQQQ2:%.*]] = load i32, ptr [[ADDR]], align 4302; CGSCC-NEXT: call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 [[QQQQ2]]) #[[ATTR4]]303; CGSCC-NEXT: ret void304;305entry:306 %0 = load i32, ptr addrspacecast (ptr addrspace(3) @ReachableNonKernel to ptr), align 4307 %1 = load i32, ptr addrspacecast (ptr addrspace(3) @UnreachableNonKernel to ptr), align 4308 %qqqq2 = load i32, ptr %addr309 call void @use(i32 %0, i32 %1, i32 %qqqq2)310 ret void311}312 313define internal void @level2b(ptr %addr) {314; TUNIT: Function Attrs: norecurse nosync nounwind memory(readwrite, argmem: none)315; TUNIT-LABEL: define {{[^@]+}}@level2b316; TUNIT-SAME: () #[[ATTR3]] {317; TUNIT-NEXT: entry:318; TUNIT-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(3) @ReachableNonKernel, align 4319; TUNIT-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(3) @UnreachableNonKernel, align 4320; TUNIT-NEXT: call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 17) #[[ATTR7]]321; TUNIT-NEXT: ret void322;323; CGSCC: Function Attrs: nosync nounwind324; CGSCC-LABEL: define {{[^@]+}}@level2b325; CGSCC-SAME: (ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[ADDR:%.*]]) #[[ATTR3]] {326; CGSCC-NEXT: entry:327; CGSCC-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(3) @ReachableNonKernel, align 4328; CGSCC-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(3) @UnreachableNonKernel, align 4329; CGSCC-NEXT: [[TMP2:%.*]] = load i32, ptr [[ADDR]], align 4330; CGSCC-NEXT: call void @use(i32 noundef [[TMP0]], i32 noundef [[TMP1]], i32 [[TMP2]]) #[[ATTR4]]331; CGSCC-NEXT: ret void332;333entry:334 %0 = load i32, ptr addrspacecast (ptr addrspace(3) @ReachableNonKernel to ptr), align 4335 %1 = load i32, ptr addrspacecast (ptr addrspace(3) @UnreachableNonKernel to ptr), align 4336 %2 = load i32, ptr %addr337 call void @use(i32 %0, i32 %1, i32 %2)338 ret void339}340 341define internal void @level2all_late(ptr %addr) {342; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)343; TUNIT-LABEL: define {{[^@]+}}@level2all_late344; TUNIT-SAME: (ptr nofree noundef nonnull writeonly align 4 captures(none) dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] {345; TUNIT-NEXT: entry:346; TUNIT-NEXT: store i32 1, ptr addrspace(3) @UnreachableNonKernel, align 4347; TUNIT-NEXT: [[TMP0:%.*]] = addrspacecast ptr [[ADDR]] to ptr addrspace(5)348; TUNIT-NEXT: ret void349;350; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)351; CGSCC-LABEL: define {{[^@]+}}@level2all_late352; CGSCC-SAME: (ptr nofree noundef nonnull writeonly align 4 captures(none) dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] {353; CGSCC-NEXT: entry:354; CGSCC-NEXT: store i32 1, ptr addrspace(3) @UnreachableNonKernel, align 4355; CGSCC-NEXT: store i32 5, ptr [[ADDR]], align 4356; CGSCC-NEXT: ret void357;358entry:359 store i32 1, ptr addrspacecast (ptr addrspace(3) @UnreachableNonKernel to ptr), align 4360 store i32 5, ptr %addr, align 4361 ret void362}363 364define dso_local void @kernel2(i32 %C) norecurse "kernel" {365; TUNIT: Function Attrs: norecurse nosync nounwind366; TUNIT-LABEL: define {{[^@]+}}@kernel2367; TUNIT-SAME: (i32 [[C:%.*]]) #[[ATTR0]] {368; TUNIT-NEXT: [[I:%.*]] = icmp eq i32 [[C]], 42369; TUNIT-NEXT: br i1 [[I]], label [[T:%.*]], label [[F:%.*]]370; TUNIT: t:371; TUNIT-NEXT: store i32 333, ptr addrspace(3) @AS3OneKernelAtATime, align 4372; TUNIT-NEXT: br label [[F]]373; TUNIT: f:374; TUNIT-NEXT: [[L:%.*]] = load i32, ptr addrspace(3) @AS3OneKernelAtATime, align 4375; TUNIT-NEXT: call void @use(i32 noundef [[L]], i32 noundef [[L]], i32 noundef [[L]]) #[[ATTR7]]376; TUNIT-NEXT: ret void377;378; CGSCC: Function Attrs: norecurse nosync nounwind379; CGSCC-LABEL: define {{[^@]+}}@kernel2380; CGSCC-SAME: (i32 [[C:%.*]]) #[[ATTR0]] {381; CGSCC-NEXT: [[I:%.*]] = icmp eq i32 [[C]], 42382; CGSCC-NEXT: br i1 [[I]], label [[T:%.*]], label [[F:%.*]]383; CGSCC: t:384; CGSCC-NEXT: store i32 333, ptr addrspace(3) @AS3OneKernelAtATime, align 4385; CGSCC-NEXT: br label [[F]]386; CGSCC: f:387; CGSCC-NEXT: [[L:%.*]] = load i32, ptr addrspace(3) @AS3OneKernelAtATime, align 4388; CGSCC-NEXT: call void @use(i32 noundef [[L]], i32 noundef [[L]], i32 noundef [[L]]) #[[ATTR4]]389; CGSCC-NEXT: ret void390;391 %i = icmp eq i32 %C, 42392 br i1 %i, label %t, label %f393t:394 store i32 333, ptr addrspace(3) @AS3OneKernelAtATime395 br label %f396f:397 %l = load i32, ptr addrspace(3) @AS3OneKernelAtATime398 call void @use(i32 %l,i32 %l, i32 %l)399 ret void400}401 402define dso_local void @kernel3(i32 %C) norecurse "kernel" {403; TUNIT: Function Attrs: norecurse nosync nounwind404; TUNIT-LABEL: define {{[^@]+}}@kernel3405; TUNIT-SAME: (i32 [[C:%.*]]) #[[ATTR0]] {406; TUNIT-NEXT: [[I:%.*]] = icmp eq i32 [[C]], 42407; TUNIT-NEXT: br i1 [[I]], label [[T:%.*]], label [[F:%.*]]408; TUNIT: t:409; TUNIT-NEXT: call void @use(i32 noundef 42, i32 noundef 42, i32 noundef 42) #[[ATTR7]]410; TUNIT-NEXT: ret void411; TUNIT: f:412; TUNIT-NEXT: ret void413;414; CGSCC: Function Attrs: norecurse nosync nounwind415; CGSCC-LABEL: define {{[^@]+}}@kernel3416; CGSCC-SAME: (i32 [[C:%.*]]) #[[ATTR0]] {417; CGSCC-NEXT: [[I:%.*]] = icmp eq i32 [[C]], 42418; CGSCC-NEXT: br i1 [[I]], label [[T:%.*]], label [[F:%.*]]419; CGSCC: t:420; CGSCC-NEXT: call void @use(i32 noundef 42, i32 noundef 42, i32 noundef 42) #[[ATTR4]]421; CGSCC-NEXT: ret void422; CGSCC: f:423; CGSCC-NEXT: ret void424;425 %i = icmp eq i32 %C, 42426 br i1 %i, label %t, label %f427t:428 %l = load i32, ptr addrspace(3) @AS3OneKernelAtATime429 call void @use(i32 %l,i32 %l, i32 %l)430 ret void431f:432 ret void433}434 435declare dso_local void @use(i32, i32, i32) nosync norecurse nounwind436 437;.438; TUNIT: attributes #[[ATTR0]] = { norecurse nosync nounwind "kernel" }439; TUNIT: attributes #[[ATTR1]] = { norecurse nosync nounwind }440; TUNIT: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) }441; TUNIT: attributes #[[ATTR3]] = { norecurse nosync nounwind memory(readwrite, argmem: none) }442; TUNIT: attributes #[[ATTR4]] = { nofree nosync nounwind willreturn memory(write) }443; TUNIT: attributes #[[ATTR5]] = { nosync nounwind }444; TUNIT: attributes #[[ATTR6]] = { nosync nounwind memory(write) }445; TUNIT: attributes #[[ATTR7]] = { nounwind }446;.447; CGSCC: attributes #[[ATTR0]] = { norecurse nosync nounwind "kernel" }448; CGSCC: attributes #[[ATTR1]] = { norecurse nosync nounwind }449; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) }450; CGSCC: attributes #[[ATTR3]] = { nosync nounwind }451; CGSCC: attributes #[[ATTR4]] = { nounwind }452; CGSCC: attributes #[[ATTR5]] = { nofree nounwind willreturn memory(write) }453; CGSCC: attributes #[[ATTR6]] = { nounwind memory(write) }454;.455