From 204f8c0a2417b8c38ee534811a8e1428e7699199 Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Sat, 20 May 2017 00:46:54 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303475 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/NewGVN.cpp | 2 +- test/Transforms/NewGVN/pr32897.ll | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 test/Transforms/NewGVN/pr32897.ll diff --git a/lib/Transforms/Scalar/NewGVN.cpp b/lib/Transforms/Scalar/NewGVN.cpp index 917872de807..fe55a3487a8 100644 --- a/lib/Transforms/Scalar/NewGVN.cpp +++ b/lib/Transforms/Scalar/NewGVN.cpp @@ -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 index 00000000000..eb19aa367b7 --- /dev/null +++ b/test/Transforms/NewGVN/pr32897.ll @@ -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 +} -- 2.50.1