From 2675875099ef178aa047fab8d51370555fc744f5 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Fri, 19 Sep 2008 17:31:13 +0000 Subject: [PATCH] When we have a binary expression 'int operator symbol', properly rewrite this as 'symbol operator-reverse int'. This patch is a combination of code from Zhongxing Xu and myself (Zhongxing noticed this bug for the cases of relational operators). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56351 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/GRSimpleVals.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/Analysis/GRSimpleVals.cpp b/lib/Analysis/GRSimpleVals.cpp index 89f7c3e584..b33d5122b1 100644 --- a/lib/Analysis/GRSimpleVals.cpp +++ b/lib/Analysis/GRSimpleVals.cpp @@ -126,12 +126,13 @@ static unsigned char LNotOpMap[] = { RVal GRSimpleVals::DetermEvalBinOpNN(GRStateManager& StateMgr, BinaryOperator::Opcode Op, NonLVal L, NonLVal R) { - + BasicValueFactory& BasicVals = StateMgr.getBasicVals(); + unsigned subkind = L.getSubKind(); while (1) { - switch (L.getSubKind()) { + switch (subkind) { default: return UnknownVal(); @@ -169,18 +170,28 @@ RVal GRSimpleVals::DetermEvalBinOpNN(GRStateManager& StateMgr, if (isa(R)) { const nonlval::ConcreteInt& L_CI = cast(L); - const nonlval::ConcreteInt& R_CI = cast(R); + const nonlval::ConcreteInt& R_CI = cast(R); return L_CI.EvalBinOp(BasicVals, Op, R_CI); } else { + subkind = R.getSubKind(); NonLVal tmp = R; R = L; L = tmp; + + // Swap the operators. + switch (Op) { + case BinaryOperator::LT: Op = BinaryOperator::GT; break; + case BinaryOperator::GT: Op = BinaryOperator::LT; break; + case BinaryOperator::LE: Op = BinaryOperator::GE; break; + case BinaryOperator::GE: Op = BinaryOperator::LE; break; + default: break; + } + continue; } - case nonlval::SymbolValKind: { - + case nonlval::SymbolValKind: if (isa(R)) { const SymIntConstraint& C = BasicVals.getConstraint(cast(L).getSymbol(), Op, @@ -190,7 +201,6 @@ RVal GRSimpleVals::DetermEvalBinOpNN(GRStateManager& StateMgr, } else return UnknownVal(); - } } } } -- 2.40.0