[llvm] r303475 - [NewGVN] Create a StoreExpression instead of a VariableExpression.

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Fri May 19 17:46:54 PDT 2017


Author: davide
Date: Fri May 19 19:46:54 2017
New Revision: 303475

URL: http://llvm.org/viewvc/llvm-project?rev=303475&view=rev
Log:
[NewGVN] Create a StoreExpression instead of a VariableExpression.

In the case where we have an operand defined by a lod of the
same memory location. Historically this was a VariableExpression
because we wanted to make sure they ended up in the same class,
but if we create the right expression, they end up in the same
class anyway.

Fixes PR32897. Thanks to Dan for the detailed discussion and the
fix suggestion.

Added:
    llvm/trunk/test/Transforms/NewGVN/pr32897.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp?rev=303475&r1=303474&r2=303475&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp Fri May 19 19:46:54 2017
@@ -1251,7 +1251,7 @@ const Expression *NewGVN::performSymboli
            lookupOperandLeader(SI->getPointerOperand())) &&
           (lookupMemoryLeader(getMemoryAccess(LI)->getDefiningAccess()) ==
            StoreRHS))
-        return createVariableExpression(LI);
+        return createStoreExpression(SI, StoreRHS);
     }
   }
 

Added: llvm/trunk/test/Transforms/NewGVN/pr32897.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/NewGVN/pr32897.ll?rev=303475&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/NewGVN/pr32897.ll (added)
+++ llvm/trunk/test/Transforms/NewGVN/pr32897.ll Fri May 19 19:46:54 2017
@@ -0,0 +1,26 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -newgvn %s | FileCheck %s
+
+define void @tinkywinky(i64* %b) {
+; CHECK-LABEL: @tinkywinky(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[BODY:%.*]]
+; CHECK:       body:
+; CHECK-NEXT:    store i64 undef, i64* [[B:%.*]]
+; CHECK-NEXT:    [[B2:%.*]] = load i64, i64* [[B]]
+; CHECK-NEXT:    br i1 undef, label [[BODY]], label [[END:%.*]]
+; CHECK:       end:
+; CHECK-NEXT:    br label [[BODY]]
+;
+entry:
+  br label %body
+body:
+  %d.1 = phi i64* [ undef, %entry ], [ %d.1, %body ], [ %b, %end ]
+  store i64 undef, i64* %d.1
+  %b2 = load i64, i64* %b
+  %or = or i64 %b2, 0
+  store i64 %or, i64* %b
+  br i1 undef, label %body, label %end
+end:
+  br label %body
+}




More information about the llvm-commits mailing list