summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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