905 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 5@GInt1 = internal global i32 undef, align 46@GInt2 = internal global i32 zeroinitializer, align 47@GInt3 = internal global i32 undef, align 48@GInt4 = internal global i32 zeroinitializer, align 49@GInt5 = internal global i32 undef, align 410 11declare void @llvm.assume(i1)12declare void @useI32(i32) nosync nocallback13declare void @free(ptr) allockind("free") "alloc-family"="malloc"14declare noalias ptr @calloc(i64, i64) allockind("alloc,zeroed") allocsize(0, 1) "alloc-family"="malloc"15 16;.17; CHECK: @GInt1 = internal global i32 undef, align 418; CHECK: @GInt2 = internal global i32 0, align 419; CHECK: @GInt3 = internal global i32 undef, align 420; CHECK: @GInt4 = internal global i32 0, align 421; CHECK: @GInt5 = internal global i32 undef, align 422; CHECK: @B = global i32 023;.24define internal void @write1ToGInt1() {25; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)26; CHECK-LABEL: define {{[^@]+}}@write1ToGInt127; CHECK-SAME: () #[[ATTR4:[0-9]+]] {28; CHECK-NEXT: store i32 1, ptr @GInt1, align 429; CHECK-NEXT: ret void30;31 store i32 1, ptr @GInt132 ret void33}34 35define internal void @write1ToGInt2() {36; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)37; CHECK-LABEL: define {{[^@]+}}@write1ToGInt238; CHECK-SAME: () #[[ATTR4]] {39; CHECK-NEXT: store i32 1, ptr @GInt2, align 440; CHECK-NEXT: ret void41;42 store i32 1, ptr @GInt243 ret void44}45 46define void @entry1(i1 %c, i32 %v) {47; TUNIT: Function Attrs: norecurse nosync48; TUNIT-LABEL: define {{[^@]+}}@entry149; TUNIT-SAME: (i1 [[C:%.*]], i32 [[V:%.*]]) #[[ATTR5:[0-9]+]] {50; TUNIT-NEXT: [[L0:%.*]] = load i32, ptr @GInt1, align 451; TUNIT-NEXT: call void @useI32(i32 [[L0]])52; TUNIT-NEXT: call void @write1ToGInt1() #[[ATTR12:[0-9]+]]53; TUNIT-NEXT: [[L1:%.*]] = load i32, ptr @GInt1, align 454; TUNIT-NEXT: call void @useI32(i32 [[L1]])55; TUNIT-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]56; TUNIT: T:57; TUNIT-NEXT: store i32 [[V]], ptr @GInt1, align 458; TUNIT-NEXT: [[L2:%.*]] = load i32, ptr @GInt1, align 459; TUNIT-NEXT: call void @useI32(i32 [[L2]])60; TUNIT-NEXT: br label [[F]]61; TUNIT: F:62; TUNIT-NEXT: [[L3:%.*]] = load i32, ptr @GInt1, align 463; TUNIT-NEXT: call void @useI32(i32 [[L3]])64; TUNIT-NEXT: call void @write1ToGInt1() #[[ATTR12]]65; TUNIT-NEXT: [[L4:%.*]] = load i32, ptr @GInt1, align 466; TUNIT-NEXT: call void @useI32(i32 [[L4]])67; TUNIT-NEXT: ret void68;69; CGSCC: Function Attrs: nosync70; CGSCC-LABEL: define {{[^@]+}}@entry171; CGSCC-SAME: (i1 [[C:%.*]], i32 [[V:%.*]]) #[[ATTR5:[0-9]+]] {72; CGSCC-NEXT: [[L0:%.*]] = load i32, ptr @GInt1, align 473; CGSCC-NEXT: call void @useI32(i32 [[L0]])74; CGSCC-NEXT: call void @write1ToGInt1() #[[ATTR13:[0-9]+]]75; CGSCC-NEXT: [[L1:%.*]] = load i32, ptr @GInt1, align 476; CGSCC-NEXT: call void @useI32(i32 [[L1]])77; CGSCC-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]78; CGSCC: T:79; CGSCC-NEXT: store i32 [[V]], ptr @GInt1, align 480; CGSCC-NEXT: [[L2:%.*]] = load i32, ptr @GInt1, align 481; CGSCC-NEXT: call void @useI32(i32 [[L2]])82; CGSCC-NEXT: br label [[F]]83; CGSCC: F:84; CGSCC-NEXT: [[L3:%.*]] = load i32, ptr @GInt1, align 485; CGSCC-NEXT: call void @useI32(i32 [[L3]])86; CGSCC-NEXT: call void @write1ToGInt1() #[[ATTR13]]87; CGSCC-NEXT: [[L4:%.*]] = load i32, ptr @GInt1, align 488; CGSCC-NEXT: call void @useI32(i32 [[L4]])89; CGSCC-NEXT: ret void90;91 %l0 = load i32, ptr @GInt192 call void @useI32(i32 %l0)93 call void @write1ToGInt1();94 %l1 = load i32, ptr @GInt195 call void @useI32(i32 %l1)96 br i1 %c, label %T, label %F97T:98 store i32 %v, ptr @GInt199 %l2 = load i32, ptr @GInt1100 call void @useI32(i32 %l2)101 br label %F102F:103 %l3 = load i32, ptr @GInt1104 call void @useI32(i32 %l3)105 call void @write1ToGInt1();106 %l4 = load i32, ptr @GInt1107 call void @useI32(i32 %l4)108 ret void109}110 111define void @entry2(i1 %c, i32 %v) {112; TUNIT: Function Attrs: norecurse nosync113; TUNIT-LABEL: define {{[^@]+}}@entry2114; TUNIT-SAME: (i1 [[C:%.*]], i32 [[V:%.*]]) #[[ATTR5]] {115; TUNIT-NEXT: [[L0:%.*]] = load i32, ptr @GInt2, align 4116; TUNIT-NEXT: call void @useI32(i32 [[L0]])117; TUNIT-NEXT: call void @write1ToGInt2() #[[ATTR12]]118; TUNIT-NEXT: [[L1:%.*]] = load i32, ptr @GInt2, align 4119; TUNIT-NEXT: call void @useI32(i32 [[L1]])120; TUNIT-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]121; TUNIT: T:122; TUNIT-NEXT: store i32 [[V]], ptr @GInt2, align 4123; TUNIT-NEXT: [[L2:%.*]] = load i32, ptr @GInt2, align 4124; TUNIT-NEXT: call void @useI32(i32 [[L2]])125; TUNIT-NEXT: br label [[F]]126; TUNIT: F:127; TUNIT-NEXT: [[L3:%.*]] = load i32, ptr @GInt2, align 4128; TUNIT-NEXT: call void @useI32(i32 [[L3]])129; TUNIT-NEXT: call void @write1ToGInt2() #[[ATTR12]]130; TUNIT-NEXT: [[L4:%.*]] = load i32, ptr @GInt2, align 4131; TUNIT-NEXT: call void @useI32(i32 [[L4]])132; TUNIT-NEXT: ret void133;134; CGSCC: Function Attrs: nosync135; CGSCC-LABEL: define {{[^@]+}}@entry2136; CGSCC-SAME: (i1 [[C:%.*]], i32 [[V:%.*]]) #[[ATTR5]] {137; CGSCC-NEXT: [[L0:%.*]] = load i32, ptr @GInt2, align 4138; CGSCC-NEXT: call void @useI32(i32 [[L0]])139; CGSCC-NEXT: call void @write1ToGInt2() #[[ATTR13]]140; CGSCC-NEXT: [[L1:%.*]] = load i32, ptr @GInt2, align 4141; CGSCC-NEXT: call void @useI32(i32 [[L1]])142; CGSCC-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]143; CGSCC: T:144; CGSCC-NEXT: store i32 [[V]], ptr @GInt2, align 4145; CGSCC-NEXT: [[L2:%.*]] = load i32, ptr @GInt2, align 4146; CGSCC-NEXT: call void @useI32(i32 [[L2]])147; CGSCC-NEXT: br label [[F]]148; CGSCC: F:149; CGSCC-NEXT: [[L3:%.*]] = load i32, ptr @GInt2, align 4150; CGSCC-NEXT: call void @useI32(i32 [[L3]])151; CGSCC-NEXT: call void @write1ToGInt2() #[[ATTR13]]152; CGSCC-NEXT: [[L4:%.*]] = load i32, ptr @GInt2, align 4153; CGSCC-NEXT: call void @useI32(i32 [[L4]])154; CGSCC-NEXT: ret void155;156 %l0 = load i32, ptr @GInt2157 call void @useI32(i32 %l0)158 call void @write1ToGInt2();159 %l1 = load i32, ptr @GInt2160 call void @useI32(i32 %l1)161 br i1 %c, label %T, label %F162T:163 store i32 %v, ptr @GInt2164 %l2 = load i32, ptr @GInt2165 call void @useI32(i32 %l2)166 br label %F167F:168 %l3 = load i32, ptr @GInt2169 call void @useI32(i32 %l3)170 call void @write1ToGInt2();171 %l4 = load i32, ptr @GInt2172 call void @useI32(i32 %l4)173 ret void174}175define void @entry3(i1 %c, i32 %v) {176; TUNIT: Function Attrs: norecurse nosync177; TUNIT-LABEL: define {{[^@]+}}@entry3178; TUNIT-SAME: (i1 [[C:%.*]], i32 [[V:%.*]]) #[[ATTR5]] {179; TUNIT-NEXT: call void @useI32(i32 1)180; TUNIT-NEXT: store i32 1, ptr @GInt3, align 4181; TUNIT-NEXT: call void @useI32(i32 noundef 1)182; TUNIT-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]183; TUNIT: T:184; TUNIT-NEXT: store i32 [[V]], ptr @GInt3, align 4185; TUNIT-NEXT: [[L2:%.*]] = load i32, ptr @GInt3, align 4186; TUNIT-NEXT: call void @useI32(i32 [[L2]])187; TUNIT-NEXT: br label [[F]]188; TUNIT: F:189; TUNIT-NEXT: [[L3:%.*]] = load i32, ptr @GInt3, align 4190; TUNIT-NEXT: call void @useI32(i32 [[L3]])191; TUNIT-NEXT: store i32 1, ptr @GInt3, align 4192; TUNIT-NEXT: call void @useI32(i32 noundef 1)193; TUNIT-NEXT: ret void194;195; CGSCC: Function Attrs: norecurse nosync196; CGSCC-LABEL: define {{[^@]+}}@entry3197; CGSCC-SAME: (i1 [[C:%.*]], i32 [[V:%.*]]) #[[ATTR6:[0-9]+]] {198; CGSCC-NEXT: call void @useI32(i32 1)199; CGSCC-NEXT: store i32 1, ptr @GInt3, align 4200; CGSCC-NEXT: call void @useI32(i32 noundef 1)201; CGSCC-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]202; CGSCC: T:203; CGSCC-NEXT: store i32 [[V]], ptr @GInt3, align 4204; CGSCC-NEXT: [[L2:%.*]] = load i32, ptr @GInt3, align 4205; CGSCC-NEXT: call void @useI32(i32 [[L2]])206; CGSCC-NEXT: br label [[F]]207; CGSCC: F:208; CGSCC-NEXT: [[L3:%.*]] = load i32, ptr @GInt3, align 4209; CGSCC-NEXT: call void @useI32(i32 [[L3]])210; CGSCC-NEXT: store i32 1, ptr @GInt3, align 4211; CGSCC-NEXT: call void @useI32(i32 noundef 1)212; CGSCC-NEXT: ret void213;214 %l0 = load i32, ptr @GInt3215 call void @useI32(i32 %l0)216 store i32 1, ptr @GInt3217 %l1 = load i32, ptr @GInt3218 call void @useI32(i32 %l1)219 br i1 %c, label %T, label %F220T:221 store i32 %v, ptr @GInt3222 %l2 = load i32, ptr @GInt3223 call void @useI32(i32 %l2)224 br label %F225F:226 %l3 = load i32, ptr @GInt3227 call void @useI32(i32 %l3)228 store i32 1, ptr @GInt3229 %l4 = load i32, ptr @GInt3230 call void @useI32(i32 %l4)231 ret void232}233 234define void @entry4(i1 %c, i32 %v) {235; TUNIT: Function Attrs: norecurse nosync236; TUNIT-LABEL: define {{[^@]+}}@entry4237; TUNIT-SAME: (i1 [[C:%.*]], i32 [[V:%.*]]) #[[ATTR5]] {238; TUNIT-NEXT: [[L0:%.*]] = load i32, ptr @GInt4, align 4239; TUNIT-NEXT: call void @useI32(i32 noundef [[L0]])240; TUNIT-NEXT: store i32 1, ptr @GInt4, align 4241; TUNIT-NEXT: call void @useI32(i32 noundef 1)242; TUNIT-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]243; TUNIT: T:244; TUNIT-NEXT: store i32 [[V]], ptr @GInt4, align 4245; TUNIT-NEXT: [[L2:%.*]] = load i32, ptr @GInt4, align 4246; TUNIT-NEXT: call void @useI32(i32 [[L2]])247; TUNIT-NEXT: br label [[F]]248; TUNIT: F:249; TUNIT-NEXT: [[L3:%.*]] = load i32, ptr @GInt4, align 4250; TUNIT-NEXT: call void @useI32(i32 [[L3]])251; TUNIT-NEXT: store i32 1, ptr @GInt4, align 4252; TUNIT-NEXT: call void @useI32(i32 noundef 1)253; TUNIT-NEXT: ret void254;255; CGSCC: Function Attrs: norecurse nosync256; CGSCC-LABEL: define {{[^@]+}}@entry4257; CGSCC-SAME: (i1 [[C:%.*]], i32 [[V:%.*]]) #[[ATTR6]] {258; CGSCC-NEXT: [[L0:%.*]] = load i32, ptr @GInt4, align 4259; CGSCC-NEXT: call void @useI32(i32 noundef [[L0]])260; CGSCC-NEXT: store i32 1, ptr @GInt4, align 4261; CGSCC-NEXT: call void @useI32(i32 noundef 1)262; CGSCC-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]263; CGSCC: T:264; CGSCC-NEXT: store i32 [[V]], ptr @GInt4, align 4265; CGSCC-NEXT: [[L2:%.*]] = load i32, ptr @GInt4, align 4266; CGSCC-NEXT: call void @useI32(i32 [[L2]])267; CGSCC-NEXT: br label [[F]]268; CGSCC: F:269; CGSCC-NEXT: [[L3:%.*]] = load i32, ptr @GInt4, align 4270; CGSCC-NEXT: call void @useI32(i32 [[L3]])271; CGSCC-NEXT: store i32 1, ptr @GInt4, align 4272; CGSCC-NEXT: call void @useI32(i32 noundef 1)273; CGSCC-NEXT: ret void274;275 %l0 = load i32, ptr @GInt4276 call void @useI32(i32 %l0)277 store i32 1, ptr @GInt4278 %l1 = load i32, ptr @GInt4279 call void @useI32(i32 %l1)280 br i1 %c, label %T, label %F281T:282 store i32 %v, ptr @GInt4283 %l2 = load i32, ptr @GInt4284 call void @useI32(i32 %l2)285 br label %F286F:287 %l3 = load i32, ptr @GInt4288 call void @useI32(i32 %l3)289 store i32 1, ptr @GInt4290 %l4 = load i32, ptr @GInt4291 call void @useI32(i32 %l4)292 ret void293}294 295; TODO: In this test we can replace %l0, in the others above we cannot.296define void @entry5(i1 %c, i32 %v) {297; TUNIT: Function Attrs: norecurse nosync298; TUNIT-LABEL: define {{[^@]+}}@entry5299; TUNIT-SAME: (i1 [[C:%.*]], i32 [[V:%.*]]) #[[ATTR5]] {300; TUNIT-NEXT: call void @useI32(i32 1)301; TUNIT-NEXT: store i32 1, ptr @GInt5, align 4302; TUNIT-NEXT: call void @useI32(i32 noundef 1) #[[ATTR6:[0-9]+]]303; TUNIT-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]304; TUNIT: T:305; TUNIT-NEXT: store i32 [[V]], ptr @GInt5, align 4306; TUNIT-NEXT: [[L2:%.*]] = load i32, ptr @GInt5, align 4307; TUNIT-NEXT: call void @useI32(i32 [[L2]]) #[[ATTR6]]308; TUNIT-NEXT: br label [[F]]309; TUNIT: F:310; TUNIT-NEXT: [[L3:%.*]] = load i32, ptr @GInt5, align 4311; TUNIT-NEXT: call void @useI32(i32 [[L3]]) #[[ATTR6]]312; TUNIT-NEXT: store i32 1, ptr @GInt5, align 4313; TUNIT-NEXT: call void @useI32(i32 noundef 1) #[[ATTR6]]314; TUNIT-NEXT: ret void315;316; CGSCC: Function Attrs: norecurse nosync317; CGSCC-LABEL: define {{[^@]+}}@entry5318; CGSCC-SAME: (i1 [[C:%.*]], i32 [[V:%.*]]) #[[ATTR6]] {319; CGSCC-NEXT: call void @useI32(i32 1)320; CGSCC-NEXT: store i32 1, ptr @GInt5, align 4321; CGSCC-NEXT: call void @useI32(i32 noundef 1) #[[ATTR7:[0-9]+]]322; CGSCC-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]323; CGSCC: T:324; CGSCC-NEXT: store i32 [[V]], ptr @GInt5, align 4325; CGSCC-NEXT: [[L2:%.*]] = load i32, ptr @GInt5, align 4326; CGSCC-NEXT: call void @useI32(i32 [[L2]]) #[[ATTR7]]327; CGSCC-NEXT: br label [[F]]328; CGSCC: F:329; CGSCC-NEXT: [[L3:%.*]] = load i32, ptr @GInt5, align 4330; CGSCC-NEXT: call void @useI32(i32 [[L3]]) #[[ATTR7]]331; CGSCC-NEXT: store i32 1, ptr @GInt5, align 4332; CGSCC-NEXT: call void @useI32(i32 noundef 1) #[[ATTR7]]333; CGSCC-NEXT: ret void334;335 %l0 = load i32, ptr @GInt5336 call void @useI32(i32 %l0)337 store i32 1, ptr @GInt5338 %l1 = load i32, ptr @GInt5339 call void @useI32(i32 %l1) nocallback340 br i1 %c, label %T, label %F341T:342 store i32 %v, ptr @GInt5343 %l2 = load i32, ptr @GInt5344 call void @useI32(i32 %l2) nocallback345 br label %F346F:347 %l3 = load i32, ptr @GInt5348 call void @useI32(i32 %l3) nocallback349 store i32 1, ptr @GInt5350 %l4 = load i32, ptr @GInt5351 call void @useI32(i32 %l4) nocallback352 ret void353}354 355 356declare void @use_4_i8(i8, i8, i8, i8) nocallback357 358define void @exclusion_set1(i1 %c1, i1 %c2, i1 %c3) {359; CHECK-LABEL: define {{[^@]+}}@exclusion_set1360; CHECK-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]]) {361; CHECK-NEXT: entry:362; CHECK-NEXT: [[CALL_H2S:%.*]] = alloca i8, i64 4, align 1363; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr [[CALL_H2S]], i8 0, i64 4, i1 false)364; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds i8, ptr [[CALL_H2S]], i64 1365; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds i8, ptr [[CALL_H2S]], i64 2366; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds i8, ptr [[CALL_H2S]], i64 3367; CHECK-NEXT: [[L0_A:%.*]] = load i8, ptr [[CALL_H2S]], align 1368; CHECK-NEXT: [[L1_A:%.*]] = load i8, ptr [[GEP1]], align 1369; CHECK-NEXT: [[L2_A:%.*]] = load i8, ptr [[GEP2]], align 1370; CHECK-NEXT: [[L3_A:%.*]] = load i8, ptr [[GEP3]], align 1371; CHECK-NEXT: call void @use_4_i8(i8 noundef [[L0_A]], i8 noundef [[L1_A]], i8 noundef [[L2_A]], i8 noundef [[L3_A]])372; CHECK-NEXT: store i8 1, ptr [[CALL_H2S]], align 4373; CHECK-NEXT: [[L1_B:%.*]] = load i8, ptr [[GEP1]], align 1374; CHECK-NEXT: [[L2_B:%.*]] = load i8, ptr [[GEP2]], align 1375; CHECK-NEXT: [[L3_B:%.*]] = load i8, ptr [[GEP3]], align 1376; CHECK-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef [[L1_B]], i8 noundef [[L2_B]], i8 noundef [[L3_B]])377; CHECK-NEXT: br i1 [[C1]], label [[IF_MERGE1:%.*]], label [[IF_THEN:%.*]]378; CHECK: if.then:379; CHECK-NEXT: [[L1_C:%.*]] = load i8, ptr [[GEP1]], align 1380; CHECK-NEXT: [[L2_C:%.*]] = load i8, ptr [[GEP2]], align 1381; CHECK-NEXT: [[L3_C:%.*]] = load i8, ptr [[GEP3]], align 1382; CHECK-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef [[L1_C]], i8 noundef [[L2_C]], i8 noundef [[L3_C]])383; CHECK-NEXT: store i8 2, ptr [[GEP1]], align 4384; CHECK-NEXT: [[L2_D:%.*]] = load i8, ptr [[GEP2]], align 1385; CHECK-NEXT: [[L3_D:%.*]] = load i8, ptr [[GEP3]], align 1386; CHECK-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef 2, i8 noundef [[L2_D]], i8 noundef [[L3_D]])387; CHECK-NEXT: br i1 [[C1]], label [[IF_MERGE1]], label [[IF_THEN2:%.*]]388; CHECK: if.then2:389; CHECK-NEXT: [[L2_E:%.*]] = load i8, ptr [[GEP2]], align 1390; CHECK-NEXT: [[L3_E:%.*]] = load i8, ptr [[GEP3]], align 1391; CHECK-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef 2, i8 noundef [[L2_E]], i8 noundef [[L3_E]])392; CHECK-NEXT: store i8 3, ptr [[GEP2]], align 4393; CHECK-NEXT: [[L3_F:%.*]] = load i8, ptr [[GEP3]], align 1394; CHECK-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef 2, i8 noundef 3, i8 noundef [[L3_F]])395; CHECK-NEXT: br i1 [[C2]], label [[IF_MERGE2:%.*]], label [[IF_THEN3:%.*]]396; CHECK: if.merge1:397; CHECK-NEXT: [[L1_G:%.*]] = load i8, ptr [[GEP1]], align 1398; CHECK-NEXT: [[L2_G:%.*]] = load i8, ptr [[GEP2]], align 1399; CHECK-NEXT: [[L3_G:%.*]] = load i8, ptr [[GEP3]], align 1400; CHECK-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef [[L1_G]], i8 noundef [[L2_G]], i8 noundef [[L3_G]])401; CHECK-NEXT: br label [[IF_MERGE2]]402; CHECK: if.merge2:403; CHECK-NEXT: [[L1_H:%.*]] = load i8, ptr [[GEP1]], align 1404; CHECK-NEXT: [[L2_H:%.*]] = load i8, ptr [[GEP2]], align 1405; CHECK-NEXT: [[L3_H:%.*]] = load i8, ptr [[GEP3]], align 1406; CHECK-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef [[L1_H]], i8 noundef [[L2_H]], i8 noundef [[L3_H]])407; CHECK-NEXT: br label [[IF_END:%.*]]408; CHECK: if.then3:409; CHECK-NEXT: [[L3_I:%.*]] = load i8, ptr [[GEP3]], align 1410; CHECK-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef 2, i8 noundef 3, i8 noundef [[L3_I]])411; CHECK-NEXT: store i8 4, ptr [[GEP3]], align 4412; CHECK-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef 2, i8 noundef 3, i8 noundef 4)413; CHECK-NEXT: br label [[IF_END]]414; CHECK: if.end:415; CHECK-NEXT: [[L1_K:%.*]] = load i8, ptr [[GEP1]], align 1416; CHECK-NEXT: [[L2_K:%.*]] = load i8, ptr [[GEP2]], align 1417; CHECK-NEXT: [[L3_K:%.*]] = load i8, ptr [[GEP3]], align 1418; CHECK-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef [[L1_K]], i8 noundef [[L2_K]], i8 noundef [[L3_K]])419; CHECK-NEXT: ret void420;421entry:422 %call = call noalias ptr @calloc(i64 1, i64 4) norecurse423 %gep0 = getelementptr inbounds i8, ptr %call, i64 0424 %gep1 = getelementptr inbounds i8, ptr %call, i64 1425 %gep2 = getelementptr inbounds i8, ptr %call, i64 2426 %gep3 = getelementptr inbounds i8, ptr %call, i64 3427 428 %l0_a = load i8, ptr %gep0429 %l1_a = load i8, ptr %gep1430 %l2_a = load i8, ptr %gep2431 %l3_a = load i8, ptr %gep3432 call void @use_4_i8(i8 %l0_a, i8 %l1_a, i8 %l2_a, i8 %l3_a)433 434 store i8 1, ptr %gep0, align 4435 436 %l0_b = load i8, ptr %gep0437 %l1_b = load i8, ptr %gep1438 %l2_b = load i8, ptr %gep2439 %l3_b = load i8, ptr %gep3440 call void @use_4_i8(i8 %l0_b, i8 %l1_b, i8 %l2_b, i8 %l3_b)441 442 br i1 %c1, label %if.merge1, label %if.then443 444if.then:445 %l0_c = load i8, ptr %gep0446 %l1_c = load i8, ptr %gep1447 %l2_c = load i8, ptr %gep2448 %l3_c = load i8, ptr %gep3449 call void @use_4_i8(i8 %l0_c, i8 %l1_c, i8 %l2_c, i8 %l3_c)450 451 store i8 2, ptr %gep1, align 4452 453 %l0_d = load i8, ptr %gep0454 %l1_d = load i8, ptr %gep1455 %l2_d = load i8, ptr %gep2456 %l3_d = load i8, ptr %gep3457 call void @use_4_i8(i8 %l0_d, i8 %l1_d, i8 %l2_d, i8 %l3_d)458 459 br i1 %c1, label %if.merge1, label %if.then2460 461if.then2:462 %l0_e = load i8, ptr %gep0463 %l1_e = load i8, ptr %gep1464 %l2_e = load i8, ptr %gep2465 %l3_e = load i8, ptr %gep3466 call void @use_4_i8(i8 %l0_e, i8 %l1_e, i8 %l2_e, i8 %l3_e)467 468 store i8 3, ptr %gep2, align 4469 470 %l0_f = load i8, ptr %gep0471 %l1_f = load i8, ptr %gep1472 %l2_f = load i8, ptr %gep2473 %l3_f = load i8, ptr %gep3474 call void @use_4_i8(i8 %l0_f, i8 %l1_f, i8 %l2_f, i8 %l3_f)475 476 br i1 %c2, label %if.merge2, label %if.then3477 478if.merge1:479 480 %l0_g = load i8, ptr %gep0481 %l1_g = load i8, ptr %gep1482 %l2_g = load i8, ptr %gep2483 %l3_g = load i8, ptr %gep3484 call void @use_4_i8(i8 %l0_g, i8 %l1_g, i8 %l2_g, i8 %l3_g)485 486 br label %if.merge2487 488if.merge2:489 490 %l0_h = load i8, ptr %gep0491 %l1_h = load i8, ptr %gep1492 %l2_h = load i8, ptr %gep2493 %l3_h = load i8, ptr %gep3494 call void @use_4_i8(i8 %l0_h, i8 %l1_h, i8 %l2_h, i8 %l3_h)495 496 br label %if.end497 498if.then3:499 500 %l0_i = load i8, ptr %gep0501 %l1_i = load i8, ptr %gep1502 %l2_i = load i8, ptr %gep2503 %l3_i = load i8, ptr %gep3504 call void @use_4_i8(i8 %l0_i, i8 %l1_i, i8 %l2_i, i8 %l3_i)505 506 store i8 4, ptr %gep3, align 4507 508 %l0_j = load i8, ptr %gep0509 %l1_j = load i8, ptr %gep1510 %l2_j = load i8, ptr %gep2511 %l3_j = load i8, ptr %gep3512 call void @use_4_i8(i8 %l0_j, i8 %l1_j, i8 %l2_j, i8 %l3_j)513 514 br label %if.end515 516if.end:517 %l0_k = load i8, ptr %gep0518 %l1_k = load i8, ptr %gep1519 %l2_k = load i8, ptr %gep2520 %l3_k = load i8, ptr %gep3521 call void @use_4_i8(i8 %l0_k, i8 %l1_k, i8 %l2_k, i8 %l3_k)522 523 call void @free(ptr %call) norecurse524 ret void525}526 527define void @exclusion_set2(i1 %c1, i1 %c2, i1 %c3) {528; TUNIT: Function Attrs: norecurse529; TUNIT-LABEL: define {{[^@]+}}@exclusion_set2530; TUNIT-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]]) #[[ATTR7:[0-9]+]] {531; TUNIT-NEXT: entry:532; TUNIT-NEXT: call void @use_4_i8(i8 undef, i8 undef, i8 undef, i8 undef)533; TUNIT-NEXT: call void @use_4_i8(i8 noundef 1, i8 undef, i8 undef, i8 undef)534; TUNIT-NEXT: br i1 [[C1]], label [[IF_MERGE1:%.*]], label [[IF_THEN:%.*]]535; TUNIT: if.then:536; TUNIT-NEXT: call void @use_4_i8(i8 noundef 1, i8 undef, i8 undef, i8 undef)537; TUNIT-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef 2, i8 undef, i8 undef)538; TUNIT-NEXT: br i1 [[C1]], label [[IF_MERGE1]], label [[IF_THEN2:%.*]]539; TUNIT: if.then2:540; TUNIT-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef 2, i8 undef, i8 undef)541; TUNIT-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef 2, i8 noundef 3, i8 undef)542; TUNIT-NEXT: br i1 [[C2]], label [[IF_MERGE2:%.*]], label [[IF_THEN3:%.*]]543; TUNIT: if.merge1:544; TUNIT-NEXT: call void @use_4_i8(i8 noundef 1, i8 2, i8 undef, i8 undef)545; TUNIT-NEXT: br label [[IF_MERGE2]]546; TUNIT: if.merge2:547; TUNIT-NEXT: call void @use_4_i8(i8 noundef 1, i8 2, i8 3, i8 undef)548; TUNIT-NEXT: br label [[IF_END:%.*]]549; TUNIT: if.then3:550; TUNIT-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef 2, i8 noundef 3, i8 undef)551; TUNIT-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef 2, i8 noundef 3, i8 noundef 4)552; TUNIT-NEXT: br label [[IF_END]]553; TUNIT: if.end:554; TUNIT-NEXT: call void @use_4_i8(i8 noundef 1, i8 2, i8 3, i8 4)555; TUNIT-NEXT: ret void556;557; CGSCC: Function Attrs: norecurse558; CGSCC-LABEL: define {{[^@]+}}@exclusion_set2559; CGSCC-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]]) #[[ATTR8:[0-9]+]] {560; CGSCC-NEXT: entry:561; CGSCC-NEXT: call void @use_4_i8(i8 undef, i8 undef, i8 undef, i8 undef)562; CGSCC-NEXT: call void @use_4_i8(i8 noundef 1, i8 undef, i8 undef, i8 undef)563; CGSCC-NEXT: br i1 [[C1]], label [[IF_MERGE1:%.*]], label [[IF_THEN:%.*]]564; CGSCC: if.then:565; CGSCC-NEXT: call void @use_4_i8(i8 noundef 1, i8 undef, i8 undef, i8 undef)566; CGSCC-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef 2, i8 undef, i8 undef)567; CGSCC-NEXT: br i1 [[C1]], label [[IF_MERGE1]], label [[IF_THEN2:%.*]]568; CGSCC: if.then2:569; CGSCC-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef 2, i8 undef, i8 undef)570; CGSCC-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef 2, i8 noundef 3, i8 undef)571; CGSCC-NEXT: br i1 [[C2]], label [[IF_MERGE2:%.*]], label [[IF_THEN3:%.*]]572; CGSCC: if.merge1:573; CGSCC-NEXT: call void @use_4_i8(i8 noundef 1, i8 2, i8 undef, i8 undef)574; CGSCC-NEXT: br label [[IF_MERGE2]]575; CGSCC: if.merge2:576; CGSCC-NEXT: call void @use_4_i8(i8 noundef 1, i8 2, i8 3, i8 undef)577; CGSCC-NEXT: br label [[IF_END:%.*]]578; CGSCC: if.then3:579; CGSCC-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef 2, i8 noundef 3, i8 undef)580; CGSCC-NEXT: call void @use_4_i8(i8 noundef 1, i8 noundef 2, i8 noundef 3, i8 noundef 4)581; CGSCC-NEXT: br label [[IF_END]]582; CGSCC: if.end:583; CGSCC-NEXT: call void @use_4_i8(i8 noundef 1, i8 2, i8 3, i8 4)584; CGSCC-NEXT: ret void585;586entry:587 %alloc = alloca i8, i32 4588 %gep0 = getelementptr inbounds i8, ptr %alloc, i64 0589 %gep1 = getelementptr inbounds i8, ptr %alloc, i64 1590 %gep2 = getelementptr inbounds i8, ptr %alloc, i64 2591 %gep3 = getelementptr inbounds i8, ptr %alloc, i64 3592 593 %l0_a = load i8, ptr %gep0594 %l1_a = load i8, ptr %gep1595 %l2_a = load i8, ptr %gep2596 %l3_a = load i8, ptr %gep3597 call void @use_4_i8(i8 %l0_a, i8 %l1_a, i8 %l2_a, i8 %l3_a)598 599 store i8 1, ptr %gep0, align 4600 601 %l0_b = load i8, ptr %gep0602 %l1_b = load i8, ptr %gep1603 %l2_b = load i8, ptr %gep2604 %l3_b = load i8, ptr %gep3605 call void @use_4_i8(i8 %l0_b, i8 %l1_b, i8 %l2_b, i8 %l3_b)606 607 br i1 %c1, label %if.merge1, label %if.then608 609if.then:610 %l0_c = load i8, ptr %gep0611 %l1_c = load i8, ptr %gep1612 %l2_c = load i8, ptr %gep2613 %l3_c = load i8, ptr %gep3614 call void @use_4_i8(i8 %l0_c, i8 %l1_c, i8 %l2_c, i8 %l3_c)615 616 store i8 2, ptr %gep1, align 4617 618 %l0_d = load i8, ptr %gep0619 %l1_d = load i8, ptr %gep1620 %l2_d = load i8, ptr %gep2621 %l3_d = load i8, ptr %gep3622 call void @use_4_i8(i8 %l0_d, i8 %l1_d, i8 %l2_d, i8 %l3_d)623 624 br i1 %c1, label %if.merge1, label %if.then2625 626if.then2:627 %l0_e = load i8, ptr %gep0628 %l1_e = load i8, ptr %gep1629 %l2_e = load i8, ptr %gep2630 %l3_e = load i8, ptr %gep3631 call void @use_4_i8(i8 %l0_e, i8 %l1_e, i8 %l2_e, i8 %l3_e)632 633 store i8 3, ptr %gep2, align 4634 635 %l0_f = load i8, ptr %gep0636 %l1_f = load i8, ptr %gep1637 %l2_f = load i8, ptr %gep2638 %l3_f = load i8, ptr %gep3639 call void @use_4_i8(i8 %l0_f, i8 %l1_f, i8 %l2_f, i8 %l3_f)640 641 br i1 %c2, label %if.merge2, label %if.then3642 643if.merge1:644 645 %l0_g = load i8, ptr %gep0646 %l1_g = load i8, ptr %gep1647 %l2_g = load i8, ptr %gep2648 %l3_g = load i8, ptr %gep3649 call void @use_4_i8(i8 %l0_g, i8 %l1_g, i8 %l2_g, i8 %l3_g)650 651 br label %if.merge2652 653if.merge2:654 655 %l0_h = load i8, ptr %gep0656 %l1_h = load i8, ptr %gep1657 %l2_h = load i8, ptr %gep2658 %l3_h = load i8, ptr %gep3659 call void @use_4_i8(i8 %l0_h, i8 %l1_h, i8 %l2_h, i8 %l3_h)660 661 br label %if.end662 663if.then3:664 665 %l0_i = load i8, ptr %gep0666 %l1_i = load i8, ptr %gep1667 %l2_i = load i8, ptr %gep2668 %l3_i = load i8, ptr %gep3669 call void @use_4_i8(i8 %l0_i, i8 %l1_i, i8 %l2_i, i8 %l3_i)670 671 store i8 4, ptr %gep3, align 4672 673 %l0_j = load i8, ptr %gep0674 %l1_j = load i8, ptr %gep1675 %l2_j = load i8, ptr %gep2676 %l3_j = load i8, ptr %gep3677 call void @use_4_i8(i8 %l0_j, i8 %l1_j, i8 %l2_j, i8 %l3_j)678 679 br label %if.end680 681if.end:682 %l0_k = load i8, ptr %gep0683 %l1_k = load i8, ptr %gep1684 %l2_k = load i8, ptr %gep2685 %l3_k = load i8, ptr %gep3686 call void @use_4_i8(i8 %l0_k, i8 %l1_k, i8 %l2_k, i8 %l3_k)687 688 ret void689}690 691declare void @usei32(i32) nocallback nosync692define internal void @exclusion_set3_helper(i1 %c, ptr %p) {693; TUNIT: Function Attrs: nosync694; TUNIT-LABEL: define {{[^@]+}}@exclusion_set3_helper695; TUNIT-SAME: (i1 noundef [[C:%.*]], ptr noalias nofree noundef nonnull align 4 captures(none) dereferenceable(4) [[P:%.*]]) #[[ATTR8:[0-9]+]] {696; TUNIT-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]697; TUNIT: t:698; TUNIT-NEXT: store i32 42, ptr [[P]], align 4699; TUNIT-NEXT: br label [[M:%.*]]700; TUNIT: f:701; TUNIT-NEXT: [[L:%.*]] = load i32, ptr [[P]], align 4702; TUNIT-NEXT: [[ADD:%.*]] = add i32 [[L]], 1703; TUNIT-NEXT: store i32 [[ADD]], ptr [[P]], align 4704; TUNIT-NEXT: [[CND:%.*]] = icmp eq i32 [[L]], 100705; TUNIT-NEXT: br i1 [[CND]], label [[F2:%.*]], label [[F]]706; TUNIT: f2:707; TUNIT-NEXT: [[USE1:%.*]] = load i32, ptr [[P]], align 4708; TUNIT-NEXT: call void @usei32(i32 [[USE1]])709; TUNIT-NEXT: store i32 77, ptr [[P]], align 4710; TUNIT-NEXT: call void @exclusion_set3_helper(i1 noundef true, ptr noalias nofree noundef nonnull align 4 captures(none) dereferenceable(4) [[P]]) #[[ATTR8]]711; TUNIT-NEXT: [[USE2:%.*]] = load i32, ptr [[P]], align 4712; TUNIT-NEXT: call void @usei32(i32 noundef [[USE2]])713; TUNIT-NEXT: br label [[T]]714; TUNIT: m:715; TUNIT-NEXT: call void @usei32(i32 noundef 42)716; TUNIT-NEXT: ret void717;718; CGSCC: Function Attrs: nosync719; CGSCC-LABEL: define {{[^@]+}}@exclusion_set3_helper720; CGSCC-SAME: (i1 noundef [[C:%.*]], ptr noalias nofree noundef nonnull align 4 captures(none) dereferenceable(4) [[P:%.*]]) #[[ATTR5]] {721; CGSCC-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]722; CGSCC: t:723; CGSCC-NEXT: store i32 42, ptr [[P]], align 4724; CGSCC-NEXT: br label [[M:%.*]]725; CGSCC: f:726; CGSCC-NEXT: [[L:%.*]] = load i32, ptr [[P]], align 4727; CGSCC-NEXT: [[ADD:%.*]] = add i32 [[L]], 1728; CGSCC-NEXT: store i32 [[ADD]], ptr [[P]], align 4729; CGSCC-NEXT: [[CND:%.*]] = icmp eq i32 [[L]], 100730; CGSCC-NEXT: br i1 [[CND]], label [[F2:%.*]], label [[F]]731; CGSCC: f2:732; CGSCC-NEXT: [[USE1:%.*]] = load i32, ptr [[P]], align 4733; CGSCC-NEXT: call void @usei32(i32 [[USE1]])734; CGSCC-NEXT: store i32 77, ptr [[P]], align 4735; CGSCC-NEXT: call void @exclusion_set3_helper(i1 noundef true, ptr noalias nofree noundef nonnull align 4 captures(none) dereferenceable(4) [[P]]) #[[ATTR5]]736; CGSCC-NEXT: [[USE2:%.*]] = load i32, ptr [[P]], align 4737; CGSCC-NEXT: call void @usei32(i32 [[USE2]])738; CGSCC-NEXT: br label [[T]]739; CGSCC: m:740; CGSCC-NEXT: [[USE3:%.*]] = load i32, ptr [[P]], align 4741; CGSCC-NEXT: call void @usei32(i32 [[USE3]])742; CGSCC-NEXT: ret void743;744 br i1 %c, label %t, label %f745t:746 store i32 42, ptr %p747 br label %m748f:749 %l = load i32, ptr %p750 %add = add i32 %l, 1751 store i32 %add, ptr %p752 %cnd = icmp eq i32 %l, 100753 br i1 %cnd, label %f2, label %f754f2:755 %use1 = load i32, ptr %p756 call void @usei32(i32 %use1)757 store i32 77, ptr %p758 call void @exclusion_set3_helper(i1 true, ptr %p)759 %use2 = load i32, ptr %p760 call void @usei32(i32 %use2)761 br label %t762m:763 %use3 = load i32, ptr %p764 call void @usei32(i32 %use3)765 ret void766}767 768define i32 @exclusion_set3(i1 %c) {769; TUNIT: Function Attrs: norecurse nosync770; TUNIT-LABEL: define {{[^@]+}}@exclusion_set3771; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR5]] {772; TUNIT-NEXT: [[A:%.*]] = alloca i32, align 4773; TUNIT-NEXT: store i32 3, ptr [[A]], align 4774; TUNIT-NEXT: call void @exclusion_set3_helper(i1 noundef [[C]], ptr noalias nofree noundef nonnull align 4 captures(none) dereferenceable(4) [[A]]) #[[ATTR8]]775; TUNIT-NEXT: [[FINAL:%.*]] = load i32, ptr [[A]], align 4776; TUNIT-NEXT: ret i32 [[FINAL]]777;778; CGSCC: Function Attrs: nosync779; CGSCC-LABEL: define {{[^@]+}}@exclusion_set3780; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR5]] {781; CGSCC-NEXT: [[A:%.*]] = alloca i32, align 4782; CGSCC-NEXT: store i32 3, ptr [[A]], align 4783; CGSCC-NEXT: call void @exclusion_set3_helper(i1 noundef [[C]], ptr noalias nofree noundef nonnull align 4 captures(none) dereferenceable(4) [[A]])784; CGSCC-NEXT: [[FINAL:%.*]] = load i32, ptr [[A]], align 4785; CGSCC-NEXT: ret i32 [[FINAL]]786;787 %a = alloca i32788 store i32 3, ptr %a789 call void @exclusion_set3_helper(i1 %c, ptr %a)790 %final = load i32, ptr %a791 ret i32 %final792}793 794@B = global i32 0795 796define internal i32 @readI32(ptr %a) {797; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(readwrite, argmem: none)798; TUNIT-LABEL: define {{[^@]+}}@readI32799; TUNIT-SAME: (i32 [[TMP0:%.*]]) #[[ATTR9:[0-9]+]] {800; TUNIT-NEXT: [[A_PRIV:%.*]] = alloca i32, align 4801; TUNIT-NEXT: store i32 [[TMP0]], ptr [[A_PRIV]], align 4802; TUNIT-NEXT: [[R:%.*]] = load i32, ptr [[A_PRIV]], align 4803; TUNIT-NEXT: store i32 1, ptr @B, align 4804; TUNIT-NEXT: ret i32 [[R]]805;806; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn807; CGSCC-LABEL: define {{[^@]+}}@readI32808; CGSCC-SAME: (ptr nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A:%.*]]) #[[ATTR9:[0-9]+]] {809; CGSCC-NEXT: [[R:%.*]] = load i32, ptr [[A]], align 4810; CGSCC-NEXT: store i32 1, ptr @B, align 4811; CGSCC-NEXT: ret i32 [[R]]812;813 %r = load i32, ptr %a814 store i32 1, ptr @B815 ret i32 %r816}817 818define internal i32 @broker(ptr %a) {819; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(readwrite, argmem: none)820; TUNIT-LABEL: define {{[^@]+}}@broker821; TUNIT-SAME: (i32 [[TMP0:%.*]]) #[[ATTR9]] {822; TUNIT-NEXT: [[A_PRIV:%.*]] = alloca i32, align 4823; TUNIT-NEXT: store i32 [[TMP0]], ptr [[A_PRIV]], align 4824; TUNIT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A_PRIV]], align 4825; TUNIT-NEXT: [[R:%.*]] = call i32 @readI32(i32 [[TMP2]]) #[[ATTR13:[0-9]+]]826; TUNIT-NEXT: ret i32 [[R]]827;828; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(readwrite, argmem: none)829; CGSCC-LABEL: define {{[^@]+}}@broker830; CGSCC-SAME: (i32 [[TMP0:%.*]]) #[[ATTR10:[0-9]+]] {831; CGSCC-NEXT: [[A_PRIV:%.*]] = alloca i32, align 4832; CGSCC-NEXT: store i32 [[TMP0]], ptr [[A_PRIV]], align 4833; CGSCC-NEXT: [[R:%.*]] = call i32 @readI32(ptr noalias nofree noundef nonnull readonly align 4 captures(none) dereferenceable(4) [[A_PRIV]]) #[[ATTR14:[0-9]+]]834; CGSCC-NEXT: ret i32 [[R]]835;836 %r = call i32 @readI32(ptr %a)837 ret i32 %r838}839 840; FIXME: This function should return 1, not 0841define i32 @two_calls() {842; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn843; TUNIT-LABEL: define {{[^@]+}}@two_calls844; TUNIT-SAME: () #[[ATTR10:[0-9]+]] {845; TUNIT-NEXT: [[A:%.*]] = alloca i32, align 4846; TUNIT-NEXT: store i32 0, ptr [[A]], align 4847; TUNIT-NEXT: [[TMP1:%.*]] = load i32, ptr [[A]], align 4848; TUNIT-NEXT: [[D:%.*]] = call i32 @broker(i32 [[TMP1]]) #[[ATTR13]]849; TUNIT-NEXT: store i32 1, ptr [[A]], align 4850; TUNIT-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 4851; TUNIT-NEXT: [[R:%.*]] = call i32 @broker(i32 [[TMP2]]) #[[ATTR13]]852; TUNIT-NEXT: ret i32 [[R]]853;854; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn855; CGSCC-LABEL: define {{[^@]+}}@two_calls856; CGSCC-SAME: () #[[ATTR11:[0-9]+]] {857; CGSCC-NEXT: [[A:%.*]] = alloca i32, align 4858; CGSCC-NEXT: store i32 0, ptr [[A]], align 4859; CGSCC-NEXT: [[TMP1:%.*]] = load i32, ptr [[A]], align 4860; CGSCC-NEXT: [[D:%.*]] = call i32 @broker(i32 noundef [[TMP1]]) #[[ATTR14]]861; CGSCC-NEXT: store i32 1, ptr [[A]], align 4862; CGSCC-NEXT: [[R:%.*]] = call i32 @broker(i32 noundef 1) #[[ATTR14]]863; CGSCC-NEXT: ret i32 [[R]]864;865 %a = alloca i32866 store i32 0, ptr %a867 %d = call i32 @broker(ptr %a)868 store i32 1, ptr %a869 %r = call i32 @broker(ptr %a)870 ret i32 %r871}872 873;.874; TUNIT: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) }875; TUNIT: attributes #[[ATTR1:[0-9]+]] = { nocallback nosync }876; TUNIT: attributes #[[ATTR2:[0-9]+]] = { allockind("free") "alloc-family"="malloc" }877; TUNIT: attributes #[[ATTR3:[0-9]+]] = { allockind("alloc,zeroed") allocsize(0,1) "alloc-family"="malloc" }878; TUNIT: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) }879; TUNIT: attributes #[[ATTR5]] = { norecurse nosync }880; TUNIT: attributes #[[ATTR6]] = { nocallback }881; TUNIT: attributes #[[ATTR7]] = { norecurse }882; TUNIT: attributes #[[ATTR8]] = { nosync }883; TUNIT: attributes #[[ATTR9]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(readwrite, argmem: none) }884; TUNIT: attributes #[[ATTR10]] = { mustprogress nofree norecurse nosync nounwind willreturn }885; TUNIT: attributes #[[ATTR11:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) }886; TUNIT: attributes #[[ATTR12]] = { nosync nounwind memory(write) }887; TUNIT: attributes #[[ATTR13]] = { nofree nosync nounwind willreturn }888;.889; CGSCC: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) }890; CGSCC: attributes #[[ATTR1:[0-9]+]] = { nocallback nosync }891; CGSCC: attributes #[[ATTR2:[0-9]+]] = { allockind("free") "alloc-family"="malloc" }892; CGSCC: attributes #[[ATTR3:[0-9]+]] = { allockind("alloc,zeroed") allocsize(0,1) "alloc-family"="malloc" }893; CGSCC: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) }894; CGSCC: attributes #[[ATTR5]] = { nosync }895; CGSCC: attributes #[[ATTR6]] = { norecurse nosync }896; CGSCC: attributes #[[ATTR7]] = { nocallback }897; CGSCC: attributes #[[ATTR8]] = { norecurse }898; CGSCC: attributes #[[ATTR9]] = { mustprogress nofree norecurse nosync nounwind willreturn }899; CGSCC: attributes #[[ATTR10]] = { mustprogress nofree nosync nounwind willreturn memory(readwrite, argmem: none) }900; CGSCC: attributes #[[ATTR11]] = { mustprogress nofree nosync nounwind willreturn }901; CGSCC: attributes #[[ATTR12:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) }902; CGSCC: attributes #[[ATTR13]] = { nounwind memory(write) }903; CGSCC: attributes #[[ATTR14]] = { nofree nounwind willreturn }904;.905