summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Doerfert <jdoerfert@anl.gov>2019-08-23 15:24:57 +0000
committerJohannes Doerfert <jdoerfert@anl.gov>2019-08-23 15:24:57 +0000
commit9543f1498c30bad385474d9886c373a91724d28f (patch)
tree6f071ef0b0b555dd9db0ed995d3934b8965ab67b
parent695089ecfb2b851143cd801e01f479b4f1b8e05f (diff)
downloadbcm5719-llvm-9543f1498c30bad385474d9886c373a91724d28f.tar.gz
bcm5719-llvm-9543f1498c30bad385474d9886c373a91724d28f.zip
[Attributor] FIX: Treat new attributes as changed ones
Summary: When we have new attributes and we end the fixpoint iteration because the iteration limit is reached, we need to treat the new ones as if they changed in the last iteration, as they might have. This adds a test for which we should not derive anything regardless of the iteration limit, e.g., if we abort there should not be any attributes manifested in the IR. Reviewers: uenoku, sstefan1 Subscribers: hiraditya, bollu, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D66549 llvm-svn: 369768
-rw-r--r--llvm/lib/Transforms/IPO/Attributor.cpp10
-rw-r--r--llvm/test/Transforms/FunctionAttrs/new_attributes.ll43
2 files changed, 48 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp
index 392a43ada74..373e491c846 100644
--- a/llvm/lib/Transforms/IPO/Attributor.cpp
+++ b/llvm/lib/Transforms/IPO/Attributor.cpp
@@ -2397,16 +2397,16 @@ ChangeStatus Attributor::run() {
if (AA->update(*this) == ChangeStatus::CHANGED)
ChangedAAs.push_back(AA);
+ // Add attributes to the changed set if they have been created in the last
+ // iteration.
+ ChangedAAs.append(AllAbstractAttributes.begin() + NumAAs,
+ AllAbstractAttributes.end());
+
// Reset the work list and repopulate with the changed abstract attributes.
// Note that dependent ones are added above.
Worklist.clear();
Worklist.insert(ChangedAAs.begin(), ChangedAAs.end());
- // Add attributes to the worklist that have been created in the last
- // iteration.
- Worklist.insert(AllAbstractAttributes.begin() + NumAAs,
- AllAbstractAttributes.end());
-
} while (!Worklist.empty() && ++IterationCounter < MaxFixpointIterations);
size_t NumFinalAAs = AllAbstractAttributes.size();
diff --git a/llvm/test/Transforms/FunctionAttrs/new_attributes.ll b/llvm/test/Transforms/FunctionAttrs/new_attributes.ll
new file mode 100644
index 00000000000..d2f6854bd3c
--- /dev/null
+++ b/llvm/test/Transforms/FunctionAttrs/new_attributes.ll
@@ -0,0 +1,43 @@
+; RUN: opt < %s -attributor -attributor-disable=false -attributor-max-iterations=0 -S | FileCheck %s
+; RUN: opt < %s -attributor -attributor-disable=false -attributor-max-iterations=1 -S | FileCheck %s
+; RUN: opt < %s -attributor -attributor-disable=false -attributor-max-iterations=2 -S | FileCheck %s
+; RUN: opt < %s -attributor -attributor-disable=false -attributor-max-iterations=3 -S | FileCheck %s
+; RUN: opt < %s -attributor -attributor-disable=false -attributor-max-iterations=4 -S | FileCheck %s
+; RUN: opt < %s -attributor -attributor-disable=false -attributor-max-iterations=2147483647 -S | FileCheck %s
+
+; CHECK-NOT: Function
+; CHECK: declare i32 @foo1()
+; CHECK-NOT: Function
+; CHECK: declare i32 @foo2()
+; CHECK-NOT: Function
+; CHECK: declare i32 @foo3()
+declare i32 @foo1()
+declare i32 @foo2()
+declare i32 @foo3()
+
+; CHECK-NOT: Function
+; CHECK: define internal i32 @bar() {
+; CHECK-NEXT: %1 = call i32 @foo1()
+; CHECK-NEXT: %2 = call i32 @foo2()
+; CHECK-NEXT: %3 = call i32 @foo3()
+; CHECK-NEXT: ret i32 1
+; CHECK-NEXT: }
+define internal i32 @bar() {
+ %1 = call i32 @foo1()
+ %2 = call i32 @foo2()
+ %3 = call i32 @foo3()
+ ret i32 1
+}
+
+; CHECK-NOT: Function
+; CHECK: define i32 @baz() {
+; CHECK-NEXT: %1 = call i32 @bar()
+; CHECK-NEXT: ret i32 0
+; CHECK-NEXT: }
+define i32 @baz() {
+ %1 = call i32 @bar()
+ ret i32 0
+}
+
+; We should never derive anything here
+; CHECK-NOT: attributes
OpenPOWER on IntegriCloud