summaryrefslogtreecommitdiffstats
path: root/vm/compiler/Loop.cpp
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/Loop.cpp
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/Loop.cpp')
-rw-r--r--vm/compiler/Loop.cpp18
1 files changed, 17 insertions, 1 deletions
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 &&