summaryrefslogtreecommitdiff
path: root/compiler/dex/mir_graph.h
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2015-06-19 12:58:22 +0100
committer Vladimir Marko <vmarko@google.com> 2015-06-19 15:01:42 +0100
commitf11c420c448baffac6a70ac0884d481ab347e257 (patch)
treedc7c7c03810c21351d2411e5c01bc0be8299ddd6 /compiler/dex/mir_graph.h
parentd8d7b90ca57e8e3762951bb419b6f2645bb414c5 (diff)
Quick: Fix optimizations for empty if blocks.
If a block ending with if-eqz or if-nez has the same "taken" and "fallthrough", we cannot assume that the value has been checked against zero in one of the succesors. This affects the null check elimination pass as well as GVN. Refactor all those checks to a single function in BasicBlock and check that the "taken" and "falthrough" are different when needed. Bug: 21614284 Change-Id: I8c6ac23e96cdaf5984786a555ebbd28110f095cb
Diffstat (limited to 'compiler/dex/mir_graph.h')
-rw-r--r--compiler/dex/mir_graph.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/compiler/dex/mir_graph.h b/compiler/dex/mir_graph.h
index f038397e1e..dbe906280f 100644
--- a/compiler/dex/mir_graph.h
+++ b/compiler/dex/mir_graph.h
@@ -452,6 +452,21 @@ class BasicBlock : public DeletableArenaObject<kArenaAllocBB> {
MIR* GetFirstNonPhiInsn();
/**
+ * @brief Checks whether the block ends with if-nez or if-eqz that branches to
+ * the given successor only if the register in not zero.
+ */
+ bool BranchesToSuccessorOnlyIfNotZero(BasicBlockId succ_id) const {
+ if (last_mir_insn == nullptr) {
+ return false;
+ }
+ Instruction::Code last_opcode = last_mir_insn->dalvikInsn.opcode;
+ return ((last_opcode == Instruction::IF_EQZ && fall_through == succ_id) ||
+ (last_opcode == Instruction::IF_NEZ && taken == succ_id)) &&
+ // Make sure the other successor isn't the same (empty if), b/21614284.
+ (fall_through != taken);
+ }
+
+ /**
* @brief Used to obtain the next MIR that follows unconditionally.
* @details The implementation does not guarantee that a MIR does not
* follow even if this method returns nullptr.