r276350 - [CodeGen] Fix a crash when constant folding switch statement
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 22 07:00:28 PDT 2016
Richard: should we merge this to 3.9?
On Thu, Jul 21, 2016 at 6:31 PM, Erik Pilkington via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Author: epilk
> Date: Thu Jul 21 17:31:40 2016
> New Revision: 276350
>
> URL: http://llvm.org/viewvc/llvm-project?rev=276350&view=rev
> Log:
> [CodeGen] Fix a crash when constant folding switch statement
>
> Differential revision: https://reviews.llvm.org/D22542
>
> Modified:
> cfe/trunk/lib/CodeGen/CGStmt.cpp
> cfe/trunk/test/CodeGenCXX/switch-case-folding-2.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=276350&r1=276349&r2=276350&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGStmt.cpp Thu Jul 21 17:31:40 2016
> @@ -1264,6 +1264,14 @@ void CodeGenFunction::EmitCaseStmt(const
> }
>
> void CodeGenFunction::EmitDefaultStmt(const DefaultStmt &S) {
> + // If there is no enclosing switch instance that we're aware of, then this
> + // default statement can be elided. This situation only happens when we've
> + // constant-folded the switch.
> + if (!SwitchInsn) {
> + EmitStmt(S.getSubStmt());
> + return;
> + }
> +
> llvm::BasicBlock *DefaultBlock = SwitchInsn->getDefaultDest();
> assert(DefaultBlock->empty() &&
> "EmitDefaultStmt: Default block already defined?");
>
> Modified: 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=276350&r1=276349&r2=276350&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/switch-case-folding-2.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/switch-case-folding-2.cpp Thu Jul 21 17:31:40 2016
> @@ -18,4 +18,13 @@ int main(void) {
> return test(5);
> }
>
> +void other_test() {
> + switch(0) {
> + case 0:
> + do {
> + default:;
> + } while(0);
> + }
> +}
> +
> // CHECK: call i32 (i8*, ...) @_Z6printfPKcz
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list