diff options
author | Ben Cheng <bccheng@android.com> | 2011-04-22 10:22:20 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2011-04-22 10:22:20 -0700 |
commit | c7432258b3dd420ec7b252ae25aa9a19a66a8e0f (patch) | |
tree | c11b0c3b682092ff82b5c65820e23a56e3595ca9 /vm/compiler | |
parent | f7ab441aa04df6fd49796b078754771bb2fa4683 (diff) | |
parent | 9f54185b4186def90351903bb2e97090e06ab559 (diff) | |
download | android_dalvik-c7432258b3dd420ec7b252ae25aa9a19a66a8e0f.tar.gz android_dalvik-c7432258b3dd420ec7b252ae25aa9a19a66a8e0f.tar.bz2 android_dalvik-c7432258b3dd420ec7b252ae25aa9a19a66a8e0f.zip |
am 9f54185b: Set "needFallThroughBranch" flag during block split.
* commit '9f54185b4186def90351903bb2e97090e06ab559':
Set "needFallThroughBranch" flag during block split.
Diffstat (limited to 'vm/compiler')
-rw-r--r-- | vm/compiler/Frontend.cpp | 1 | ||||
-rw-r--r-- | vm/compiler/Loop.cpp | 18 | ||||
-rw-r--r-- | vm/compiler/codegen/arm/ArmLIR.h | 2 | ||||
-rw-r--r-- | vm/compiler/codegen/arm/Assemble.cpp | 4 | ||||
-rw-r--r-- | vm/compiler/codegen/arm/CodegenDriver.cpp | 9 |
5 files changed, 32 insertions, 2 deletions
diff --git a/vm/compiler/Frontend.cpp b/vm/compiler/Frontend.cpp index da693ea09..473f3d0d7 100644 --- a/vm/compiler/Frontend.cpp +++ b/vm/compiler/Frontend.cpp @@ -564,6 +564,7 @@ static BasicBlock *splitBlock(CompilationUnit *cUnit, } /* Handle the fallthrough path */ + bottomBlock->needFallThroughBranch = origBlock->needFallThroughBranch; bottomBlock->fallThrough = origBlock->fallThrough; origBlock->fallThrough = bottomBlock; origBlock->needFallThroughBranch = true; diff --git a/vm/compiler/Loop.cpp b/vm/compiler/Loop.cpp index 89b8e0f14..90c97d767 100644 --- a/vm/compiler/Loop.cpp +++ b/vm/compiler/Loop.cpp @@ -552,7 +552,23 @@ bool dvmCompilerFilterLoopBlocks(CompilationUnit *cUnit) */ while (true) { /* Loop formed */ - if (bodyBB->taken == firstBB || bodyBB->fallThrough == firstBB) break; + if (bodyBB->taken == firstBB) { + /* Check if the fallThrough edge will cause a nested loop */ + if (bodyBB->fallThrough && + dvmIsBitSet(cUnit->tempBlockV, bodyBB->fallThrough->id)) { + return false; + } + /* Single loop formed */ + break; + } else if (bodyBB->fallThrough == firstBB) { + /* Check if the taken edge will cause a nested loop */ + if (bodyBB->taken && + dvmIsBitSet(cUnit->tempBlockV, bodyBB->taken->id)) { + return false; + } + /* Single loop formed */ + break; + } /* Inner loops formed first - quit */ if (bodyBB->fallThrough && diff --git a/vm/compiler/codegen/arm/ArmLIR.h b/vm/compiler/codegen/arm/ArmLIR.h index 864f5b63a..46316ff46 100644 --- a/vm/compiler/codegen/arm/ArmLIR.h +++ b/vm/compiler/codegen/arm/ArmLIR.h @@ -627,7 +627,7 @@ typedef enum ArmOpcode { kThumb2Dmb, /* dmb [1111001110111111100011110101] option[3-0] */ kThumb2LdrPcReln12, /* ldr rd,[pc,-#imm12] [1111100011011111] rt[15-12] imm12[11-0] */ - + kThumbUndefined, /* undefined [11011110xxxxxxxx] */ kArmLast, } ArmOpcode; diff --git a/vm/compiler/codegen/arm/Assemble.cpp b/vm/compiler/codegen/arm/Assemble.cpp index 16804ba99..a433c31d4 100644 --- a/vm/compiler/codegen/arm/Assemble.cpp +++ b/vm/compiler/codegen/arm/Assemble.cpp @@ -881,6 +881,10 @@ ArmEncodingMap EncodingMap[kArmLast] = { kFmtUnused, -1, -1, IS_BINARY_OP | REG_DEF0 | REG_USE_PC | IS_LOAD, "ldr", "r!0d, [r15pc, -#!1d]", 2), + ENCODING_MAP(kThumbUndefined, 0xde00, + kFmtUnused, -1, -1, kFmtUnused, -1, -1, kFmtUnused, -1, -1, + kFmtUnused, -1, -1, NO_OPERAND, + "undefined", "", 1), }; /* diff --git a/vm/compiler/codegen/arm/CodegenDriver.cpp b/vm/compiler/codegen/arm/CodegenDriver.cpp index c38b16a46..a722289eb 100644 --- a/vm/compiler/codegen/arm/CodegenDriver.cpp +++ b/vm/compiler/codegen/arm/CodegenDriver.cpp @@ -3896,6 +3896,15 @@ static void handlePCReconstruction(CompilationUnit *cUnit, (ArmLIR **) cUnit->pcReconstructionList.elemList; int numElems = cUnit->pcReconstructionList.numUsed; int i; + + /* + * We should never reach here through fall-through code, so insert + * a bomb to signal troubles immediately. + */ + if (numElems) { + newLIR0(cUnit, kThumbUndefined); + } + for (i = 0; i < numElems; i++) { dvmCompilerAppendLIR(cUnit, (LIR *) pcrLabel[i]); /* r0 = dalvik PC */ |