[cfe-commits] r162545 - in /cfe/trunk: lib/Analysis/CFG.cpp test/Sema/warn-unreachable.c
Chris Lattner
clattner at apple.com
Sat Aug 25 12:09:48 PDT 2012
On Aug 24, 2012, at 12:42 AM, Ted Kremenek <kremenek at apple.com> wrote:
> Author: kremenek
> Date: Fri Aug 24 02:42:09 2012
> New Revision: 162545
>
> URL: http://llvm.org/viewvc/llvm-project?rev=162545&view=rev
> Log:
> Teach CFG that 'if (x & 0)' and 'if (x * 0)' is an unfeasible branch.
Why not teach the general front-end constant folding logic (in lib/AST/ExprConstant.cpp) to handle this identity, and then just use it?
-Chris
>
> Fixes <rdar://problem/11005770>.
>
> Modified:
> cfe/trunk/lib/Analysis/CFG.cpp
> cfe/trunk/test/Sema/warn-unreachable.c
>
> Modified: cfe/trunk/lib/Analysis/CFG.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=162545&r1=162544&r2=162545&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Analysis/CFG.cpp (original)
> +++ cfe/trunk/lib/Analysis/CFG.cpp Fri Aug 24 02:42:09 2012
> @@ -467,6 +467,30 @@
> CachedBoolEvals[S] = Result; // update or insert
> return Result;
> }
> + else {
> + switch (Bop->getOpcode()) {
> + default: break;
> + // For 'x & 0' and 'x * 0', we can determine that
> + // the value is always false.
> + case BO_Mul:
> + case BO_And: {
> + // If either operand is zero, we know the value
> + // must be false.
> + llvm::APSInt IntVal;
> + if (Bop->getLHS()->EvaluateAsInt(IntVal, *Context)) {
> + if (IntVal.getBoolValue() == false) {
> + return TryResult(false);
> + }
> + }
> + if (Bop->getRHS()->EvaluateAsInt(IntVal, *Context)) {
> + if (IntVal.getBoolValue() == false) {
> + return TryResult(false);
> + }
> + }
> + }
> + break;
> + }
> + }
> }
>
> return evaluateAsBooleanConditionNoCache(S);
>
> Modified: cfe/trunk/test/Sema/warn-unreachable.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-unreachable.c?rev=162545&r1=162544&r2=162545&view=diff
> ==============================================================================
> --- cfe/trunk/test/Sema/warn-unreachable.c (original)
> +++ cfe/trunk/test/Sema/warn-unreachable.c Fri Aug 24 02:42:09 2012
> @@ -132,3 +132,12 @@
> s[i] = 0;
> }
>
> +// Test case for <rdar://problem/11005770>. We should treat code guarded
> +// by 'x & 0' and 'x * 0' as unreachable.
> +void calledFun();
> +void test_mul_and_zero(int x) {
> + if (x & 0) calledFun(); // expected-warning {{will never be executed}}
> + if (0 & x) calledFun(); // expected-warning {{will never be executed}}
> + if (x * 0) calledFun(); // expected-warning {{will never be executed}}
> + if (0 * x) calledFun(); // expected-warning {{will never be executed}}
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list