brintos

brintos / llvm-project-archived public Read only

0
0
Text · 35.6 KiB · a1b9d9a Raw
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