]> granicus.if.org Git - llvm/commitdiff
[NewGVN] Create a StoreExpression instead of a VariableExpression.
authorDavide Italiano <davide@freebsd.org>
Sat, 20 May 2017 00:46:54 +0000 (00:46 +0000)
committerDavide Italiano <davide@freebsd.org>
Sat, 20 May 2017 00:46:54 +0000 (00:46 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303475 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/NewGVN.cpp
test/Transforms/NewGVN/pr32897.ll [new file with mode: 0644]

index 917872de8070ceea7a9bf8605d52a1c05330e8e1..fe55a3487a8f06ab00ca6e92e9559628cc43f30a 100644 (file)
@@ -1251,7 +1251,7 @@ const Expression *NewGVN::performSymbolicStoreEvaluation(Instruction *I) const {
            lookupOperandLeader(SI->getPointerOperand())) &&
           (lookupMemoryLeader(getMemoryAccess(LI)->getDefiningAccess()) ==
            StoreRHS))
-        return createVariableExpression(LI);
+        return createStoreExpression(SI, StoreRHS);
     }
   }
 
diff --git a/test/Transforms/NewGVN/pr32897.ll b/test/Transforms/NewGVN/pr32897.ll
new file mode 100644 (file)
index 0000000..eb19aa3
--- /dev/null
@@ -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
+}