1477e8e10SJohannes Doerfert; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals 223dafbb1SJohannes Doerfert; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT 356be9123SJohannes Doerfert; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC 4477e8e10SJohannes Doerfert; 5477e8e10SJohannes Doerferttarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 6477e8e10SJohannes Doerfert 7e1873614SJohannes Doerfert%struct.S = type { i32, double, ptr, i32 } 8477e8e10SJohannes Doerfert 9477e8e10SJohannes Doerfert; struct S { 10477e8e10SJohannes Doerfert; int a; 11477e8e10SJohannes Doerfert; double b; 12477e8e10SJohannes Doerfert; struct S* c; 13e1873614SJohannes Doerfert; int written; 14477e8e10SJohannes Doerfert; }; 15477e8e10SJohannes Doerfert; 16477e8e10SJohannes Doerfert; static const struct S GlobalS = {42, 3.14, 0}; 17477e8e10SJohannes Doerfert; 18477e8e10SJohannes Doerfert; int testOneFieldGlobalS() { 19477e8e10SJohannes Doerfert; int r = 0; 20477e8e10SJohannes Doerfert; if (GlobalS.a != 42) 21477e8e10SJohannes Doerfert; r += 1; 22477e8e10SJohannes Doerfert; if (GlobalS.b == 3.14) 23477e8e10SJohannes Doerfert; r += 2; 24477e8e10SJohannes Doerfert; if (GlobalS.c) 25477e8e10SJohannes Doerfert; r += 4; 26477e8e10SJohannes Doerfert; return r; 27477e8e10SJohannes Doerfert; } 28477e8e10SJohannes Doerfert; 29e1873614SJohannes Doerfert@GlobalS = internal constant %struct.S { i32 42, double 3.140000e+00, ptr null, i32 0 }, align 8 30477e8e10SJohannes Doerfert 3193e51fa4SJohannes Doerfertdeclare void @harmless_use(ptr nocapture readonly) nofree norecurse nosync nounwind readnone willreturn nocallback 3293e51fa4SJohannes Doerfert 33477e8e10SJohannes Doerfert;. 34*cd3a4c31SJohannes Doerfert; CHECK: @GlobalS = internal constant %struct.S { i32 42, double 3.140000e+00, ptr null, i32 0 }, align 8 35477e8e10SJohannes Doerfert;. 36e1873614SJohannes Doerfertdefine i32 @testOneFieldGlobalS(i32 %cmpx) { 37dbbe9b37SJohannes Doerfert; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(none) 38477e8e10SJohannes Doerfert; CHECK-LABEL: define {{[^@]+}}@testOneFieldGlobalS 39e1873614SJohannes Doerfert; CHECK-SAME: (i32 [[CMPX:%.*]]) #[[ATTR1:[0-9]+]] { 40477e8e10SJohannes Doerfert; CHECK-NEXT: entry: 41e1873614SJohannes Doerfert; CHECK-NEXT: [[RMW:%.*]] = atomicrmw add ptr getelementptr inbounds ([[STRUCT_S:%.*]], ptr @GlobalS, i32 0, i32 3), i32 1 monotonic, align 4 42e1873614SJohannes Doerfert; CHECK-NEXT: [[CXI:%.*]] = cmpxchg ptr getelementptr inbounds ([[STRUCT_S]], ptr @GlobalS, i32 0, i32 3), i32 [[CMPX]], i32 7 acq_rel monotonic, align 4 43477e8e10SJohannes Doerfert; CHECK-NEXT: br label [[IF_END:%.*]] 44477e8e10SJohannes Doerfert; CHECK: if.then: 45477e8e10SJohannes Doerfert; CHECK-NEXT: unreachable 46477e8e10SJohannes Doerfert; CHECK: if.end: 47477e8e10SJohannes Doerfert; CHECK-NEXT: br label [[IF_THEN2:%.*]] 48477e8e10SJohannes Doerfert; CHECK: if.then2: 49477e8e10SJohannes Doerfert; CHECK-NEXT: [[ADD3:%.*]] = add nsw i32 0, 2 50477e8e10SJohannes Doerfert; CHECK-NEXT: br label [[IF_END4:%.*]] 51477e8e10SJohannes Doerfert; CHECK: if.end4: 52477e8e10SJohannes Doerfert; CHECK-NEXT: br label [[IF_END7:%.*]] 53477e8e10SJohannes Doerfert; CHECK: if.then5: 54477e8e10SJohannes Doerfert; CHECK-NEXT: unreachable 55477e8e10SJohannes Doerfert; CHECK: if.end7: 56477e8e10SJohannes Doerfert; CHECK-NEXT: ret i32 2 57477e8e10SJohannes Doerfert; 58477e8e10SJohannes Doerfertentry: 59477e8e10SJohannes Doerfert %i = load i32, ptr @GlobalS, align 8 6093e51fa4SJohannes Doerfert call void @harmless_use(ptr @GlobalS) 61e1873614SJohannes Doerfert %rmw = atomicrmw add ptr getelementptr inbounds (%struct.S, ptr @GlobalS, i32 0, i32 3), i32 1 monotonic, align 4 62e1873614SJohannes Doerfert %cxi = cmpxchg ptr getelementptr inbounds (%struct.S, ptr @GlobalS, i32 0, i32 3), i32 %cmpx, i32 7 acq_rel monotonic 63477e8e10SJohannes Doerfert %cmp = icmp ne i32 %i, 42 64477e8e10SJohannes Doerfert br i1 %cmp, label %if.then, label %if.end 65477e8e10SJohannes Doerfert 66477e8e10SJohannes Doerfertif.then: ; preds = %entry 67477e8e10SJohannes Doerfert %add = add nsw i32 0, 1 68477e8e10SJohannes Doerfert br label %if.end 69477e8e10SJohannes Doerfert 70477e8e10SJohannes Doerfertif.end: ; preds = %if.then, %entry 71477e8e10SJohannes Doerfert %r.0 = phi i32 [ %add, %if.then ], [ 0, %entry ] 72477e8e10SJohannes Doerfert %i1 = load double, ptr getelementptr inbounds (%struct.S, ptr @GlobalS, i32 0, i32 1), align 8 73477e8e10SJohannes Doerfert %cmp1 = fcmp oeq double %i1, 3.140000e+00 74477e8e10SJohannes Doerfert br i1 %cmp1, label %if.then2, label %if.end4 75477e8e10SJohannes Doerfert 76477e8e10SJohannes Doerfertif.then2: ; preds = %if.end 77477e8e10SJohannes Doerfert %add3 = add nsw i32 %r.0, 2 78477e8e10SJohannes Doerfert br label %if.end4 79477e8e10SJohannes Doerfert 80477e8e10SJohannes Doerfertif.end4: ; preds = %if.then2, %if.end 81477e8e10SJohannes Doerfert %r.1 = phi i32 [ %add3, %if.then2 ], [ %r.0, %if.end ] 82477e8e10SJohannes Doerfert %i2 = load ptr, ptr getelementptr inbounds (%struct.S, ptr @GlobalS, i32 0, i32 2), align 8 83477e8e10SJohannes Doerfert %tobool = icmp ne ptr %i2, null 84477e8e10SJohannes Doerfert br i1 %tobool, label %if.then5, label %if.end7 85477e8e10SJohannes Doerfert 86477e8e10SJohannes Doerfertif.then5: ; preds = %if.end4 87477e8e10SJohannes Doerfert %add6 = add nsw i32 %r.1, 4 88477e8e10SJohannes Doerfert br label %if.end7 89477e8e10SJohannes Doerfert 90477e8e10SJohannes Doerfertif.end7: ; preds = %if.then5, %if.end4 91477e8e10SJohannes Doerfert %r.2 = phi i32 [ %add6, %if.then5 ], [ %r.1, %if.end4 ] 92477e8e10SJohannes Doerfert ret i32 %r.2 93477e8e10SJohannes Doerfert} 94477e8e10SJohannes Doerfert 95477e8e10SJohannes Doerfertdefine i32 @testOneFieldGlobalS_type_mismatch() { 96dbbe9b37SJohannes Doerfert; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) 97477e8e10SJohannes Doerfert; CHECK-LABEL: define {{[^@]+}}@testOneFieldGlobalS_type_mismatch 98e1873614SJohannes Doerfert; CHECK-SAME: () #[[ATTR2:[0-9]+]] { 99477e8e10SJohannes Doerfert; CHECK-NEXT: entry: 100874c0327SNikita Popov; CHECK-NEXT: br label [[IF_THEN:%.*]] 101477e8e10SJohannes Doerfert; CHECK: if.then: 102477e8e10SJohannes Doerfert; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 0, 1 103874c0327SNikita Popov; CHECK-NEXT: br label [[IF_END:%.*]] 104477e8e10SJohannes Doerfert; CHECK: if.end: 105874c0327SNikita Popov; CHECK-NEXT: br label [[IF_END4:%.*]] 106477e8e10SJohannes Doerfert; CHECK: if.then2: 107874c0327SNikita Popov; CHECK-NEXT: unreachable 108477e8e10SJohannes Doerfert; CHECK: if.end4: 109477e8e10SJohannes Doerfert; CHECK-NEXT: br label [[IF_END7:%.*]] 110477e8e10SJohannes Doerfert; CHECK: if.then5: 111477e8e10SJohannes Doerfert; CHECK-NEXT: unreachable 112477e8e10SJohannes Doerfert; CHECK: if.end7: 113874c0327SNikita Popov; CHECK-NEXT: ret i32 1 114477e8e10SJohannes Doerfert; 115477e8e10SJohannes Doerfertentry: 116477e8e10SJohannes Doerfert %i = load double, ptr @GlobalS, align 8 117477e8e10SJohannes Doerfert %ic = fptosi double %i to i32 118477e8e10SJohannes Doerfert %cmp = icmp ne i32 %ic, 42 119477e8e10SJohannes Doerfert br i1 %cmp, label %if.then, label %if.end 120477e8e10SJohannes Doerfert 121477e8e10SJohannes Doerfertif.then: ; preds = %entry 122477e8e10SJohannes Doerfert %add = add nsw i32 0, 1 123477e8e10SJohannes Doerfert br label %if.end 124477e8e10SJohannes Doerfert 125477e8e10SJohannes Doerfertif.end: ; preds = %if.then, %entry 126477e8e10SJohannes Doerfert %r.0 = phi i32 [ %add, %if.then ], [ 0, %entry ] 127477e8e10SJohannes Doerfert %i1 = load i64, ptr getelementptr inbounds (%struct.S, ptr @GlobalS, i32 0, i32 1), align 8 128477e8e10SJohannes Doerfert %i1c = sitofp i64 %i1 to double 129477e8e10SJohannes Doerfert %cmp1 = fcmp oeq double %i1c, 3.140000e+00 130477e8e10SJohannes Doerfert br i1 %cmp1, label %if.then2, label %if.end4 131477e8e10SJohannes Doerfert 132477e8e10SJohannes Doerfertif.then2: ; preds = %if.end 133477e8e10SJohannes Doerfert %add3 = add nsw i32 %r.0, 2 134477e8e10SJohannes Doerfert br label %if.end4 135477e8e10SJohannes Doerfert 136477e8e10SJohannes Doerfertif.end4: ; preds = %if.then2, %if.end 137477e8e10SJohannes Doerfert %r.1 = phi i32 [ %add3, %if.then2 ], [ %r.0, %if.end ] 138477e8e10SJohannes Doerfert %i2 = load i64, ptr getelementptr inbounds (%struct.S, ptr @GlobalS, i32 0, i32 2), align 8 139477e8e10SJohannes Doerfert %i2c = inttoptr i64 %i2 to ptr 140477e8e10SJohannes Doerfert %tobool = icmp ne ptr %i2c, null 141477e8e10SJohannes Doerfert br i1 %tobool, label %if.then5, label %if.end7 142477e8e10SJohannes Doerfert 143477e8e10SJohannes Doerfertif.then5: ; preds = %if.end4 144477e8e10SJohannes Doerfert %add6 = add nsw i32 %r.1, 4 145477e8e10SJohannes Doerfert br label %if.end7 146477e8e10SJohannes Doerfert 147477e8e10SJohannes Doerfertif.end7: ; preds = %if.then5, %if.end4 148477e8e10SJohannes Doerfert %r.2 = phi i32 [ %add6, %if.then5 ], [ %r.1, %if.end4 ] 149477e8e10SJohannes Doerfert ret i32 %r.2 150477e8e10SJohannes Doerfert} 151477e8e10SJohannes Doerfert 152477e8e10SJohannes Doerfertdefine i32 @testOneFieldGlobalS_byte_offset_wrong() { 153dbbe9b37SJohannes Doerfert; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) 154477e8e10SJohannes Doerfert; CHECK-LABEL: define {{[^@]+}}@testOneFieldGlobalS_byte_offset_wrong 155e1873614SJohannes Doerfert; CHECK-SAME: () #[[ATTR2]] { 156477e8e10SJohannes Doerfert; CHECK-NEXT: entry: 157874c0327SNikita Popov; CHECK-NEXT: br label [[IF_THEN:%.*]] 158477e8e10SJohannes Doerfert; CHECK: if.then: 159477e8e10SJohannes Doerfert; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 0, 1 160874c0327SNikita Popov; CHECK-NEXT: br label [[IF_END:%.*]] 161477e8e10SJohannes Doerfert; CHECK: if.end: 162477e8e10SJohannes Doerfert; CHECK-NEXT: [[I1:%.*]] = load double, ptr getelementptr (double, ptr @GlobalS, i32 3), align 8 163477e8e10SJohannes Doerfert; CHECK-NEXT: [[CMP1:%.*]] = fcmp oeq double [[I1]], 3.140000e+00 164477e8e10SJohannes Doerfert; CHECK-NEXT: br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END4:%.*]] 165477e8e10SJohannes Doerfert; CHECK: if.then2: 166874c0327SNikita Popov; CHECK-NEXT: [[ADD3:%.*]] = add nsw i32 1, 2 167477e8e10SJohannes Doerfert; CHECK-NEXT: br label [[IF_END4]] 168477e8e10SJohannes Doerfert; CHECK: if.end4: 169874c0327SNikita Popov; CHECK-NEXT: [[R_1:%.*]] = phi i32 [ [[ADD3]], [[IF_THEN2]] ], [ 1, [[IF_END]] ] 170874c0327SNikita Popov; CHECK-NEXT: br label [[IF_END7:%.*]] 17102a4fcecSJohannes Doerfert; CHECK: if.then5: 17202a4fcecSJohannes Doerfert; CHECK-NEXT: unreachable 173477e8e10SJohannes Doerfert; CHECK: if.end7: 17402a4fcecSJohannes Doerfert; CHECK-NEXT: ret i32 [[R_1]] 175477e8e10SJohannes Doerfert; 176477e8e10SJohannes Doerfertentry: 177477e8e10SJohannes Doerfert %i = load i32, ptr getelementptr (i32, ptr @GlobalS, i32 1), align 8 178477e8e10SJohannes Doerfert %cmp = icmp ne i32 %i, 42 179477e8e10SJohannes Doerfert br i1 %cmp, label %if.then, label %if.end 180477e8e10SJohannes Doerfert 181477e8e10SJohannes Doerfertif.then: ; preds = %entry 182477e8e10SJohannes Doerfert %add = add nsw i32 0, 1 183477e8e10SJohannes Doerfert br label %if.end 184477e8e10SJohannes Doerfert 185477e8e10SJohannes Doerfertif.end: ; preds = %if.then, %entry 186477e8e10SJohannes Doerfert %r.0 = phi i32 [ %add, %if.then ], [ 0, %entry ] 187477e8e10SJohannes Doerfert %i1 = load double, ptr getelementptr (double, ptr @GlobalS, i32 3), align 8 188477e8e10SJohannes Doerfert %cmp1 = fcmp oeq double %i1, 3.140000e+00 189477e8e10SJohannes Doerfert br i1 %cmp1, label %if.then2, label %if.end4 190477e8e10SJohannes Doerfert 191477e8e10SJohannes Doerfertif.then2: ; preds = %if.end 192477e8e10SJohannes Doerfert %add3 = add nsw i32 %r.0, 2 193477e8e10SJohannes Doerfert br label %if.end4 194477e8e10SJohannes Doerfert 195477e8e10SJohannes Doerfertif.end4: ; preds = %if.then2, %if.end 196477e8e10SJohannes Doerfert %r.1 = phi i32 [ %add3, %if.then2 ], [ %r.0, %if.end ] 19702a4fcecSJohannes Doerfert %i2 = load ptr, ptr getelementptr (ptr, ptr @GlobalS, i32 2), align 8 198477e8e10SJohannes Doerfert %tobool = icmp ne ptr %i2, null 199477e8e10SJohannes Doerfert br i1 %tobool, label %if.then5, label %if.end7 200477e8e10SJohannes Doerfert 201477e8e10SJohannes Doerfertif.then5: ; preds = %if.end4 202477e8e10SJohannes Doerfert %add6 = add nsw i32 %r.1, 4 203477e8e10SJohannes Doerfert br label %if.end7 204477e8e10SJohannes Doerfert 205477e8e10SJohannes Doerfertif.end7: ; preds = %if.then5, %if.end4 206477e8e10SJohannes Doerfert %r.2 = phi i32 [ %add6, %if.then5 ], [ %r.1, %if.end4 ] 207477e8e10SJohannes Doerfert ret i32 %r.2 208477e8e10SJohannes Doerfert} 209477e8e10SJohannes Doerfert;. 210304f1d59SNikita Popov; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree norecurse nosync nounwind willreturn memory(none) } 211dbbe9b37SJohannes Doerfert; CHECK: attributes #[[ATTR1]] = { mustprogress nofree norecurse nounwind willreturn memory(none) } 212dbbe9b37SJohannes Doerfert; CHECK: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } 213477e8e10SJohannes Doerfert;. 21423333bb6SJohannes Doerfert;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 21556be9123SJohannes Doerfert; CGSCC: {{.*}} 21656be9123SJohannes Doerfert; TUNIT: {{.*}} 217