From 839297487f432e0af333826d312a1baae3ac602d Mon Sep 17 00:00:00 2001 From: "jkummerow@chromium.org" Date: Thu, 9 Jan 2014 15:20:25 +0000 Subject: [PATCH] Skip back edge creation for "do ... while(false)" loops Drive-by fix: Fix disassembling "prefetch" instruction on ia32 R=titzer@chromium.org Review URL: https://codereview.chromium.org/131733002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18519 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/hydrogen.cc | 15 ++++++++++----- src/ia32/disasm-ia32.cc | 1 + 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 69969bdf28..929133b8fd 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -4336,12 +4336,17 @@ void HOptimizedGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { HBasicBlock* loop_successor = NULL; if (body_exit != NULL && !stmt->cond()->ToBooleanIsTrue()) { set_current_block(body_exit); - // The block for a true condition, the actual predecessor block of the - // back edge. - body_exit = graph()->CreateBasicBlock(); loop_successor = graph()->CreateBasicBlock(); - CHECK_BAILOUT(VisitForControl(stmt->cond(), body_exit, loop_successor)); - if (body_exit->HasPredecessor()) { + if (stmt->cond()->ToBooleanIsFalse()) { + Goto(loop_successor); + body_exit = NULL; + } else { + // The block for a true condition, the actual predecessor block of the + // back edge. + body_exit = graph()->CreateBasicBlock(); + CHECK_BAILOUT(VisitForControl(stmt->cond(), body_exit, loop_successor)); + } + if (body_exit != NULL && body_exit->HasPredecessor()) { body_exit->SetJoinId(stmt->BackEdgeId()); } else { body_exit = NULL; diff --git a/src/ia32/disasm-ia32.cc b/src/ia32/disasm-ia32.cc index 057a558e28..6a7f3bc837 100644 --- a/src/ia32/disasm-ia32.cc +++ b/src/ia32/disasm-ia32.cc @@ -1007,6 +1007,7 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector out_buffer, { byte f0byte = data[1]; const char* f0mnem = F0Mnem(f0byte); if (f0byte == 0x18) { + data += 2; int mod, regop, rm; get_modrm(*data, &mod, ®op, &rm); const char* suffix[] = {"nta", "1", "2", "3"};