D106720 introduced features that did not work properly as we could add new queries after a fixpoint was reached and which could not be answered by the information gathered up to the fixpoint alone. As an alternative to D110078, which forced eager computation where we want to continue to be lazy, this patch fixes the problem. QueryAAs are AAs that allow lazy queries during their lifetime. They are never fixed if they have no outstanding dependences and always run as part of the updates in an iteration. To determine if we are done, all query AAs are asked if they received new queries, if not, we only need to consider updated AAs, as before. If new queries are present we go for another iteration. Differential Revision: https://reviews.llvm.org/D118669
62 lines
3.7 KiB
LLVM
62 lines
3.7 KiB
LLVM
; 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=2 -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=2 -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
|
|
; PR 32917
|
|
|
|
@b = common local_unnamed_addr global i32 0, align 4
|
|
@a = common local_unnamed_addr global i32 0, align 4
|
|
|
|
;.
|
|
; CHECK: @[[B:[a-zA-Z0-9_$"\\.-]+]] = common local_unnamed_addr global i32 0, align 4
|
|
; CHECK: @[[A:[a-zA-Z0-9_$"\\.-]+]] = common local_unnamed_addr global i32 0, align 4
|
|
;.
|
|
define i32 @fn2() local_unnamed_addr {
|
|
; IS__TUNIT____: Function Attrs: nofree norecurse nosync nounwind willreturn
|
|
; IS__TUNIT____-LABEL: define {{[^@]+}}@fn2
|
|
; IS__TUNIT____-SAME: () local_unnamed_addr #[[ATTR0:[0-9]+]] {
|
|
; IS__TUNIT____-NEXT: [[TMP1:%.*]] = load i32, i32* @b, align 4
|
|
; IS__TUNIT____-NEXT: [[TMP2:%.*]] = sext i32 [[TMP1]] to i64
|
|
; IS__TUNIT____-NEXT: [[TMP3:%.*]] = inttoptr i64 [[TMP2]] to i32*
|
|
; IS__TUNIT____-NEXT: call fastcc void @fn1(i32* nocapture nofree readonly align 4 [[TMP3]]) #[[ATTR1:[0-9]+]]
|
|
; IS__TUNIT____-NEXT: ret i32 undef
|
|
;
|
|
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind willreturn
|
|
; IS__CGSCC____-LABEL: define {{[^@]+}}@fn2
|
|
; IS__CGSCC____-SAME: () local_unnamed_addr #[[ATTR0:[0-9]+]] {
|
|
; IS__CGSCC____-NEXT: [[TMP1:%.*]] = load i32, i32* @b, align 4
|
|
; IS__CGSCC____-NEXT: [[TMP2:%.*]] = sext i32 [[TMP1]] to i64
|
|
; IS__CGSCC____-NEXT: [[TMP3:%.*]] = inttoptr i64 [[TMP2]] to i32*
|
|
; IS__CGSCC____-NEXT: call fastcc void @fn1(i32* nocapture nofree nonnull readonly align 4 [[TMP3]]) #[[ATTR1:[0-9]+]]
|
|
; IS__CGSCC____-NEXT: ret i32 undef
|
|
;
|
|
%1 = load i32, i32* @b, align 4
|
|
%2 = sext i32 %1 to i64
|
|
%3 = inttoptr i64 %2 to i32*
|
|
call fastcc void @fn1(i32* %3)
|
|
ret i32 undef
|
|
}
|
|
|
|
define internal fastcc void @fn1(i32* nocapture readonly) unnamed_addr {
|
|
; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn
|
|
; CHECK-LABEL: define {{[^@]+}}@fn1
|
|
; CHECK-SAME: (i32* nocapture nofree nonnull readonly align 4 [[TMP0:%.*]]) unnamed_addr #[[ATTR0:[0-9]+]] {
|
|
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 -1
|
|
; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4
|
|
; CHECK-NEXT: store i32 [[TMP3]], i32* @a, align 4
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
%2 = getelementptr inbounds i32, i32* %0, i64 -1
|
|
%3 = load i32, i32* %2, align 4
|
|
store i32 %3, i32* @a, align 4
|
|
ret void
|
|
}
|
|
;.
|
|
; IS__TUNIT____: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn }
|
|
; IS__TUNIT____: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn }
|
|
;.
|
|
; IS__CGSCC____: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn }
|
|
; IS__CGSCC____: attributes #[[ATTR1]] = { nounwind willreturn }
|
|
;.
|