From: Daniel Berlin Date: Sat, 18 Feb 2017 23:06:47 +0000 (+0000) Subject: NewGVN: Make ranking prefer undef to constants. Fix direction of X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=edd367e0f84b205c5d5a6af137030722074f9dc5;p=llvm NewGVN: Make ranking prefer undef to constants. Fix direction of shouldSwapOperands to be correct. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295582 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/NewGVN.cpp b/lib/Transforms/Scalar/NewGVN.cpp index 6f147d74bbd..8989d5cc2cc 100644 --- a/lib/Transforms/Scalar/NewGVN.cpp +++ b/lib/Transforms/Scalar/NewGVN.cpp @@ -2402,16 +2402,19 @@ bool NewGVN::eliminateInstructions(Function &F) { // we will simplify an operation with all constants so that it doesn't matter // what order they appear in. unsigned int NewGVN::getRank(const Value *V) const { - if (isa(V)) + // Prefer undef to anything else + if (isa(V)) return 0; + if (isa(V)) + return 1; else if (auto *A = dyn_cast(V)) - return 1 + A->getArgNo(); + return 2 + A->getArgNo(); - // Need to shift the instruction DFS by number of arguments + 2 to account for + // Need to shift the instruction DFS by number of arguments + 3 to account for // the constant and argument ranking above. unsigned Result = InstrDFS.lookup(V); if (Result > 0) - return 2 + NumFuncArgs + Result; + return 3 + NumFuncArgs + Result; // Unreachable or something else, just return a really large number. return ~0; } @@ -2421,8 +2424,6 @@ unsigned int NewGVN::getRank(const Value *V) const { bool NewGVN::shouldSwapOperands(const Value *A, const Value *B) const { // Because we only care about a total ordering, and don't rewrite expressions // in this order, we order by rank, which will give a strict weak ordering to - // everything but constants, and then we order by pointer address. This is - // not deterministic for constants, but it should not matter because any - // operation with only constants will be folded (except, usually, for undef). - return std::make_pair(getRank(B), B) > std::make_pair(getRank(A), A); + // everything but constants, and then we order by pointer address. + return std::make_pair(getRank(A), A) > std::make_pair(getRank(B), B); }