Simplify 'as T' for simple T
Example change:
return H.subtypeOfRuntimeTypeCast(this.$index(0, "name"), P.String);
--->
return H.stringTypeCast(this.$index(0, "name"));
Change-Id: I65752a3e9516c5d391cff4e7a0c4b74c877c81af
Reviewed-on: https://dart-review.googlesource.com/60827
Commit-Queue: Stephen Adams <sra@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index f684d58..a0ac620 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -927,7 +927,24 @@
}
HInstruction visitTypeConversion(HTypeConversion node) {
- return node.isRedundant(_closedWorld) ? node.checkedInput : node;
+ if (node.isRedundant(_closedWorld)) return node.checkedInput;
+
+ // Simplify 'as T' where T is a simple type.
+ DartType checkedType = node.typeExpression;
+ if (checkedType is TypeVariableType && node.inputs.length == 2) {
+ HInstruction rep = node.typeRepresentation;
+ if (rep is HTypeInfoExpression &&
+ rep.kind == TypeInfoExpressionKind.COMPLETE &&
+ rep.inputs.isEmpty) {
+ DartType type = rep.dartType;
+ if (type.isInterfaceType && type.treatAsRaw) {
+ return node.checkedInput.convertType(_closedWorld, type, node.kind)
+ ..sourceInformation = node.sourceInformation;
+ }
+ }
+ }
+
+ return node;
}
HInstruction visitTypeKnown(HTypeKnown node) {