From f496e79f44f13ac80564f5f8e69aa648033e7889 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 12 Nov 2009 04:57:13 +0000 Subject: various fixes to the lattice transfer functions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86952 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/LazyValueInfo.cpp | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'lib/Analysis') diff --git a/lib/Analysis/LazyValueInfo.cpp b/lib/Analysis/LazyValueInfo.cpp index 659fa47..d569b85 100644 --- a/lib/Analysis/LazyValueInfo.cpp +++ b/lib/Analysis/LazyValueInfo.cpp @@ -141,19 +141,40 @@ public: if (RHS.isNotConstant()) { if (isNotConstant()) { - if (getNotConstant() != RHS.getNotConstant()) + if (getNotConstant() != RHS.getNotConstant() || + isa(getNotConstant()) || + isa(RHS.getNotConstant())) return markOverdefined(); return false; } - if (isConstant() && getConstant() != RHS.getNotConstant()) - return markOverdefined(); + if (isConstant()) { + if (getConstant() == RHS.getNotConstant() || + isa(RHS.getNotConstant()) || + isa(getConstant())) + return markOverdefined(); + return markNotConstant(RHS.getNotConstant()); + } + + assert(isUndefined() && "Unexpected lattice"); return markNotConstant(RHS.getNotConstant()); } - // RHS must be a constant, we must be undef or constant. - if (isConstant() && getConstant() != RHS.getConstant()) + // RHS must be a constant, we must be undef, constant, or notconstant. + if (isUndefined()) + return markConstant(RHS.getConstant()); + + if (isConstant()) { + if (getConstant() != RHS.getConstant()) + return markOverdefined(); + return false; + } + + // If we are known "!=4" and RHS is "==5", stay at "!=4". + if (getNotConstant() == RHS.getConstant() || + isa(getNotConstant()) || + isa(RHS.getConstant())) return markOverdefined(); - return markConstant(RHS.getConstant()); + return false; } }; -- cgit v1.1