[PATCH] D66549: [Attributor] FIX: Treat new attributes as changed ones

Johannes Doerfert via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 21 13:25:40 PDT 2019


jdoerfert created this revision.
jdoerfert added reviewers: uenoku, sstefan1.
Herald added subscribers: bollu, hiraditya.
Herald added a project: LLVM.

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.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D66549

Files:
  llvm/lib/Transforms/IPO/Attributor.cpp
  llvm/test/Transforms/FunctionAttrs/new_attributes.ll


Index: llvm/test/Transforms/FunctionAttrs/new_attributes.ll
===================================================================
--- /dev/null
+++ 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
Index: llvm/lib/Transforms/IPO/Attributor.cpp
===================================================================
--- llvm/lib/Transforms/IPO/Attributor.cpp
+++ llvm/lib/Transforms/IPO/Attributor.cpp
@@ -2487,16 +2487,16 @@
         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();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D66549.216460.patch
Type: text/x-patch
Size: 2776 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190821/9a5fc57f/attachment.bin>


More information about the llvm-commits mailing list