[cfe-commits] r126797 - in /cfe/trunk: lib/Analysis/CFG.cpp lib/StaticAnalyzer/Core/ExprEngine.cpp test/Analysis/misc-ps.m test/SemaCXX/array-bounds.cpp

Jeffrey Yasskin jyasskin at google.com
Thu Mar 3 14:14:35 PST 2011


On Tue, Mar 1, 2011 at 3:12 PM, Ted Kremenek <kremenek at apple.com> wrote:
> Author: kremenek
> Date: Tue Mar  1 17:12:55 2011
> New Revision: 126797
>
> URL: http://llvm.org/viewvc/llvm-project?rev=126797&view=rev
> Log:
> Teach CFGBuilder to prune trivially unreachable case statements.
>
> Modified:
>    cfe/trunk/lib/Analysis/CFG.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
>    cfe/trunk/test/Analysis/misc-ps.m
>    cfe/trunk/test/SemaCXX/array-bounds.cpp
>
> Modified: cfe/trunk/lib/Analysis/CFG.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=126797&r1=126796&r2=126797&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Analysis/CFG.cpp (original)
> +++ cfe/trunk/lib/Analysis/CFG.cpp Tue Mar  1 17:12:55 2011
> @@ -2213,6 +2237,44 @@
>
>   return Block;
>  }
> +
> +static bool shouldAddCase(bool &switchExclusivelyCovered,
> +                          const Expr::EvalResult &switchCond,
> +                          const CaseStmt *CS,
> +                          ASTContext &Ctx) {
> +  bool addCase = false;
> +
> +  if (!switchExclusivelyCovered) {
> +    if (switchCond.Val.isInt()) {
> +      // Evaluate the LHS of the case value.
> +      Expr::EvalResult V1;
> +      CS->getLHS()->Evaluate(V1, Ctx);
> +      assert(V1.Val.isInt());
> +      const llvm::APSInt &condInt = switchCond.Val.getInt();
> +      const llvm::APSInt &lhsInt = V1.Val.getInt();
> +
> +      if (condInt == lhsInt) {
> +        addCase = true;
> +        switchExclusivelyCovered = true;
> +      }
> +      else if (condInt < lhsInt) {

Hi Ted. I'm seeing an assertion failure here (synced to r126955) while
compiling gold saying that condInt.IsUnsigned==false, but
lhsInt.IsUnsigned==true. Does that indicate something obviously wrong
with this code, or would you like me to reduce a test case?

> +        if (const Expr *RHS = CS->getRHS()) {
> +          // Evaluate the RHS of the case value.
> +          Expr::EvalResult V2;
> +          RHS->Evaluate(V2, Ctx);
> +          assert(V2.Val.isInt());
> +          if (V2.Val.getInt() <= condInt) {
> +            addCase = true;
> +            switchExclusivelyCovered = true;
> +          }
> +        }
> +      }
> +    }
> +    else
> +      addCase = true;
> +  }
> +  return addCase;
> +}
>
>  CFGBlock* CFGBuilder::VisitCaseStmt(CaseStmt* CS) {
>   // CaseStmts are essentially labels, so they are the first statement in a




More information about the cfe-commits mailing list