[cfe-commits] r148359 - in /cfe/trunk: lib/CodeGen/CGStmt.cpp test/CodeGenCXX/switch-case-folding-2.cpp

Eli Friedman eli.friedman at gmail.com
Tue Jan 17 16:00:48 PST 2012


On Tue, Jan 17, 2012 at 3:39 PM, Fariborz Jahanian <fjahanian at apple.com> wrote:
> Author: fjahanian
> Date: Tue Jan 17 17:39:50 2012
> New Revision: 148359
>
> URL: http://llvm.org/viewvc/llvm-project?rev=148359&view=rev
> Log:
> Folding away unreachable case statement.
> patch (slightly revised) by Aaron Ballman.
>
>
> Added:
>    cfe/trunk/test/CodeGenCXX/switch-case-folding-2.cpp
> Modified:
>    cfe/trunk/lib/CodeGen/CGStmt.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=148359&r1=148358&r2=148359&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGStmt.cpp Tue Jan 17 17:39:50 2012
> @@ -883,10 +883,8 @@
>   // when we've constant-folded the switch, are emitting the constant case,
>   // and part of the constant case includes another case statement.  For
>   // instance: switch (4) { case 4: do { case 5: } while (1); }
> -  if (!SwitchInsn) {
> -    EmitStmt(S.getSubStmt());
> +  if (!SwitchInsn)
>     return;
> -  }

What is the intent of this change?  It looks wrong.

-Eli

>   // Handle case ranges.
>   if (S.getRHS()) {
> @@ -1162,6 +1160,10 @@
>   if (S.getConditionVariable())
>     EmitAutoVarDecl(*S.getConditionVariable());
>
> +  // Handle nested switch statements.
> +  llvm::SwitchInst *SavedSwitchInsn = SwitchInsn;
> +  llvm::BasicBlock *SavedCRBlock = CaseRangeBlock;
> +
>   // See if we can constant fold the condition of the switch and therefore only
>   // emit the live case statement (if any) of the switch.
>   llvm::APInt ConstantCondValue;
> @@ -1171,20 +1173,26 @@
>                                    getContext())) {
>       RunCleanupsScope ExecutedScope(*this);
>
> +      // At this point, we are no longer "within" a switch instance, so
> +      // we can temporarily enforce this to ensure that any embedded case
> +      // statements are not emitted.
> +      SwitchInsn = 0;
> +
>       // Okay, we can dead code eliminate everything except this case.  Emit the
>       // specified series of statements and we're good.
>       for (unsigned i = 0, e = CaseStmts.size(); i != e; ++i)
>         EmitStmt(CaseStmts[i]);
> +
> +      // Now we want to restore the saved switch instance so that nested switches
> +      // continue to function properly
> +      SwitchInsn = SavedSwitchInsn;
> +
>       return;
>     }
>   }
>
>   llvm::Value *CondV = EmitScalarExpr(S.getCond());
>
> -  // Handle nested switch statements.
> -  llvm::SwitchInst *SavedSwitchInsn = SwitchInsn;
> -  llvm::BasicBlock *SavedCRBlock = CaseRangeBlock;
> -
>   // Create basic block to hold stuff that comes after switch
>   // statement. We also need to create a default block now so that
>   // explicit case ranges tests can have a place to jump to on
>
> Added: cfe/trunk/test/CodeGenCXX/switch-case-folding-2.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/switch-case-folding-2.cpp?rev=148359&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/switch-case-folding-2.cpp (added)
> +++ cfe/trunk/test/CodeGenCXX/switch-case-folding-2.cpp Tue Jan 17 17:39:50 2012
> @@ -0,0 +1,21 @@
> +// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s
> +// CHECK that we don't crash.
> +
> +extern int printf(const char*, ...);
> +int test(int val){
> + switch (val) {
> + case 4:
> +   do {
> +     switch (6) {
> +       case 6: do { case 5: printf("bad\n"); } while (0);
> +     };
> +   } while (0);
> + }
> + return 0;
> +}
> +
> +int main(void) {
> + return test(5);
> +}
> +
> +// CHECK-NOT: call i32 (i8*, ...)* @printf(
>
>
> _______________________________________________
> 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