Merge "Change return type of CfBuilder.build() to CfCode"
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
index 60f9c79..933f66d 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
@@ -11,12 +11,10 @@
import com.android.tools.r8.cf.code.CfLabel;
import com.android.tools.r8.cf.code.CfPosition;
import com.android.tools.r8.cf.code.CfTryCatch;
-import com.android.tools.r8.errors.Unimplemented;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AppInfoWithSubtyping;
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.CfCode.LocalVariableInfo;
-import com.android.tools.r8.graph.Code;
import com.android.tools.r8.graph.DebugLocalInfo;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexItemFactory;
@@ -106,27 +104,23 @@
return factory;
}
- public Code build(CodeRewriter rewriter, InternalOptions options, AppInfoWithSubtyping appInfo) {
- try {
- types = new TypeVerificationHelper(code, factory, appInfo).computeVerificationTypes();
- splitExceptionalBlocks();
- LoadStoreHelper loadStoreHelper = new LoadStoreHelper(code, types);
- loadStoreHelper.insertLoadsAndStores();
- DeadCodeRemover.removeDeadCode(code, rewriter, options);
- removeUnneededLoadsAndStores();
- registerAllocator = new CfRegisterAllocator(code, options);
- registerAllocator.allocateRegisters();
- loadStoreHelper.insertPhiMoves(registerAllocator);
- CodeRewriter.collapsTrivialGotos(method, code);
- int instructionTableCount =
- DexBuilder.instructionNumberToIndex(code.numberRemainingInstructions());
- DexBuilder.removeRedundantDebugPositions(code, instructionTableCount);
- CfCode code = buildCfCode();
- return code;
- } catch (Unimplemented e) {
- System.out.println("Incomplete CF construction: " + e.getMessage());
- return method.getCode().asJarCode();
- }
+ public CfCode build(
+ CodeRewriter rewriter, InternalOptions options, AppInfoWithSubtyping appInfo) {
+ types = new TypeVerificationHelper(code, factory, appInfo).computeVerificationTypes();
+ splitExceptionalBlocks();
+ LoadStoreHelper loadStoreHelper = new LoadStoreHelper(code, types);
+ loadStoreHelper.insertLoadsAndStores();
+ DeadCodeRemover.removeDeadCode(code, rewriter, options);
+ removeUnneededLoadsAndStores();
+ registerAllocator = new CfRegisterAllocator(code, options);
+ registerAllocator.allocateRegisters();
+ loadStoreHelper.insertPhiMoves(registerAllocator);
+ CodeRewriter.collapsTrivialGotos(method, code);
+ int instructionTableCount =
+ DexBuilder.instructionNumberToIndex(code.numberRemainingInstructions());
+ DexBuilder.removeRedundantDebugPositions(code, instructionTableCount);
+ CfCode code = buildCfCode();
+ return code;
}
// Split all blocks with throwing instructions and exceptional edges such that any non-throwing
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 0f0b44a..2b6ad47 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppInfoWithSubtyping;
+import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.Code;
import com.android.tools.r8.graph.DexAnnotation;
import com.android.tools.r8.graph.DexApplication;
@@ -711,9 +712,7 @@
private void finalizeToCf(DexEncodedMethod method, IRCode code, OptimizationFeedback feedback) {
assert !method.getCode().isDexCode();
CfBuilder builder = new CfBuilder(method, code, options.itemFactory);
- // TODO(zerny): Change the return type of CfBuilder::build CfCode once complete.
- Code result = builder.build(codeRewriter, options, appInfo.withSubtyping());
- assert result.isCfCode() || result.isJarCode();
+ CfCode result = builder.build(codeRewriter, options, appInfo.withSubtyping());
method.setCode(result);
markProcessed(method, code, feedback);
}