[Attributor] Use existing `returned` information better
authorJohannes Doerfert <johannes@jdoerfert.de>
Thu, 20 Feb 2020 05:39:57 +0000 (23:39 -0600)
committerJohannes Doerfert <johannes@jdoerfert.de>
Thu, 20 Feb 2020 05:46:07 +0000 (23:46 -0600)
We can look through calls with `returned` argument attributes when we
collect subsuming positions. This allows us to get existing attributes
from more places.

llvm/lib/Transforms/IPO/Attributor.cpp
llvm/test/Transforms/Attributor/returned.ll

index bb3fcae..98a0a59 100644 (file)
@@ -645,6 +645,14 @@ SubsumingPositionIterator::SubsumingPositionIterator(const IRPosition &IRP) {
       if (const Function *Callee = ICS.getCalledFunction()) {
         IRPositions.emplace_back(IRPosition::returned(*Callee));
         IRPositions.emplace_back(IRPosition::function(*Callee));
+        for (const Argument &Arg : Callee->args())
+          if (Arg.hasReturnedAttr()) {
+            IRPositions.emplace_back(
+                IRPosition::callsite_argument(ICS, Arg.getArgNo()));
+            IRPositions.emplace_back(
+                IRPosition::value(*ICS.getArgOperand(Arg.getArgNo())));
+            IRPositions.emplace_back(IRPosition::argument(Arg));
+          }
       }
     }
     IRPositions.emplace_back(
index 0fe094b..e8b031b 100644 (file)
@@ -771,26 +771,35 @@ define weak_odr i32 @non_exact_1(i32 %a) {
 define weak_odr i32 @non_exact_2(i32 returned %a) {
   ret i32 %a
 }
-define weak_odr i32* @non_exact_3(i32* align 32 returned %a) {
+define weak_odr align 16 i32* @non_exact_3(i32* align 32 returned %a) {
   ret i32* %a
 }
-define i32 @exact(i32* %a) {
+define weak_odr align 16 i32* @non_exact_4(i32* align 32 %a) {
+  ret i32* %a
+}
+define i32 @exact(i32* align 8 %a, i32* align 8 %b) {
   %c0 = call i32 @non_exact_0()
   %c1 = call i32 @non_exact_1(i32 1)
   %c2 = call i32 @non_exact_2(i32 2)
   %c3 = call i32* @non_exact_3(i32* %a)
-; We can use the information of the weak function non_exact_3 because it was
-; given to us and not derived (the alignment of the returned argument).
-; ATTRIBUTOR:  %c4 = load i32, i32* %c3
-  %c4 = load i32, i32* %c3
+  %c4 = call i32* @non_exact_4(i32* %b)
+; We can use the alignment information of the weak function non_exact_3 argument
+; because it was given to us and not derived.
+; ATTRIBUTOR:  %c3l = load i32, i32* %c3, align 32
+  %c3l = load i32, i32* %c3
+; We can use the return information of the weak function non_exact_4.
+; ATTRIBUTOR:  %c4l = load i32, i32* %c4, align 16
+  %c4l = load i32, i32* %c4
 ; FIXME: %c2 and %c3 should be replaced but not %c0 or %c1!
 ; ATTRIBUTOR:  %add1 = add i32 %c0, %c1
 ; ATTRIBUTOR:  %add2 = add i32 %add1, %c2
-; ATTRIBUTOR:  %add3 = add i32 %add2, %c4
+; ATTRIBUTOR:  %add3 = add i32 %add2, %c3l
+; ATTRIBUTOR:  %add4 = add i32 %add3, %c4l
   %add1 = add i32 %c0, %c1
   %add2 = add i32 %add1, %c2
-  %add3 = add i32 %add2, %c4
-  ret i32 %add3
+  %add3 = add i32 %add2, %c3l
+  %add4 = add i32 %add3, %c4l
+  ret i32 %add4
 }
 
 @G = external global i8