|
|
@@ -0,0 +1,221 @@ |
|
|
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals |
|
|
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=9 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM |
|
|
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=9 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM |
|
|
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM |
|
|
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM |
|
|
; |
|
|
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" |
|
|
|
|
|
%struct.S = type { i32, double, ptr } |
|
|
|
|
|
; struct S { |
|
|
; int a; |
|
|
; double b; |
|
|
; struct S* c; |
|
|
; }; |
|
|
; |
|
|
; static const struct S GlobalS = {42, 3.14, 0}; |
|
|
; |
|
|
; int testOneFieldGlobalS() { |
|
|
; int r = 0; |
|
|
; if (GlobalS.a != 42) |
|
|
; r += 1; |
|
|
; if (GlobalS.b == 3.14) |
|
|
; r += 2; |
|
|
; if (GlobalS.c) |
|
|
; r += 4; |
|
|
; return r; |
|
|
; } |
|
|
; |
|
|
@GlobalS = internal constant %struct.S { i32 42, double 3.140000e+00, ptr null }, align 8 |
|
|
|
|
|
;. |
|
|
; CHECK: @[[GLOBALS:[a-zA-Z0-9_$"\\.-]+]] = internal constant [[STRUCT_S:%.*]] { i32 42, double 3.140000e+00, ptr null }, align 8 |
|
|
;. |
|
|
define i32 @testOneFieldGlobalS() { |
|
|
; CHECK: Function Attrs: nofree norecurse nosync nounwind readnone willreturn |
|
|
; CHECK-LABEL: define {{[^@]+}}@testOneFieldGlobalS |
|
|
; CHECK-SAME: () #[[ATTR0:[0-9]+]] { |
|
|
; CHECK-NEXT: entry: |
|
|
; CHECK-NEXT: br label [[IF_END:%.*]] |
|
|
; CHECK: if.then: |
|
|
; CHECK-NEXT: unreachable |
|
|
; CHECK: if.end: |
|
|
; CHECK-NEXT: br label [[IF_THEN2:%.*]] |
|
|
; CHECK: if.then2: |
|
|
; CHECK-NEXT: [[ADD3:%.*]] = add nsw i32 0, 2 |
|
|
; CHECK-NEXT: br label [[IF_END4:%.*]] |
|
|
; CHECK: if.end4: |
|
|
; CHECK-NEXT: br label [[IF_END7:%.*]] |
|
|
; CHECK: if.then5: |
|
|
; CHECK-NEXT: unreachable |
|
|
; CHECK: if.end7: |
|
|
; CHECK-NEXT: ret i32 2 |
|
|
; |
|
|
entry: |
|
|
%i = load i32, ptr @GlobalS, align 8 |
|
|
%cmp = icmp ne i32 %i, 42 |
|
|
br i1 %cmp, label %if.then, label %if.end |
|
|
|
|
|
if.then: ; preds = %entry |
|
|
%add = add nsw i32 0, 1 |
|
|
br label %if.end |
|
|
|
|
|
if.end: ; preds = %if.then, %entry |
|
|
%r.0 = phi i32 [ %add, %if.then ], [ 0, %entry ] |
|
|
%i1 = load double, ptr getelementptr inbounds (%struct.S, ptr @GlobalS, i32 0, i32 1), align 8 |
|
|
%cmp1 = fcmp oeq double %i1, 3.140000e+00 |
|
|
br i1 %cmp1, label %if.then2, label %if.end4 |
|
|
|
|
|
if.then2: ; preds = %if.end |
|
|
%add3 = add nsw i32 %r.0, 2 |
|
|
br label %if.end4 |
|
|
|
|
|
if.end4: ; preds = %if.then2, %if.end |
|
|
%r.1 = phi i32 [ %add3, %if.then2 ], [ %r.0, %if.end ] |
|
|
%i2 = load ptr, ptr getelementptr inbounds (%struct.S, ptr @GlobalS, i32 0, i32 2), align 8 |
|
|
%tobool = icmp ne ptr %i2, null |
|
|
br i1 %tobool, label %if.then5, label %if.end7 |
|
|
|
|
|
if.then5: ; preds = %if.end4 |
|
|
%add6 = add nsw i32 %r.1, 4 |
|
|
br label %if.end7 |
|
|
|
|
|
if.end7: ; preds = %if.then5, %if.end4 |
|
|
%r.2 = phi i32 [ %add6, %if.then5 ], [ %r.1, %if.end4 ] |
|
|
ret i32 %r.2 |
|
|
} |
|
|
|
|
|
define i32 @testOneFieldGlobalS_type_mismatch() { |
|
|
; CHECK: Function Attrs: nofree norecurse nosync nounwind readnone willreturn |
|
|
; CHECK-LABEL: define {{[^@]+}}@testOneFieldGlobalS_type_mismatch |
|
|
; CHECK-SAME: () #[[ATTR0]] { |
|
|
; CHECK-NEXT: entry: |
|
|
; CHECK-NEXT: [[I:%.*]] = load double, ptr @GlobalS, align 8 |
|
|
; CHECK-NEXT: [[IC:%.*]] = fptosi double [[I]] to i32 |
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[IC]], 42 |
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] |
|
|
; CHECK: if.then: |
|
|
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 0, 1 |
|
|
; CHECK-NEXT: br label [[IF_END]] |
|
|
; CHECK: if.end: |
|
|
; CHECK-NEXT: [[R_0:%.*]] = phi i32 [ [[ADD]], [[IF_THEN]] ], [ 0, [[ENTRY:%.*]] ] |
|
|
; CHECK-NEXT: [[I1:%.*]] = load i64, ptr getelementptr inbounds ([[STRUCT_S:%.*]], ptr @GlobalS, i32 0, i32 1), align 8 |
|
|
; CHECK-NEXT: [[I1C:%.*]] = sitofp i64 [[I1]] to double |
|
|
; CHECK-NEXT: [[CMP1:%.*]] = fcmp oeq double [[I1C]], 3.140000e+00 |
|
|
; CHECK-NEXT: br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END4:%.*]] |
|
|
; CHECK: if.then2: |
|
|
; CHECK-NEXT: [[ADD3:%.*]] = add nsw i32 [[R_0]], 2 |
|
|
; CHECK-NEXT: br label [[IF_END4]] |
|
|
; CHECK: if.end4: |
|
|
; CHECK-NEXT: [[R_1:%.*]] = phi i32 [ [[ADD3]], [[IF_THEN2]] ], [ [[R_0]], [[IF_END]] ] |
|
|
; CHECK-NEXT: br label [[IF_END7:%.*]] |
|
|
; CHECK: if.then5: |
|
|
; CHECK-NEXT: unreachable |
|
|
; CHECK: if.end7: |
|
|
; CHECK-NEXT: ret i32 [[R_1]] |
|
|
; |
|
|
entry: |
|
|
%i = load double, ptr @GlobalS, align 8 |
|
|
%ic = fptosi double %i to i32 |
|
|
%cmp = icmp ne i32 %ic, 42 |
|
|
br i1 %cmp, label %if.then, label %if.end |
|
|
|
|
|
if.then: ; preds = %entry |
|
|
%add = add nsw i32 0, 1 |
|
|
br label %if.end |
|
|
|
|
|
if.end: ; preds = %if.then, %entry |
|
|
%r.0 = phi i32 [ %add, %if.then ], [ 0, %entry ] |
|
|
%i1 = load i64, ptr getelementptr inbounds (%struct.S, ptr @GlobalS, i32 0, i32 1), align 8 |
|
|
%i1c = sitofp i64 %i1 to double |
|
|
%cmp1 = fcmp oeq double %i1c, 3.140000e+00 |
|
|
br i1 %cmp1, label %if.then2, label %if.end4 |
|
|
|
|
|
if.then2: ; preds = %if.end |
|
|
%add3 = add nsw i32 %r.0, 2 |
|
|
br label %if.end4 |
|
|
|
|
|
if.end4: ; preds = %if.then2, %if.end |
|
|
%r.1 = phi i32 [ %add3, %if.then2 ], [ %r.0, %if.end ] |
|
|
%i2 = load i64, ptr getelementptr inbounds (%struct.S, ptr @GlobalS, i32 0, i32 2), align 8 |
|
|
%i2c = inttoptr i64 %i2 to ptr |
|
|
%tobool = icmp ne ptr %i2c, null |
|
|
br i1 %tobool, label %if.then5, label %if.end7 |
|
|
|
|
|
if.then5: ; preds = %if.end4 |
|
|
%add6 = add nsw i32 %r.1, 4 |
|
|
br label %if.end7 |
|
|
|
|
|
if.end7: ; preds = %if.then5, %if.end4 |
|
|
%r.2 = phi i32 [ %add6, %if.then5 ], [ %r.1, %if.end4 ] |
|
|
ret i32 %r.2 |
|
|
} |
|
|
|
|
|
define i32 @testOneFieldGlobalS_byte_offset_wrong() { |
|
|
; CHECK: Function Attrs: nofree norecurse nosync nounwind readnone willreturn |
|
|
; CHECK-LABEL: define {{[^@]+}}@testOneFieldGlobalS_byte_offset_wrong |
|
|
; CHECK-SAME: () #[[ATTR0]] { |
|
|
; CHECK-NEXT: entry: |
|
|
; CHECK-NEXT: [[I:%.*]] = load i32, ptr getelementptr inbounds (i32, ptr @GlobalS, i32 1), align 8 |
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[I]], 42 |
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] |
|
|
; CHECK: if.then: |
|
|
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 0, 1 |
|
|
; CHECK-NEXT: br label [[IF_END]] |
|
|
; CHECK: if.end: |
|
|
; CHECK-NEXT: [[R_0:%.*]] = phi i32 [ [[ADD]], [[IF_THEN]] ], [ 0, [[ENTRY:%.*]] ] |
|
|
; CHECK-NEXT: [[I1:%.*]] = load double, ptr getelementptr (double, ptr @GlobalS, i32 3), align 8 |
|
|
; CHECK-NEXT: [[CMP1:%.*]] = fcmp oeq double [[I1]], 3.140000e+00 |
|
|
; CHECK-NEXT: br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END4:%.*]] |
|
|
; CHECK: if.then2: |
|
|
; CHECK-NEXT: [[ADD3:%.*]] = add nsw i32 [[R_0]], 2 |
|
|
; CHECK-NEXT: br label [[IF_END4]] |
|
|
; CHECK: if.end4: |
|
|
; CHECK-NEXT: [[R_1:%.*]] = phi i32 [ [[ADD3]], [[IF_THEN2]] ], [ [[R_0]], [[IF_END]] ] |
|
|
; CHECK-NEXT: [[I2:%.*]] = load ptr, ptr getelementptr (ptr, ptr @GlobalS, i32 11), align 8 |
|
|
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne ptr [[I2]], null |
|
|
; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_THEN5:%.*]], label [[IF_END7:%.*]] |
|
|
; CHECK: if.then5: |
|
|
; CHECK-NEXT: [[ADD6:%.*]] = add nsw i32 [[R_1]], 4 |
|
|
; CHECK-NEXT: br label [[IF_END7]] |
|
|
; CHECK: if.end7: |
|
|
; CHECK-NEXT: [[R_2:%.*]] = phi i32 [ [[ADD6]], [[IF_THEN5]] ], [ [[R_1]], [[IF_END4]] ] |
|
|
; CHECK-NEXT: ret i32 [[R_2]] |
|
|
; |
|
|
entry: |
|
|
%i = load i32, ptr getelementptr (i32, ptr @GlobalS, i32 1), align 8 |
|
|
%cmp = icmp ne i32 %i, 42 |
|
|
br i1 %cmp, label %if.then, label %if.end |
|
|
|
|
|
if.then: ; preds = %entry |
|
|
%add = add nsw i32 0, 1 |
|
|
br label %if.end |
|
|
|
|
|
if.end: ; preds = %if.then, %entry |
|
|
%r.0 = phi i32 [ %add, %if.then ], [ 0, %entry ] |
|
|
%i1 = load double, ptr getelementptr (double, ptr @GlobalS, i32 3), align 8 |
|
|
%cmp1 = fcmp oeq double %i1, 3.140000e+00 |
|
|
br i1 %cmp1, label %if.then2, label %if.end4 |
|
|
|
|
|
if.then2: ; preds = %if.end |
|
|
%add3 = add nsw i32 %r.0, 2 |
|
|
br label %if.end4 |
|
|
|
|
|
if.end4: ; preds = %if.then2, %if.end |
|
|
%r.1 = phi i32 [ %add3, %if.then2 ], [ %r.0, %if.end ] |
|
|
%i2 = load ptr, ptr getelementptr (ptr, ptr @GlobalS, i32 11), align 8 |
|
|
%tobool = icmp ne ptr %i2, null |
|
|
br i1 %tobool, label %if.then5, label %if.end7 |
|
|
|
|
|
if.then5: ; preds = %if.end4 |
|
|
%add6 = add nsw i32 %r.1, 4 |
|
|
br label %if.end7 |
|
|
|
|
|
if.end7: ; preds = %if.then5, %if.end4 |
|
|
%r.2 = phi i32 [ %add6, %if.then5 ], [ %r.1, %if.end4 ] |
|
|
ret i32 %r.2 |
|
|
} |
|
|
;. |
|
|
; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind readnone willreturn } |
|
|
;. |