Revert "Flipping if statement in case fall-through successor always throws."
This reverts commit ff4d5858bb45dc9090f0bd05325eb5bfb8ebd6fc.
The reason for revert was breaking the Art test
test-art-host-gtest-exception_test.
Change-Id: I0bacad20aa86081f157bcf916780719b5eb4bbf2
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java b/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
index 931fbfa..bee0910 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
@@ -60,15 +60,12 @@
// True if running in debug-mode with input code that contains line information, otherwise false.
private final boolean hasDebugPositions;
- // True if all throwing instructions had positions in the input code.
- private final boolean allThrowingInstructionsHavePositions;
public DexDebugEventBuilder(IRCode code, InternalOptions options) {
this.method = code.method;
this.factory = options.itemFactory;
this.options = options;
hasDebugPositions = code.hasDebugPositions;
- allThrowingInstructionsHavePositions = code.doAllThrowingInstructionsHavePositions();
}
/** Add events at pc for instruction. */
@@ -90,7 +87,6 @@
// In debug mode check that all non-nop instructions have positions.
assert startLine == NO_LINE_INFO || !hasDebugPositions || !pcAdvancing || position.isSome()
- || (instruction.instructionTypeCanThrow() && !allThrowingInstructionsHavePositions)
: "PC-advancing instruction " + instruction + " expected to have an associated position.";
// In any mode check that nop instructions have no position info.
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
index 8663b91..8d087b6 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
@@ -182,14 +182,6 @@
}
}
- public void swapSuccessors(BasicBlock a, BasicBlock b) {
- assert a != b;
- int aIndex = successors.indexOf(a);
- int bIndex = successors.indexOf(b);
- assert aIndex >= 0 && bIndex >= 0;
- swapSuccessorsByIndex(aIndex, bIndex);
- }
-
public void swapSuccessorsByIndex(int index1, int index2) {
assert index1 != index2;
if (hasCatchHandlers()) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index 15dd25d..a353e93 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -1867,16 +1867,11 @@
public void simplifyIf(IRCode code, TypeEnvironment typeEnvironment) {
int color = code.reserveMarkingColor();
- boolean ifBranchFlipped = false;
for (BasicBlock block : code.blocks) {
if (block.isMarked(color)) {
continue;
}
if (block.exit().isIf()) {
- // Flip then/else branches if needed.
- if (flipIfBranchesIfNeeded(block)) {
- ifBranchFlipped = true;
- }
// First rewrite zero comparison.
rewriteIfWithConstZero(block);
@@ -1932,9 +1927,6 @@
}
code.removeMarkedBlocks(color);
code.returnMarkingColor(color);
- if (ifBranchFlipped) {
- code.traceBlocks();
- }
assert code.isConsistentSSA();
}
@@ -2200,27 +2192,6 @@
}
}
- private synchronized boolean flipIfBranchesIfNeeded(BasicBlock block) {
- If theIf = block.exit().asIf();
- BasicBlock trueTarget = theIf.getTrueTarget();
- BasicBlock fallthrough = theIf.fallthroughBlock();
- assert trueTarget != fallthrough;
-
- if (!fallthrough.isSimpleAlwaysThrowingPath() || trueTarget.isSimpleAlwaysThrowingPath()) {
- return false;
- }
-
- // In case fall-through block always trows there is a good chance that it
- // is created for error checks and 'trueTarget' represents most more common
- // non-error case. Flipping the if in this case may result in faster code
- // on older Android versions.
- List<Value> inValues = theIf.inValues();
- If newIf = new If(theIf.getType().inverted(), inValues);
- block.replaceLastInstruction(newIf);
- block.swapSuccessors(trueTarget, fallthrough);
- return true;
- }
-
public void rewriteLongCompareAndRequireNonNull(IRCode code, InternalOptions options) {
if (options.canUseLongCompareAndObjectsNonNull()) {
return;
diff --git a/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java b/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
index 490162a..9dbfb13 100644
--- a/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
+++ b/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
@@ -52,39 +52,21 @@
// Check the instruction used for testInlinedIntoVoidMethod
MethodSubject methodThrowToBeInlined =
- clazz.method("void", "foo", ImmutableList.of(
- "java.lang.String", "java.lang.String", "java.lang.String", "java.lang.String"));
+ clazz.method("void", "foo", ImmutableList.of("java.lang.String"));
assertTrue(methodThrowToBeInlined.isPresent());
validateSequence(methodThrowToBeInlined.iterateInstructions(),
- // 'if' with "foo#1" is flipped.
- InstructionSubject::isIfEqz,
-
- // 'if' with "foo#2" is removed along with the constant.
-
- // 'if' with "foo#3" is removed so now we have unconditional call.
- insn -> insn.isConstString("StringConstants::foo#3"),
- InstructionSubject::isInvokeStatic,
- InstructionSubject::isThrow,
-
- // 'if's with "foo#4" and "foo#5" are flipped, but their throwing branches
- // are not moved to the end of the code (area for improvement?).
- insn -> insn.isConstString("StringConstants::foo#4"),
- InstructionSubject::isIfEqz, // Flipped if
- InstructionSubject::isGoto, // Jump around throwing branch.
- InstructionSubject::isInvokeStatic, // Throwing branch.
- InstructionSubject::isThrow,
-
- insn -> insn.isConstString("StringConstants::foo#5"),
- InstructionSubject::isIfEqz, // Flipped if
- InstructionSubject::isReturnVoid, // Final return statement.
- InstructionSubject::isInvokeStatic, // Throwing branch.
- InstructionSubject::isThrow,
-
- // After 'if' with "foo#1" flipped, always throwing branch
- // moved here along with the constant.
+ InstructionSubject::isIfNez,
insn -> insn.isConstString("StringConstants::foo#1"),
- InstructionSubject::isInvokeStatic,
- InstructionSubject::isThrow
+ // Below two are removed by optimization: non-null argument "".
+ // InstructionSubject::isIfNez,
+ // insn -> insn.isConstString("StringConstants::foo#2"),
+ // InstructionSubject::isIfNez, 'removed by optimization'
+ insn -> insn.isConstString("StringConstants::foo#3")
+ // Below four are removed, since a safe call of arg.length() indicates arg is not null.
+ // insn -> insn.isConstString("StringConstants::foo#4"),
+ // InstructionSubject::isIfNez,
+ // insn -> insn.isConstString("StringConstants::foo#5"),
+ // InstructionSubject::isIfNez
);
}
diff --git a/src/test/java/com/android/tools/r8/movestringconstants/TestClass.java b/src/test/java/com/android/tools/r8/movestringconstants/TestClass.java
index bf13fc3..b801804 100644
--- a/src/test/java/com/android/tools/r8/movestringconstants/TestClass.java
+++ b/src/test/java/com/android/tools/r8/movestringconstants/TestClass.java
@@ -5,19 +5,19 @@
package com.android.tools.r8.movestringconstants;
public class TestClass {
- static void foo(String arg1, String arg2, String arg3, String arg4) {
- Utils.check(arg1, "StringConstants::foo#1");
+ static void foo(String arg) {
+ Utils.check(arg, "StringConstants::foo#1");
Utils.check("", "StringConstants::foo#2");
- if (arg2.length() == 12345) {
+ if (arg.length() == 12345) {
Utils.check(null, "StringConstants::foo#3");
}
try {
- Utils.check(arg3, "StringConstants::foo#4");
+ Utils.check(arg, "StringConstants::foo#4");
} catch (Exception e) {
System.out.println(e.getMessage());
}
try {
- Utils.check(arg4, "StringConstants::foo#5");
+ Utils.check(arg, "StringConstants::foo#5");
} finally {
System.out.println("finally");
}
diff --git a/src/test/java/com/android/tools/r8/utils/DexInspector.java b/src/test/java/com/android/tools/r8/utils/DexInspector.java
index d4cec96..7db0d6c 100644
--- a/src/test/java/com/android/tools/r8/utils/DexInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/DexInspector.java
@@ -6,7 +6,6 @@
import com.android.tools.r8.code.Const4;
import com.android.tools.r8.code.ConstString;
import com.android.tools.r8.code.Goto;
-import com.android.tools.r8.code.IfEqz;
import com.android.tools.r8.code.IfNez;
import com.android.tools.r8.code.Iget;
import com.android.tools.r8.code.IgetBoolean;
@@ -1000,10 +999,6 @@
return instruction instanceof IfNez;
}
- boolean isIfEqz(Instruction instruction) {
- return instruction instanceof IfEqz;
- }
-
boolean isFieldAccess(Instruction instruction) {
return isInstanceGet(instruction)
|| isInstancePut(instruction)
@@ -1114,10 +1109,6 @@
return factory.isIfNez(instruction);
}
- public boolean isIfEqz() {
- return factory.isIfEqz(instruction);
- }
-
public boolean isReturnVoid() {
return factory.isReturnVoid(instruction);
}