summaryrefslogtreecommitdiffstats
path: root/vm/compiler
diff options
context:
space:
mode:
authorBen Cheng <bccheng@android.com>2011-04-22 10:22:20 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2011-04-22 10:22:20 -0700
commitc7432258b3dd420ec7b252ae25aa9a19a66a8e0f (patch)
treec11b0c3b682092ff82b5c65820e23a56e3595ca9 /vm/compiler
parentf7ab441aa04df6fd49796b078754771bb2fa4683 (diff)
parent9f54185b4186def90351903bb2e97090e06ab559 (diff)
downloadandroid_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.cpp1
-rw-r--r--vm/compiler/Loop.cpp18
-rw-r--r--vm/compiler/codegen/arm/ArmLIR.h2
-rw-r--r--vm/compiler/codegen/arm/Assemble.cpp4
-rw-r--r--vm/compiler/codegen/arm/CodegenDriver.cpp9
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 */