diff options
author | Carl Shapiro <cshapiro@google.com> | 2011-04-19 17:34:24 -0700 |
---|---|---|
committer | Carl Shapiro <cshapiro@google.com> | 2011-04-19 17:34:24 -0700 |
commit | 5d5b94c8d14b166af580d5dd5906db4f9527d6ca (patch) | |
tree | 3316231983154784835b1d8b056e233727ee42c5 /vm/compiler/codegen/arm/GlobalOptimizations.cpp | |
parent | 6f430bb050987ca4e0be70e9c6aea5a11b4a7f84 (diff) | |
download | android_dalvik-5d5b94c8d14b166af580d5dd5906db4f9527d6ca.tar.gz android_dalvik-5d5b94c8d14b166af580d5dd5906db4f9527d6ca.tar.bz2 android_dalvik-5d5b94c8d14b166af580d5dd5906db4f9527d6ca.zip |
Move the compiler into C++.
Change-Id: Idffbdb02c29e2be03a75f5a0a664603f2299504a
Diffstat (limited to 'vm/compiler/codegen/arm/GlobalOptimizations.cpp')
-rw-r--r-- | vm/compiler/codegen/arm/GlobalOptimizations.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/vm/compiler/codegen/arm/GlobalOptimizations.cpp b/vm/compiler/codegen/arm/GlobalOptimizations.cpp new file mode 100644 index 000000000..e52bd8a49 --- /dev/null +++ b/vm/compiler/codegen/arm/GlobalOptimizations.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Dalvik.h" +#include "vm/compiler/CompilerInternals.h" +#include "ArmLIR.h" + +/* + * Identify unconditional branches that jump to the immediate successor of the + * branch itself. + */ +static void applyRedundantBranchElimination(CompilationUnit *cUnit) +{ + ArmLIR *thisLIR; + + for (thisLIR = (ArmLIR *) cUnit->firstLIRInsn; + thisLIR != (ArmLIR *) cUnit->lastLIRInsn; + thisLIR = NEXT_LIR(thisLIR)) { + + /* Branch to the next instruction */ + if (thisLIR->opcode == kThumbBUncond) { + ArmLIR *nextLIR = thisLIR; + + while (true) { + nextLIR = NEXT_LIR(nextLIR); + + /* + * Is the branch target the next instruction? + */ + if (nextLIR == (ArmLIR *) thisLIR->generic.target) { + thisLIR->flags.isNop = true; + break; + } + + /* + * Found real useful stuff between the branch and the target. + * Need to explicitly check the lastLIRInsn here since with + * method-based JIT the branch might be the last real + * instruction. + */ + if (!isPseudoOpcode(nextLIR->opcode) || + (nextLIR = (ArmLIR *) cUnit->lastLIRInsn)) + break; + } + } + } +} + +void dvmCompilerApplyGlobalOptimizations(CompilationUnit *cUnit) +{ + applyRedundantBranchElimination(cUnit); +} |