[dart2js] Print powerset value in typemask toString methods.

We may find it useful later to add a more verbose stringification that
writes out the properties expressed by the powerset. For now, just
printing the int value is sufficient to debug e.g. test failures, and
it's relatively straightforward to manually convert an int to a set of
properties by looking at the definitions of the powerset domains.

Change-Id: I2397ffd83a6e86830f67c7f1ef811e33c0b7ff3c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/405567
Reviewed-by: Nate Biggs <natebiggs@google.com>
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart
index 0f3f758..7711977 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart
@@ -121,6 +121,7 @@
 
   @override
   String toString() {
-    return 'Container($forwardTo, element: $elementType, length: $length)';
+    return 'Container($forwardTo, element: $elementType, length: $length, '
+        'powerset: ${TypeMask.powersetToString(powerset)})';
   }
 }
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart
index 610462b..8bf3baa 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart
@@ -143,7 +143,7 @@
 
   @override
   String toString() {
-    return 'Dictionary($forwardTo, key: $keyType, '
-        'value: $valueType, map: $_typeMap)';
+    return 'Dictionary($forwardTo, key: $keyType, value: $valueType, '
+        'map: $_typeMap, powerset: ${TypeMask.powersetToString(powerset)})';
   }
 }
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
index 269abac..27a556c 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
@@ -879,6 +879,7 @@
       if (isExact) 'exact=${base!.name}',
       if (isSubclass) 'subclass=${base!.name}',
       if (isSubtype) 'subtype=${base!.name}',
+      'powerset=${TypeMask.powersetToString(powerset)}',
     ], '|');
     buffer.write(']');
     return buffer.toString();
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart
index 250eb52..aa5004b 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart
@@ -134,6 +134,7 @@
 
   @override
   String toString() {
-    return 'Map($forwardTo, key: $keyType, value: $valueType)';
+    return 'Map($forwardTo, key: $keyType, value: $valueType, '
+        'powerset: ${TypeMask.powersetToString(powerset)})';
   }
 }
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/record_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/record_type_mask.dart
index 0591844..23566bf 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/record_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/record_type_mask.dart
@@ -445,7 +445,8 @@
 
   @override
   String toString() {
-    return '[Record($shape, $types)]';
+    return '[Record($shape, $types, '
+        'powerset: ${TypeMask.powersetToString(powerset)})]';
   }
 
   @override
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart
index b72ad1c..c67084f 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart
@@ -95,5 +95,7 @@
   int get hashCode => Hashing.objectHash(elementType, super.hashCode);
 
   @override
-  String toString() => 'Set($forwardTo, element: $elementType)';
+  String toString() =>
+      'Set($forwardTo, element: $elementType, '
+      'powerset: ${TypeMask.powersetToString(powerset)})';
 }
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
index f547e8c..f82c515 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
@@ -552,4 +552,6 @@
     MemberHierarchyBuilder memberHierarchyBuilder,
     JClosedWorld closedWorld,
   );
+
+  static String powersetToString(Bitset powerset) => '$powerset';
 }
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
index 96b579e..ce674a1 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
@@ -488,7 +488,8 @@
       if (hasLateSentinel) 'sentinel',
       ...disjointMasks.map((TypeMask mask) => mask.toString()).toList()..sort(),
     ].join(", ");
-    return 'Union($masksString)';
+    return 'Union($masksString, '
+        'powerset: ${TypeMask.powersetToString(powerset)})';
   }
 
   @override
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart
index 4b36866..376c89e 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart
@@ -70,6 +70,7 @@
 
   @override
   String toString() {
-    return 'Value($forwardTo, value: ${value.toDartText(null)})';
+    return 'Value($forwardTo, value: ${value.toDartText(null)}, '
+        'powerset: ${TypeMask.powersetToString(powerset)})';
   }
 }
diff --git a/pkg/compiler/test/dump_info/data/closures.dart b/pkg/compiler/test/dump_info/data/closures.dart
index 8872a2f..01da493 100644
--- a/pkg/compiler/test/dump_info/data/closures.dart
+++ b/pkg/compiler/test/dump_info/data/closures.dart
@@ -113,7 +113,7 @@
   "children": [
     "closure/memory:sdk/tests/web/native/main.dart::Class1.field.Class1_field_closure"
   ],
-  "inferredType": "[subclass=Closure]",
+  "inferredType": "[subclass=Closure|powerset=0]",
   "code": "",
   "type": "Type Function()"
 },
@@ -132,7 +132,7 @@
     "external": false
   },
   "returnType": "Type",
-  "inferredReturnType": "[exact=_Type]",
+  "inferredReturnType": "[exact=_Type|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -190,7 +190,7 @@
   "outputUnit": "outputUnit/main",
   "parent": "class/memory:sdk/tests/web/native/main.dart::Class1",
   "children": [],
-  "inferredType": "[null|subclass=Closure]",
+  "inferredType": "[null|subclass=Closure|powerset=1]",
   "code": "",
   "type": "dynamic"
 }],
@@ -229,7 +229,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[exact=Class1]",
+  "inferredReturnType": "[exact=Class1|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes field)",
   "inlinedCount": 0,
@@ -252,7 +252,7 @@
     "external": false
   },
   "returnType": "Type",
-  "inferredReturnType": "[exact=_Type]",
+  "inferredReturnType": "[exact=_Type|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -286,11 +286,11 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[exact=Class1]",
+  "inferredReturnType": "[exact=Class1|powerset=0]",
   "parameters": [
     {
       "name": "funcField",
-      "type": "[subclass=Closure]",
+      "type": "[subclass=Closure|powerset=0]",
       "declaredType": "dynamic"
     }
   ],
@@ -322,7 +322,7 @@
     "external": false
   },
   "returnType": "Class1<#Afree>",
-  "inferredReturnType": "[exact=Class1]",
+  "inferredReturnType": "[exact=Class1|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes field)",
   "inlinedCount": 1,
@@ -359,7 +359,7 @@
     "external": false
   },
   "returnType": "Class1<#Afree>",
-  "inferredReturnType": "[exact=Class1]",
+  "inferredReturnType": "[exact=Class1|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -382,7 +382,7 @@
     "external": false
   },
   "returnType": "Set<Class1.T>",
-  "inferredReturnType": "[subclass=_LinkedHashSet]",
+  "inferredReturnType": "[subclass=_LinkedHashSet|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
@@ -413,7 +413,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[exact=_Type]",
+  "inferredReturnType": "[exact=_Type|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 1,
@@ -450,7 +450,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -473,7 +473,7 @@
     "external": false
   },
   "returnType": "Type",
-  "inferredReturnType": "[exact=_Type]",
+  "inferredReturnType": "[exact=_Type|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -505,7 +505,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[exact=_Type]",
+  "inferredReturnType": "[exact=_Type|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 1,
@@ -542,7 +542,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -565,7 +565,7 @@
     "external": false
   },
   "returnType": "Type",
-  "inferredReturnType": "[exact=_Type]",
+  "inferredReturnType": "[exact=_Type|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -621,7 +621,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -644,7 +644,7 @@
     "external": false
   },
   "returnType": "Type Function()",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -667,7 +667,7 @@
     "external": false
   },
   "returnType": "Type",
-  "inferredReturnType": "[exact=_Type]",
+  "inferredReturnType": "[exact=_Type|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -748,7 +748,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
@@ -771,7 +771,7 @@
     "external": false
   },
   "returnType": "Map<Class1.T,method6.S>",
-  "inferredReturnType": "[exact=JsLinkedHashMap]",
+  "inferredReturnType": "[exact=JsLinkedHashMap|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -794,11 +794,11 @@
     "external": false
   },
   "returnType": "Map<Class1.T,method6.S> Function()",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [
     {
       "name": "o",
-      "type": "[subclass=Closure]",
+      "type": "[subclass=Closure|powerset=0]",
       "declaredType": "dynamic"
     }
   ],
@@ -823,7 +823,7 @@
     "external": false
   },
   "returnType": "String Function()",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -846,7 +846,7 @@
     "external": false
   },
   "returnType": "String",
-  "inferredReturnType": "[exact=JSString]",
+  "inferredReturnType": "[exact=JSString|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes anything)",
   "inlinedCount": 0,
@@ -888,7 +888,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[exact=_Type]",
+  "inferredReturnType": "[exact=_Type|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 1,
@@ -925,7 +925,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -948,7 +948,7 @@
     "external": false
   },
   "returnType": "Type",
-  "inferredReturnType": "[exact=_Type]",
+  "inferredReturnType": "[exact=_Type|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1004,7 +1004,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1027,7 +1027,7 @@
     "external": false
   },
   "returnType": "Type Function()",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1050,7 +1050,7 @@
     "external": false
   },
   "returnType": "Type",
-  "inferredReturnType": "[exact=_Type]",
+  "inferredReturnType": "[exact=_Type|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1131,7 +1131,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
@@ -1154,7 +1154,7 @@
     "external": false
   },
   "returnType": "Set<staticMethod4.S>",
-  "inferredReturnType": "[subclass=_LinkedHashSet]",
+  "inferredReturnType": "[subclass=_LinkedHashSet|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
@@ -1177,11 +1177,11 @@
     "external": false
   },
   "returnType": "Set<staticMethod4.S> Function()",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [
     {
       "name": "o",
-      "type": "[subclass=Closure]",
+      "type": "[subclass=Closure|powerset=0]",
       "declaredType": "dynamic"
     }
   ],
@@ -1206,7 +1206,7 @@
     "external": false
   },
   "returnType": "String Function()",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1229,7 +1229,7 @@
     "external": false
   },
   "returnType": "String",
-  "inferredReturnType": "[exact=JSString]",
+  "inferredReturnType": "[exact=JSString|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes anything)",
   "inlinedCount": 0,
@@ -1272,7 +1272,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[exact=_Type]",
+  "inferredReturnType": "[exact=_Type|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 1,
@@ -1310,7 +1310,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1333,7 +1333,7 @@
     "external": false
   },
   "returnType": "Type",
-  "inferredReturnType": "[exact=_Type]",
+  "inferredReturnType": "[exact=_Type|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1389,7 +1389,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1412,7 +1412,7 @@
     "external": false
   },
   "returnType": "Type Function()",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1435,7 +1435,7 @@
     "external": false
   },
   "returnType": "Type",
-  "inferredReturnType": "[exact=_Type]",
+  "inferredReturnType": "[exact=_Type|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1516,7 +1516,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
@@ -1539,7 +1539,7 @@
     "external": false
   },
   "returnType": "Set<topLevelMethod4.S>",
-  "inferredReturnType": "[subclass=_LinkedHashSet]",
+  "inferredReturnType": "[subclass=_LinkedHashSet|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
@@ -1562,11 +1562,11 @@
     "external": false
   },
   "returnType": "Set<topLevelMethod4.S> Function()",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [
     {
       "name": "o",
-      "type": "[subclass=Closure]",
+      "type": "[subclass=Closure|powerset=0]",
       "declaredType": "dynamic"
     }
   ],
@@ -1591,7 +1591,7 @@
     "external": false
   },
   "returnType": "String Function()",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1614,7 +1614,7 @@
     "external": false
   },
   "returnType": "String",
-  "inferredReturnType": "[exact=JSString]",
+  "inferredReturnType": "[exact=JSString|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes anything)",
   "inlinedCount": 0,
@@ -1680,7 +1680,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1703,7 +1703,7 @@
     "external": false
   },
   "returnType": "Null",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1726,7 +1726,7 @@
     "external": false
   },
   "returnType": "Null",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1786,7 +1786,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
@@ -1809,7 +1809,7 @@
     "external": false
   },
   "returnType": "Null",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1832,7 +1832,7 @@
     "external": false
   },
   "returnType": "dynamic Function()",
-  "inferredReturnType": "[subclass=Closure]",
+  "inferredReturnType": "[subclass=Closure|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1905,7 +1905,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
@@ -1928,7 +1928,7 @@
     "external": false
   },
   "returnType": "int",
-  "inferredReturnType": "[subclass=JSInt]",
+  "inferredReturnType": "[subclass=JSInt|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
@@ -1951,7 +1951,7 @@
     "external": false
   },
   "returnType": "int",
-  "inferredReturnType": "[exact=JSUInt31]",
+  "inferredReturnType": "[exact=JSUInt31|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -1974,7 +1974,7 @@
     "external": false
   },
   "returnType": "int",
-  "inferredReturnType": "[subclass=JSInt]",
+  "inferredReturnType": "[subclass=JSInt|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
@@ -2047,7 +2047,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
@@ -2070,7 +2070,7 @@
     "external": false
   },
   "returnType": "int",
-  "inferredReturnType": "[subclass=JSInt]",
+  "inferredReturnType": "[subclass=JSInt|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
@@ -2093,7 +2093,7 @@
     "external": false
   },
   "returnType": "int",
-  "inferredReturnType": "[exact=JSUInt31]",
+  "inferredReturnType": "[exact=JSUInt31|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -2116,7 +2116,7 @@
     "external": false
   },
   "returnType": "int",
-  "inferredReturnType": "[exact=JSUInt31]",
+  "inferredReturnType": "[exact=JSUInt31|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -2157,7 +2157,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
diff --git a/pkg/compiler/test/dump_info/data/deferred/lib.dart b/pkg/compiler/test/dump_info/data/deferred/lib.dart
index 95772c1..0343e19 100644
--- a/pkg/compiler/test/dump_info/data/deferred/lib.dart
+++ b/pkg/compiler/test/dump_info/data/deferred/lib.dart
@@ -29,7 +29,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "Value([exact=JSString], value: \"\")",
+  "inferredReturnType": "Value([exact=JSString|powerset=0], value: \"\", powerset: 0)",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -54,11 +54,11 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[null|subclass=Object]",
+  "inferredReturnType": "[null|subclass=Object|powerset=1]",
   "parameters": [
     {
       "name": "x",
-      "type": "[subclass=Closure]",
+      "type": "[subclass=Closure|powerset=0]",
       "declaredType": "dynamic"
     }
   ],
diff --git a/pkg/compiler/test/dump_info/data/deferred/main.dart b/pkg/compiler/test/dump_info/data/deferred/main.dart
index 06c7e2b..ac37503 100644
--- a/pkg/compiler/test/dump_info/data/deferred/main.dart
+++ b/pkg/compiler/test/dump_info/data/deferred/main.dart
@@ -150,7 +150,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[exact=_Future]",
+  "inferredReturnType": "[exact=_Future|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
@@ -173,11 +173,11 @@
     "external": false
   },
   "returnType": "Null",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [
     {
       "name": "_#wc0#formal",
-      "type": "[null|subclass=Object]",
+      "type": "[null|subclass=Object|powerset=1]",
       "declaredType": "dynamic"
     }
   ],
@@ -191,7 +191,7 @@
   {"id":"function/dart:_js_helper::loadDeferredLibrary"},
   {"id":"function/dart:_rti::_setArrayType"},
   {"id":"function/dart:_rti::findType"},
-  {"id":"function/dart:async::_Future.then","mask":"[exact=_Future]"},
+  {"id":"function/dart:async::_Future.then","mask":"[exact=_Future|powerset=0]"},
   {"id":"function/memory:sdk/tests/web/native/main.dart::main.main_closure.call"},
   {"id":"function/memory:sdk/tests/web/native/main.dart::main.main_closure.call"}]
 */
diff --git a/pkg/compiler/test/dump_info/data/deferred_future/lib2.dart b/pkg/compiler/test/dump_info/data/deferred_future/lib2.dart
index 1b58548..f70af54 100644
--- a/pkg/compiler/test/dump_info/data/deferred_future/lib2.dart
+++ b/pkg/compiler/test/dump_info/data/deferred_future/lib2.dart
@@ -46,7 +46,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 1,
diff --git a/pkg/compiler/test/dump_info/data/deferred_future/main.dart b/pkg/compiler/test/dump_info/data/deferred_future/main.dart
index 08a0aac..bca2dea 100644
--- a/pkg/compiler/test/dump_info/data/deferred_future/main.dart
+++ b/pkg/compiler/test/dump_info/data/deferred_future/main.dart
@@ -148,7 +148,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[exact=_Future]",
+  "inferredReturnType": "[exact=_Future|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
diff --git a/pkg/compiler/test/dump_info/data/js_members.dart b/pkg/compiler/test/dump_info/data/js_members.dart
index 16795e1..15a73cc 100644
--- a/pkg/compiler/test/dump_info/data/js_members.dart
+++ b/pkg/compiler/test/dump_info/data/js_members.dart
@@ -180,11 +180,11 @@
     "external": true
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[null|subclass=Object]",
+  "inferredReturnType": "[null|subclass=Object|powerset=1]",
   "parameters": [
     {
       "name": "a",
-      "type": "[exact=JSUInt31]",
+      "type": "[exact=JSUInt31|powerset=0]",
       "declaredType": "dynamic"
     }
   ],
@@ -210,11 +210,11 @@
     "external": true
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[null|subclass=Object]",
+  "inferredReturnType": "[null|subclass=Object|powerset=1]",
   "parameters": [
     {
       "name": "a",
-      "type": "[null|exact=JSUInt31]",
+      "type": "[null|exact=JSUInt31|powerset=1]",
       "declaredType": "dynamic"
     }
   ],
@@ -240,16 +240,16 @@
     "external": true
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[null|subclass=Object]",
+  "inferredReturnType": "[null|subclass=Object|powerset=1]",
   "parameters": [
     {
       "name": "a",
-      "type": "[exact=JSUInt31]",
+      "type": "[exact=JSUInt31|powerset=0]",
       "declaredType": "dynamic"
     },
     {
       "name": "b",
-      "type": "[null|exact=JSUInt31]",
+      "type": "[null|exact=JSUInt31|powerset=1]",
       "declaredType": "dynamic"
     }
   ],
@@ -304,7 +304,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
@@ -314,11 +314,11 @@
 }],
  holding=[
   {"id":"function/dart:_interceptors::getNativeInterceptor"},
-  {"id":"function/memory:sdk/tests/web/native/main.dart::Foo.mixedPositionalArgs","mask":"[subclass=LegacyJavaScriptObject]"},
-  {"id":"function/memory:sdk/tests/web/native/main.dart::Foo.mixedPositionalArgs","mask":"[subclass=LegacyJavaScriptObject]"},
-  {"id":"function/memory:sdk/tests/web/native/main.dart::Foo.singleArg","mask":"[subclass=LegacyJavaScriptObject]"},
-  {"id":"function/memory:sdk/tests/web/native/main.dart::Foo.singlePositionalArg","mask":"[subclass=LegacyJavaScriptObject]"},
-  {"id":"function/memory:sdk/tests/web/native/main.dart::Foo.singlePositionalArg","mask":"[subclass=LegacyJavaScriptObject]"},
+  {"id":"function/memory:sdk/tests/web/native/main.dart::Foo.mixedPositionalArgs","mask":"[subclass=LegacyJavaScriptObject|powerset=0]"},
+  {"id":"function/memory:sdk/tests/web/native/main.dart::Foo.mixedPositionalArgs","mask":"[subclass=LegacyJavaScriptObject|powerset=0]"},
+  {"id":"function/memory:sdk/tests/web/native/main.dart::Foo.singleArg","mask":"[subclass=LegacyJavaScriptObject|powerset=0]"},
+  {"id":"function/memory:sdk/tests/web/native/main.dart::Foo.singlePositionalArg","mask":"[subclass=LegacyJavaScriptObject|powerset=0]"},
+  {"id":"function/memory:sdk/tests/web/native/main.dart::Foo.singlePositionalArg","mask":"[subclass=LegacyJavaScriptObject|powerset=0]"},
   {"id":"function/package:expect/expect.dart::Expect.equals"}]
 */
 main() {
diff --git a/pkg/compiler/test/dump_info/data/members.dart b/pkg/compiler/test/dump_info/data/members.dart
index bd96f1f..43dc656 100644
--- a/pkg/compiler/test/dump_info/data/members.dart
+++ b/pkg/compiler/test/dump_info/data/members.dart
@@ -103,7 +103,7 @@
   "outputUnit": "outputUnit/main",
   "parent": "class/memory:sdk/tests/web/native/main.dart::C",
   "children": [],
-  "inferredType": "[exact=Error]",
+  "inferredType": "[exact=Error|powerset=0]",
   "code": "",
   "type": "dynamic"
 }],
@@ -120,7 +120,7 @@
   "outputUnit": "outputUnit/main",
   "parent": "class/memory:sdk/tests/web/native/main.dart::C",
   "children": [],
-  "inferredType": "[subclass=JSPositiveInt]",
+  "inferredType": "[subclass=JSPositiveInt|powerset=0]",
   "code": "$.C_counter = 0;\n",
   "type": "int"
 }]*/
@@ -134,7 +134,7 @@
   "outputUnit": "outputUnit/main",
   "parent": "class/memory:sdk/tests/web/native/main.dart::C",
   "children": [],
-  "inferredType": "[exact=JSBool]",
+  "inferredType": "[exact=JSBool|powerset=0]",
   "code": "_lazy($, \"C_y\", \"$get$C_y\", () => {\n      var t1 = $.C_counter + 1;\n      $.C_counter = t1;\n      return t1 === 4;\n    });\n",
   "type": "bool"
 }],
@@ -162,7 +162,7 @@
     "external": false
   },
   "returnType": "bool",
-  "inferredReturnType": "[exact=JSBool]",
+  "inferredReturnType": "[exact=JSBool|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads static; writes static)",
   "inlinedCount": 1,
@@ -190,11 +190,11 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[exact=C]",
+  "inferredReturnType": "[exact=C|powerset=0]",
   "parameters": [
     {
       "name": "message",
-      "type": "[exact=Error]",
+      "type": "[exact=Error|powerset=0]",
       "declaredType": "Object"
     }
   ],
@@ -222,11 +222,11 @@
     "external": false
   },
   "returnType": "C",
-  "inferredReturnType": "[exact=C]",
+  "inferredReturnType": "[exact=C|powerset=0]",
   "parameters": [
     {
       "name": "object",
-      "type": "[exact=JSUInt31]",
+      "type": "[exact=JSUInt31|powerset=0]",
       "declaredType": "dynamic"
     }
   ],
@@ -260,7 +260,7 @@
     "external": false
   },
   "returnType": "void",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
@@ -305,7 +305,7 @@
   "outputUnit": "outputUnit/main",
   "parent": "class/memory:sdk/tests/web/native/main.dart::A",
   "children": [],
-  "inferredType": "Value([exact=JSString], value: \"hello\")",
+  "inferredType": "Value([exact=JSString|powerset=0], value: \"hello\", powerset: 0)",
   "code": "",
   "type": "dynamic"
 }]*/
@@ -326,7 +326,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[exact=A]",
+  "inferredReturnType": "[exact=A|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 1,
@@ -345,7 +345,7 @@
   "outputUnit": "outputUnit/main",
   "parent": "library/memory:sdk/tests/web/native/main.dart::",
   "children": [],
-  "inferredType": "Container([exact=JSUnmodifiableArray], element: [exact=A], length: 1)",
+  "inferredType": "Container([exact=JSUnmodifiableArray|powerset=0], element: [exact=A|powerset=0], length: 1, powerset: 0)",
   "code": "",
   "type": "List<A>"
 }]*/
@@ -367,7 +367,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
diff --git a/pkg/compiler/test/dump_info/data_new/mixin_with_tearoff_test.dart b/pkg/compiler/test/dump_info/data_new/mixin_with_tearoff_test.dart
index 9df5df5..abf1786 100644
--- a/pkg/compiler/test/dump_info/data_new/mixin_with_tearoff_test.dart
+++ b/pkg/compiler/test/dump_info/data_new/mixin_with_tearoff_test.dart
@@ -131,11 +131,11 @@
     "external": false
   },
   "returnType": "void",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [
     {
       "name": "t",
-      "type": "[exact=JSUInt31]",
+      "type": "[exact=JSUInt31|powerset=0]",
       "declaredType": "int"
     }
   ],
@@ -219,11 +219,11 @@
     "external": false
   },
   "returnType": "void",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [
     {
       "name": "t",
-      "type": "Union([exact=JSString], [exact=JSUInt31])",
+      "type": "Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)",
       "declaredType": "int"
     }
   ],
@@ -306,7 +306,7 @@
     "external": false
   },
   "returnType": "Subclass",
-  "inferredReturnType": "[exact=Subclass]",
+  "inferredReturnType": "[exact=Subclass|powerset=0]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 1,
@@ -330,7 +330,7 @@
     "external": false
   },
   "returnType": "void",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 1,
@@ -372,7 +372,7 @@
     "external": false
   },
   "returnType": "dynamic",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [],
   "sideEffects": "SideEffects(reads anything; writes anything)",
   "inlinedCount": 0,
@@ -395,7 +395,7 @@
     "external": false
   },
   "returnType": "void",
-  "inferredReturnType": "[null]",
+  "inferredReturnType": "[null|powerset=1]",
   "parameters": [],
   "sideEffects": "SideEffects(reads nothing; writes nothing)",
   "inlinedCount": 0,
diff --git a/pkg/compiler/test/inference/data/abstract_method.dart b/pkg/compiler/test/inference/data/abstract_method.dart
index a07fa65..316f22a 100644
--- a/pkg/compiler/test/inference/data/abstract_method.dart
+++ b/pkg/compiler/test/inference/data/abstract_method.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   abstractEquals();
 }
@@ -11,10 +11,10 @@
 // Call abstract method implemented by superclass.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
   operator ==(_);
 }
 
-/*member: abstractEquals:[exact=JSBool]*/
-abstractEquals() => Class1() /*invoke: [exact=Class1]*/ == Class1();
+/*member: abstractEquals:[exact=JSBool|powerset=0]*/
+abstractEquals() => Class1() /*invoke: [exact=Class1|powerset=0]*/ == Class1();
diff --git a/pkg/compiler/test/inference/data/abstract_mixin_override.dart b/pkg/compiler/test/inference/data/abstract_mixin_override.dart
index ec19ec6..bd1a30c 100644
--- a/pkg/compiler/test/inference/data/abstract_mixin_override.dart
+++ b/pkg/compiler/test/inference/data/abstract_mixin_override.dart
@@ -2,62 +2,74 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: A1.:[exact=A1]*/
+/*member: A1.:[exact=A1|powerset=0]*/
 class A1 {
-  /*member: A1.foo:[null]*/
-  void foo(/*[exact=JSUInt31]*/ x) => print(x);
+  /*member: A1.foo:[null|powerset=1]*/
+  void foo(/*[exact=JSUInt31|powerset=0]*/ x) => print(x);
 }
 
-/*member: B1.:[exact=B1]*/
+/*member: B1.:[exact=B1|powerset=0]*/
 class B1 extends A1 with M1 {}
 
-/*member: C1.:[exact=C1]*/
+/*member: C1.:[exact=C1|powerset=0]*/
 class C1 with M1 {
-  /*member: C1.foo:[null]*/
-  void foo(/*[exact=JSUInt31]*/ x) => print(x);
+  /*member: C1.foo:[null|powerset=1]*/
+  void foo(/*[exact=JSUInt31|powerset=0]*/ x) => print(x);
 }
 
 mixin M1 {
   void foo(x);
-  /*member: M1.bar:[null]*/
-  void bar(/*[exact=JSUInt31]*/ y) {
-    /*invoke: [subtype=M1]*/
+  /*member: M1.bar:[null|powerset=1]*/
+  void bar(/*[exact=JSUInt31|powerset=0]*/ y) {
+    /*invoke: [subtype=M1|powerset=0]*/
     foo(y);
   }
 }
 
-/*member: A2.:[exact=A2]*/
+/*member: A2.:[exact=A2|powerset=0]*/
 class A2 {
-  /*member: A2.foo:[null]*/
-  void foo(/*[empty]*/ x) => print(x);
+  /*member: A2.foo:[null|powerset=1]*/
+  void foo(/*[empty|powerset=0]*/ x) => print(x);
 }
 
-/*member: B2.:[exact=B2]*/
+/*member: B2.:[exact=B2|powerset=0]*/
 class B2 extends A2 with M2 {}
 
-/*member: C2.:[exact=C2]*/
+/*member: C2.:[exact=C2|powerset=0]*/
 class C2 with M2 {
-  /*member: C2.foo:[null]*/
-  void foo(/*Value([exact=JSString], value: "")*/ x) => print(x);
+  /*member: C2.foo:[null|powerset=1]*/
+  void foo(/*Value([exact=JSString|powerset=0], value: "", powerset: 0)*/ x) =>
+      print(x);
 }
 
 mixin M2 {
-  /*member: M2.foo:[exact=JSUInt31]*/
-  void foo(/*Value([exact=JSString], value: "")*/ x) => 5;
-  /*member: M2.bar:[null]*/
-  void bar(/*Value([exact=JSString], value: "")*/ y) {
-    /*invoke: [subtype=M2]*/
+  /*member: M2.foo:[exact=JSUInt31|powerset=0]*/
+  void foo(/*Value([exact=JSString|powerset=0], value: "", powerset: 0)*/ x) =>
+      5;
+  /*member: M2.bar:[null|powerset=1]*/
+  void bar(/*Value([exact=JSString|powerset=0], value: "", powerset: 0)*/ y) {
+    /*invoke: [subtype=M2|powerset=0]*/
     foo(y);
   }
 }
 
-/*member: getB1:Union([exact=B1], [exact=C1])*/
-getB1(bool /*Value([exact=JSBool], value: false)*/ x) => x ? B1() : C1();
-/*member: getB2:Union([exact=B2], [exact=C2])*/
-getB2(bool /*Value([exact=JSBool], value: false)*/ x) => x ? B2() : C2();
+/*member: getB1:Union([exact=B1|powerset=0], [exact=C1|powerset=0], powerset: 0)*/
+getB1(bool /*Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/ x) =>
+    x ? B1() : C1();
+/*member: getB2:Union([exact=B2|powerset=0], [exact=C2|powerset=0], powerset: 0)*/
+getB2(bool /*Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/ x) =>
+    x ? B2() : C2();
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
-  getB1(false). /*invoke: Union([exact=B1], [exact=C1])*/ bar(3);
-  getB2(false). /*invoke: Union([exact=B2], [exact=C2])*/ bar("");
+  getB1(
+    false,
+  ). /*invoke: Union([exact=B1|powerset=0], [exact=C1|powerset=0], powerset: 0)*/ bar(
+    3,
+  );
+  getB2(
+    false,
+  ). /*invoke: Union([exact=B2|powerset=0], [exact=C2|powerset=0], powerset: 0)*/ bar(
+    "",
+  );
 }
diff --git a/pkg/compiler/test/inference/data/and_or.dart b/pkg/compiler/test/inference/data/and_or.dart
index 42bbd67..ef13741 100644
--- a/pkg/compiler/test/inference/data/and_or.dart
+++ b/pkg/compiler/test/inference/data/and_or.dart
@@ -2,64 +2,68 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: X.:[exact=X]*/
+/*member: X.:[exact=X|powerset=0]*/
 class X {}
 
-/*member: returnDyn1:Union([exact=JSString], [exact=JSUInt31])*/
+/*member: returnDyn1:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 returnDyn1() {
   var a;
-  ((a = 52) /*invoke: [exact=JSUInt31]*/ == true) ||
-      ((a = 'foo') /*invoke: Value([exact=JSString], value: "foo")*/ == true);
+  ((a = 52) /*invoke: [exact=JSUInt31|powerset=0]*/ == true) ||
+      ((a = 'foo') /*invoke: Value([exact=JSString|powerset=0], value: "foo", powerset: 0)*/ ==
+          true);
   return a;
 }
 
-/*member: returnDyn2:Union([exact=JSString], [exact=JSUInt31])*/
+/*member: returnDyn2:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 returnDyn2() {
   var a;
-  ((a = 52) /*invoke: [exact=JSUInt31]*/ == true) &&
-      ((a = 'foo') /*invoke: Value([exact=JSString], value: "foo")*/ == true);
+  ((a = 52) /*invoke: [exact=JSUInt31|powerset=0]*/ == true) &&
+      ((a = 'foo') /*invoke: Value([exact=JSString|powerset=0], value: "foo", powerset: 0)*/ ==
+          true);
   return a;
 }
 
-/*member: returnDyn3:Union([exact=JSString], [exact=JSUInt31])*/
+/*member: returnDyn3:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 returnDyn3() {
   var a;
   a = a == 54 ? 'foo' : 31;
   return a;
 }
 
-/*member: returnDyn4:Union([exact=JSUInt31], [exact=X])*/
+/*member: returnDyn4:Union([exact=JSUInt31|powerset=0], [exact=X|powerset=0], powerset: 0)*/
 returnDyn4() {
   var a;
-  ((a = 52) /*invoke: [exact=JSUInt31]*/ == true) ||
-      ((a = X()) /*invoke: [exact=X]*/ == true);
+  ((a = 52) /*invoke: [exact=JSUInt31|powerset=0]*/ == true) ||
+      ((a = X()) /*invoke: [exact=X|powerset=0]*/ == true);
   return a;
 }
 
-/*member: returnDyn5:Union([exact=JSUInt31], [exact=X])*/
+/*member: returnDyn5:Union([exact=JSUInt31|powerset=0], [exact=X|powerset=0], powerset: 0)*/
 returnDyn5() {
   var a;
-  ((a = 52) /*invoke: [exact=JSUInt31]*/ == true) &&
-      ((a = X()) /*invoke: [exact=X]*/ == true);
+  ((a = 52) /*invoke: [exact=JSUInt31|powerset=0]*/ == true) &&
+      ((a = X()) /*invoke: [exact=X|powerset=0]*/ == true);
   return a;
 }
 
-/*member: returnDyn6:Union([exact=JSString], [exact=X])*/
+/*member: returnDyn6:Union([exact=JSString|powerset=0], [exact=X|powerset=0], powerset: 0)*/
 returnDyn6() {
   var a;
   a = a == 54 ? 'foo' : X();
   return a;
 }
 
-/*member: returnDyn7b:Union([exact=JSString], [exact=JSUInt31])*/
-returnDyn7b(/*Union([exact=JSString], [exact=JSUInt31])*/ x) {
+/*member: returnDyn7b:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+returnDyn7b(
+  /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ x,
+) {
   return x;
 }
 
-/*member: returnDyn7:Union([exact=JSString], [exact=JSUInt31])*/
+/*member: returnDyn7:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 returnDyn7() {
   dynamic a = "foo";
-  if (a. /*Value([exact=JSString], value: "foo")*/ length /*invoke: [subclass=JSInt]*/ ==
+  if (a. /*Value([exact=JSString|powerset=0], value: "foo", powerset: 0)*/ length /*invoke: [subclass=JSInt|powerset=0]*/ ==
       3) {
     a = 52;
   }
@@ -67,15 +71,17 @@
   return a;
 }
 
-/*member: returnDyn8:Union([exact=JSString], [exact=JSUInt31])*/
-returnDyn8(/*Union([exact=JSString], [exact=JSUInt31])*/ x) {
+/*member: returnDyn8:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+returnDyn8(
+  /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ x,
+) {
   return x;
 }
 
-/*member: test8:Union(null, [exact=JSString], [exact=JSUInt31])*/
+/*member: test8:Union(null, [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
 test8() {
   dynamic a = "foo";
-  if (a. /*Value([exact=JSString], value: "foo")*/ length /*invoke: [subclass=JSInt]*/ ==
+  if (a. /*Value([exact=JSString|powerset=0], value: "foo", powerset: 0)*/ length /*invoke: [subclass=JSInt|powerset=0]*/ ==
       3) {
     a = 52;
   }
@@ -83,35 +89,37 @@
   if ((false && a is! String) || returnDyn8(a)) return a;
 }
 
-/*member: returnDyn9:Union([exact=JSString], [exact=JSUInt31])*/
-returnDyn9(/*Union([exact=JSString], [exact=JSUInt31])*/ x) {
+/*member: returnDyn9:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+returnDyn9(
+  /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ x,
+) {
   return x;
 }
 
-/*member: test9:[null]*/
+/*member: test9:[null|powerset=1]*/
 test9() {
   dynamic a = "foo";
-  if (a. /*Value([exact=JSString], value: "foo")*/ length /*invoke: [subclass=JSInt]*/ ==
+  if (a. /*Value([exact=JSString|powerset=0], value: "foo", powerset: 0)*/ length /*invoke: [subclass=JSInt|powerset=0]*/ ==
       3) {
     a = 52;
   }
   if (!(a is bool && a is bool)) returnDyn9(a);
 }
 
-/*member: returnString:[exact=JSString]*/
-returnString(/*[exact=JSString]*/ x) => x;
+/*member: returnString:[exact=JSString|powerset=0]*/
+returnString(/*[exact=JSString|powerset=0]*/ x) => x;
 
-/*member: test10:[null]*/
+/*member: test10:[null|powerset=1]*/
 test10() {
   dynamic a = "foo";
-  if (a. /*Value([exact=JSString], value: "foo")*/ length /*invoke: [subclass=JSInt]*/ ==
+  if (a. /*Value([exact=JSString|powerset=0], value: "foo", powerset: 0)*/ length /*invoke: [subclass=JSInt|powerset=0]*/ ==
       3) {
     a = 52;
   }
   if (!(a is num) && a is String) returnString(a);
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   returnDyn1();
   returnDyn2();
diff --git a/pkg/compiler/test/inference/data/as.dart b/pkg/compiler/test/inference/data/as.dart
index 7b90268..119de21 100644
--- a/pkg/compiler/test/inference/data/as.dart
+++ b/pkg/compiler/test/inference/data/as.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   asIntWithString();
   asIntWithNegative();
@@ -15,10 +15,12 @@
 // As int of int and non-int types.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _asIntWithString:[exact=JSUInt31]*/
-_asIntWithString(/*Union([exact=JSString], [exact=JSUInt31])*/ o) => o as int;
+/*member: _asIntWithString:[exact=JSUInt31|powerset=0]*/
+_asIntWithString(
+  /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ o,
+) => o as int;
 
-/*member: asIntWithString:[null]*/
+/*member: asIntWithString:[null|powerset=1]*/
 asIntWithString() {
   _asIntWithString(0);
   _asIntWithString('');
@@ -28,10 +30,10 @@
 // As int of known int and an unknown int types.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _asIntWithNegative:[subclass=JSInt]*/
-_asIntWithNegative(/*[subclass=JSInt]*/ o) => o as int;
+/*member: _asIntWithNegative:[subclass=JSInt|powerset=0]*/
+_asIntWithNegative(/*[subclass=JSInt|powerset=0]*/ o) => o as int;
 
-/*member: asIntWithNegative:[null]*/
+/*member: asIntWithNegative:[null|powerset=1]*/
 asIntWithNegative() {
   _asIntWithNegative(0);
   _asIntWithNegative(-1);
@@ -41,10 +43,10 @@
 // As int of 0.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _asIntOfZero:[exact=JSUInt31]*/
-_asIntOfZero(/*[exact=JSUInt31]*/ o) => o as int;
+/*member: _asIntOfZero:[exact=JSUInt31|powerset=0]*/
+_asIntOfZero(/*[exact=JSUInt31|powerset=0]*/ o) => o as int;
 
-/*member: asIntOfZero:[null]*/
+/*member: asIntOfZero:[null|powerset=1]*/
 asIntOfZero() {
   _asIntOfZero(0);
 }
@@ -53,10 +55,10 @@
 // As int of -1.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _asIntOfMinusOne:[subclass=JSInt]*/
-_asIntOfMinusOne(/*[subclass=JSInt]*/ o) => o as int;
+/*member: _asIntOfMinusOne:[subclass=JSInt|powerset=0]*/
+_asIntOfMinusOne(/*[subclass=JSInt|powerset=0]*/ o) => o as int;
 
-/*member: asIntOfMinusOne:[null]*/
+/*member: asIntOfMinusOne:[null|powerset=1]*/
 asIntOfMinusOne() {
   _asIntOfMinusOne(-1);
 }
@@ -65,10 +67,12 @@
 // As int of string.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _asIntOfString:[empty]*/
-_asIntOfString(/*Value([exact=JSString], value: "")*/ o) => o as int;
+/*member: _asIntOfString:[empty|powerset=0]*/
+_asIntOfString(
+  /*Value([exact=JSString|powerset=0], value: "", powerset: 0)*/ o,
+) => o as int;
 
-/*member: asIntOfString:[null]*/
+/*member: asIntOfString:[null|powerset=1]*/
 asIntOfString() {
   _asIntOfString('');
 }
diff --git a/pkg/compiler/test/inference/data/assert.dart b/pkg/compiler/test/inference/data/assert.dart
index 8f470ae..2a56488 100644
--- a/pkg/compiler/test/inference/data/assert.dart
+++ b/pkg/compiler/test/inference/data/assert.dart
@@ -6,7 +6,7 @@
 /// file 'assert_ea.dart' contains similar tests for when assertions are
 /// _enabled_.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   simpleAssert();
   failingAssert();
@@ -22,7 +22,7 @@
 // Simple assert statement known to be valid.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: simpleAssert:[null]*/
+/*member: simpleAssert:[null|powerset=1]*/
 simpleAssert() {
   assert(true);
 }
@@ -31,7 +31,7 @@
 // Simple assert statement known to be invalid.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: failingAssert:[exact=JSUInt31]*/
+/*member: failingAssert:[exact=JSUInt31|powerset=0]*/
 failingAssert() {
   assert(false);
   return 0;
@@ -41,7 +41,7 @@
 // Simple assert statement with message known to be valid.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: simpleAssertWithMessage:[null]*/
+/*member: simpleAssertWithMessage:[null|powerset=1]*/
 simpleAssertWithMessage() {
   assert(true, 'foo');
 }
@@ -50,14 +50,16 @@
 // Assert statement that promotes a local.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _promoteLocalAssert:Union([exact=JSString], [exact=JSUInt31])*/
-_promoteLocalAssert(/*Union([exact=JSString], [exact=JSUInt31])*/ o) {
+/*member: _promoteLocalAssert:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+_promoteLocalAssert(
+  /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ o,
+) {
   var local = o;
   assert(local is int);
   return local;
 }
 
-/*member: promoteLocalAssert:[null]*/
+/*member: promoteLocalAssert:[null|powerset=1]*/
 promoteLocalAssert() {
   _promoteLocalAssert(0);
   _promoteLocalAssert('');
@@ -67,13 +69,15 @@
 // Assert statement that promotes a parameter.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _promoteParameterAssert:Union([exact=JSString], [exact=JSUInt31])*/
-_promoteParameterAssert(/*Union([exact=JSString], [exact=JSUInt31])*/ o) {
+/*member: _promoteParameterAssert:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+_promoteParameterAssert(
+  /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ o,
+) {
   assert(o is int);
   return o;
 }
 
-/*member: promoteParameterAssert:[null]*/
+/*member: promoteParameterAssert:[null|powerset=1]*/
 promoteParameterAssert() {
   _promoteParameterAssert(0);
   _promoteParameterAssert('');
@@ -83,7 +87,7 @@
 // Assert statement with an unreachable throw.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: unreachableThrow:[exact=JSUInt31]*/
+/*member: unreachableThrow:[exact=JSUInt31|powerset=0]*/
 unreachableThrow() {
   assert(true, throw "unreachable");
   return 0;
@@ -93,14 +97,14 @@
 // Assert with a side effect in the message.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _messageWithSideEffect:[null]*/
-_messageWithSideEffect(/*[exact=JSBool]*/ b) {
+/*member: _messageWithSideEffect:[null|powerset=1]*/
+_messageWithSideEffect(/*[exact=JSBool|powerset=0]*/ b) {
   var a;
   assert(b, a = 42);
   return a;
 }
 
-/*member: messageWithSideEffect:[null]*/
+/*member: messageWithSideEffect:[null|powerset=1]*/
 messageWithSideEffect() {
   _messageWithSideEffect(true);
   _messageWithSideEffect(false);
@@ -110,8 +114,8 @@
 // Assert with a caught side effect in the message.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _messageWithCaughtSideEffect:[null]*/
-_messageWithCaughtSideEffect(/*[exact=JSBool]*/ b) {
+/*member: _messageWithCaughtSideEffect:[null|powerset=1]*/
+_messageWithCaughtSideEffect(/*[exact=JSBool|powerset=0]*/ b) {
   var a;
   try {
     assert(b, a = 42);
@@ -119,7 +123,7 @@
   return a;
 }
 
-/*member: messageWithCaughtSideEffect:[null]*/
+/*member: messageWithCaughtSideEffect:[null|powerset=1]*/
 messageWithCaughtSideEffect() {
   _messageWithCaughtSideEffect(true);
   _messageWithCaughtSideEffect(false);
diff --git a/pkg/compiler/test/inference/data/assert_ea.dart b/pkg/compiler/test/inference/data/assert_ea.dart
index 5faff4e..673d3be 100644
--- a/pkg/compiler/test/inference/data/assert_ea.dart
+++ b/pkg/compiler/test/inference/data/assert_ea.dart
@@ -6,7 +6,7 @@
 /// file 'assert.dart' contains similar tests for when assertions are
 /// _disabled_.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   simpleAssert();
   failingAssert();
@@ -22,7 +22,7 @@
 // Simple assert statement known to be valid.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: simpleAssert:[null]*/
+/*member: simpleAssert:[null|powerset=1]*/
 simpleAssert() {
   assert(true);
 }
@@ -31,7 +31,7 @@
 // Simple assert statement known to be invalid.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: failingAssert:[exact=JSUInt31]*/
+/*member: failingAssert:[exact=JSUInt31|powerset=0]*/
 failingAssert() {
   assert(false);
   return 0;
@@ -41,7 +41,7 @@
 // Simple assert statement with message known to be valid.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: simpleAssertWithMessage:[null]*/
+/*member: simpleAssertWithMessage:[null|powerset=1]*/
 simpleAssertWithMessage() {
   assert(true, 'foo');
 }
@@ -50,14 +50,16 @@
 // Assert statement that promotes a local.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _promoteLocalAssert:[exact=JSUInt31]*/
-_promoteLocalAssert(/*Union([exact=JSString], [exact=JSUInt31])*/ o) {
+/*member: _promoteLocalAssert:[exact=JSUInt31|powerset=0]*/
+_promoteLocalAssert(
+  /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ o,
+) {
   var local = o;
   assert(local is int);
   return local;
 }
 
-/*member: promoteLocalAssert:[null]*/
+/*member: promoteLocalAssert:[null|powerset=1]*/
 promoteLocalAssert() {
   _promoteLocalAssert(0);
   _promoteLocalAssert('');
@@ -67,13 +69,15 @@
 // Assert statement that promotes a parameter.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _promoteParameterAssert:[exact=JSUInt31]*/
-_promoteParameterAssert(/*Union([exact=JSString], [exact=JSUInt31])*/ o) {
+/*member: _promoteParameterAssert:[exact=JSUInt31|powerset=0]*/
+_promoteParameterAssert(
+  /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ o,
+) {
   assert(o is int);
   return o;
 }
 
-/*member: promoteParameterAssert:[null]*/
+/*member: promoteParameterAssert:[null|powerset=1]*/
 promoteParameterAssert() {
   _promoteParameterAssert(0);
   _promoteParameterAssert('');
@@ -83,7 +87,7 @@
 // Assert statement with an unreachable throw.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: unreachableThrow:[exact=JSUInt31]*/
+/*member: unreachableThrow:[exact=JSUInt31|powerset=0]*/
 unreachableThrow() {
   assert(true, throw "unreachable");
   return 0;
@@ -93,14 +97,14 @@
 // Assert with a side effect in the message.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _messageWithSideEffect:[null]*/
-_messageWithSideEffect(/*[exact=JSBool]*/ b) {
+/*member: _messageWithSideEffect:[null|powerset=1]*/
+_messageWithSideEffect(/*[exact=JSBool|powerset=0]*/ b) {
   var a;
   assert(b, a = 42);
   return a;
 }
 
-/*member: messageWithSideEffect:[null]*/
+/*member: messageWithSideEffect:[null|powerset=1]*/
 messageWithSideEffect() {
   _messageWithSideEffect(true);
   _messageWithSideEffect(false);
@@ -110,8 +114,8 @@
 // Assert with a caught side effect in the message.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _messageWithCaughtSideEffect:[null|exact=JSUInt31]*/
-_messageWithCaughtSideEffect(/*[exact=JSBool]*/ b) {
+/*member: _messageWithCaughtSideEffect:[null|exact=JSUInt31|powerset=1]*/
+_messageWithCaughtSideEffect(/*[exact=JSBool|powerset=0]*/ b) {
   var a;
   try {
     assert(b, a = 42);
@@ -119,7 +123,7 @@
   return a;
 }
 
-/*member: messageWithCaughtSideEffect:[null]*/
+/*member: messageWithCaughtSideEffect:[null|powerset=1]*/
 messageWithCaughtSideEffect() {
   _messageWithCaughtSideEffect(true);
   _messageWithCaughtSideEffect(false);
diff --git a/pkg/compiler/test/inference/data/assert_initializer.dart b/pkg/compiler/test/inference/data/assert_initializer.dart
index 1561747..5adf56b 100644
--- a/pkg/compiler/test/inference/data/assert_initializer.dart
+++ b/pkg/compiler/test/inference/data/assert_initializer.dart
@@ -3,21 +3,23 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class X {
-  /*member: X.a:Union([exact=JSExtendableArray], [exact=JSString])*/
+  /*member: X.a:Union([exact=JSExtendableArray|powerset=0], [exact=JSString|powerset=0], powerset: 0)*/
   final dynamic a;
 
-  /*member: X.:[exact=X]*/
-  X(Object /*Union([exact=JSExtendableArray], [exact=JSString])*/ value)
-    : assert(value is String),
+  /*member: X.:[exact=X|powerset=0]*/
+  X(
+    Object /*Union([exact=JSExtendableArray|powerset=0], [exact=JSString|powerset=0], powerset: 0)*/
+    value,
+  ) : assert(value is String),
       a = value;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   X('a')
-      . /*[exact=X]*/ a
-      . /*Union([exact=JSExtendableArray], [exact=JSString])*/ length;
+      . /*[exact=X|powerset=0]*/ a
+      . /*Union([exact=JSExtendableArray|powerset=0], [exact=JSString|powerset=0], powerset: 0)*/ length;
   X([1])
-      . /*[exact=X]*/ a
-      . /*Union([exact=JSExtendableArray], [exact=JSString])*/ length;
+      . /*[exact=X|powerset=0]*/ a
+      . /*Union([exact=JSExtendableArray|powerset=0], [exact=JSString|powerset=0], powerset: 0)*/ length;
 }
diff --git a/pkg/compiler/test/inference/data/assert_initializer_ea.dart b/pkg/compiler/test/inference/data/assert_initializer_ea.dart
index ccf9261..a2432d1 100644
--- a/pkg/compiler/test/inference/data/assert_initializer_ea.dart
+++ b/pkg/compiler/test/inference/data/assert_initializer_ea.dart
@@ -3,17 +3,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class X {
-  /*member: X.a:[exact=JSString]*/
+  /*member: X.a:[exact=JSString|powerset=0]*/
   final dynamic a;
 
-  /*member: X.:[exact=X]*/
-  X(Object /*Union([exact=JSExtendableArray], [exact=JSString])*/ value)
-    : assert(value is String),
+  /*member: X.:[exact=X|powerset=0]*/
+  X(
+    Object /*Union([exact=JSExtendableArray|powerset=0], [exact=JSString|powerset=0], powerset: 0)*/
+    value,
+  ) : assert(value is String),
       a = value;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
-  X('a'). /*[exact=X]*/ a. /*[exact=JSString]*/ length;
-  X([1]). /*[exact=X]*/ a. /*[exact=JSString]*/ length;
+  X('a'). /*[exact=X|powerset=0]*/ a. /*[exact=JSString|powerset=0]*/ length;
+  X([1]). /*[exact=X|powerset=0]*/ a. /*[exact=JSString|powerset=0]*/ length;
 }
diff --git a/pkg/compiler/test/inference/data/assert_message_throw.dart b/pkg/compiler/test/inference/data/assert_message_throw.dart
index 1115952..4fc92dd 100644
--- a/pkg/compiler/test/inference/data/assert_message_throw.dart
+++ b/pkg/compiler/test/inference/data/assert_message_throw.dart
@@ -6,8 +6,8 @@
 /// file 'assert_message_throw_ea.dart' contains similar tests for when
 /// assertions are _enabled_.
 
-/*member: main:[null]*/
-main(/*[null|subclass=Object]*/ args) {
+/*member: main:[null|powerset=1]*/
+main(/*[null|subclass=Object|powerset=1]*/ args) {
   test0();
   test1(args == null);
   test2(args == null);
@@ -15,7 +15,7 @@
 }
 
 // Check that `throw` in the message is handled conditionally.
-/*member: test0:Container([exact=JSExtendableArray], element: [empty], length: 0)*/
+/*member: test0:Container([exact=JSExtendableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)*/
 test0() {
   assert(true, throw "unreachable");
   var list = [];
@@ -24,8 +24,8 @@
 
 // Check that side-effects of the assert message is not included after the
 // assert.
-/*member: test1:[null]*/
-test1(/*[exact=JSBool]*/ b) {
+/*member: test1:[null|powerset=1]*/
+test1(/*[exact=JSBool|powerset=0]*/ b) {
   var a;
   assert(b, a = 42);
   return a;
@@ -33,8 +33,8 @@
 
 // Check that side-effects of the assert message is included after the assert
 // through the thrown exception.
-/*member: test2:[null]*/
-test2(/*[exact=JSBool]*/ b) {
+/*member: test2:[null|powerset=1]*/
+test2(/*[exact=JSBool|powerset=0]*/ b) {
   var a;
   try {
     assert(b, a = 42);
@@ -43,8 +43,8 @@
 }
 
 // Check that type tests are preserved after the assert.
-/*member: test3:[null|subclass=Object]*/
-test3(/*[null|subclass=Object]*/ a) {
+/*member: test3:[null|subclass=Object|powerset=1]*/
+test3(/*[null|subclass=Object|powerset=1]*/ a) {
   assert(a is int);
   return a;
 }
diff --git a/pkg/compiler/test/inference/data/assert_message_throw_ea.dart b/pkg/compiler/test/inference/data/assert_message_throw_ea.dart
index 72e4618..3001368 100644
--- a/pkg/compiler/test/inference/data/assert_message_throw_ea.dart
+++ b/pkg/compiler/test/inference/data/assert_message_throw_ea.dart
@@ -6,8 +6,8 @@
 /// file 'assert_message_throw.dart' contains similar tests for when assertions
 /// are _disabled_.
 
-/*member: main:[null]*/
-main(/*[null|subclass=Object]*/ args) {
+/*member: main:[null|powerset=1]*/
+main(/*[null|subclass=Object|powerset=1]*/ args) {
   test0();
   test1(args == null);
   test2(args == null);
@@ -15,7 +15,7 @@
 }
 
 // Check that `throw` in the message is handled conditionally.
-/*member: test0:Container([exact=JSExtendableArray], element: [empty], length: 0)*/
+/*member: test0:Container([exact=JSExtendableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)*/
 test0() {
   assert(true, throw "unreachable");
   var list = [];
@@ -24,8 +24,8 @@
 
 // Check that side-effects of the assert message is not included after the
 // assert.
-/*member: test1:[null]*/
-test1(/*[exact=JSBool]*/ b) {
+/*member: test1:[null|powerset=1]*/
+test1(/*[exact=JSBool|powerset=0]*/ b) {
   var a;
   assert(b, a = 42);
   return a;
@@ -33,8 +33,8 @@
 
 // Check that side-effects of the assert message is included after the assert
 // through the thrown exception.
-/*member: test2:[null|exact=JSUInt31]*/
-test2(/*[exact=JSBool]*/ b) {
+/*member: test2:[null|exact=JSUInt31|powerset=1]*/
+test2(/*[exact=JSBool|powerset=0]*/ b) {
   var a;
   try {
     assert(b, a = 42);
@@ -43,8 +43,8 @@
 }
 
 // Check that type tests are preserved after the assert.
-/*member: test3:[subclass=JSInt]*/
-test3(/*[null|subclass=Object]*/ a) {
+/*member: test3:[subclass=JSInt|powerset=0]*/
+test3(/*[null|subclass=Object|powerset=1]*/ a) {
   assert(a is int);
   return a;
 }
diff --git a/pkg/compiler/test/inference/data/assign_op.dart b/pkg/compiler/test/inference/data/assign_op.dart
index a0a20e5..610840c0 100644
--- a/pkg/compiler/test/inference/data/assign_op.dart
+++ b/pkg/compiler/test/inference/data/assign_op.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   assignPlus();
   assignAnd();
@@ -16,78 +16,78 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: assignPlus:[subclass=JSUInt32]*/
+/*member: assignPlus:[subclass=JSUInt32|powerset=0]*/
 assignPlus() {
   var i = 87;
-  return i /*invoke: [exact=JSUInt31]*/ += 42;
+  return i /*invoke: [exact=JSUInt31|powerset=0]*/ += 42;
 }
 
-/*member: assignAnd:[exact=JSUInt31]*/
+/*member: assignAnd:[exact=JSUInt31|powerset=0]*/
 assignAnd() {
   var i = 87;
-  return i /*invoke: [exact=JSUInt31]*/ &= 42;
+  return i /*invoke: [exact=JSUInt31|powerset=0]*/ &= 42;
 }
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
-  /*member: Class1.field:[subclass=JSPositiveInt]*/
+  /*member: Class1.field:[subclass=JSPositiveInt|powerset=0]*/
   var field = 87;
 }
 
-/*member: instanceAssignPlus:[subclass=JSPositiveInt]*/
+/*member: instanceAssignPlus:[subclass=JSPositiveInt|powerset=0]*/
 instanceAssignPlus() {
   var c = Class1();
-  return c. /*[exact=Class1]*/ /*update: [exact=Class1]*/ field /*invoke: [subclass=JSPositiveInt]*/ +=
+  return c. /*[exact=Class1|powerset=0]*/ /*update: [exact=Class1|powerset=0]*/ field /*invoke: [subclass=JSPositiveInt|powerset=0]*/ +=
       42;
 }
 
-/*member: Class2.:[exact=Class2]*/
+/*member: Class2.:[exact=Class2|powerset=0]*/
 class Class2 {
-  /*member: Class2.field:[exact=JSUInt31]*/
+  /*member: Class2.field:[exact=JSUInt31|powerset=0]*/
   var field = 87;
 }
 
-/*member: instanceAssignAnd:[exact=JSUInt31]*/
+/*member: instanceAssignAnd:[exact=JSUInt31|powerset=0]*/
 instanceAssignAnd() {
   var c = Class2();
-  return c. /*[exact=Class2]*/ /*update: [exact=Class2]*/ field /*invoke: [exact=JSUInt31]*/ &=
+  return c. /*[exact=Class2|powerset=0]*/ /*update: [exact=Class2|powerset=0]*/ field /*invoke: [exact=JSUInt31|powerset=0]*/ &=
       42;
 }
 
-/*member: assignIndexPlus:[subclass=JSPositiveInt]*/
+/*member: assignIndexPlus:[subclass=JSPositiveInt|powerset=0]*/
 assignIndexPlus() {
   var i = [87];
   return i
-      /*Container([exact=JSExtendableArray], element: [subclass=JSPositiveInt], length: 1)*/
-      /*update: Container([exact=JSExtendableArray], element: [subclass=JSPositiveInt], length: 1)*/
-      [0] /*invoke: [subclass=JSPositiveInt]*/ +=
+      /*Container([exact=JSExtendableArray|powerset=0], element: [subclass=JSPositiveInt|powerset=0], length: 1, powerset: 0)*/
+      /*update: Container([exact=JSExtendableArray|powerset=0], element: [subclass=JSPositiveInt|powerset=0], length: 1, powerset: 0)*/
+      [0] /*invoke: [subclass=JSPositiveInt|powerset=0]*/ +=
       42;
 }
 
-/*member: assignIndexAnd:[exact=JSUInt31]*/
+/*member: assignIndexAnd:[exact=JSUInt31|powerset=0]*/
 assignIndexAnd() {
   var i = [87];
   return i
-      /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
-      /*update: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
-      [0] /*invoke: [exact=JSUInt31]*/ &=
+      /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
+      /*update: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
+      [0] /*invoke: [exact=JSUInt31|powerset=0]*/ &=
       42;
 }
 
-/*member: assignIndexInc:[subclass=JSPositiveInt]*/
+/*member: assignIndexInc:[subclass=JSPositiveInt|powerset=0]*/
 assignIndexInc() {
   var i = [87];
   return i
-  /*Container([exact=JSExtendableArray], element: [subclass=JSPositiveInt], length: 1)*/
-  /*update: Container([exact=JSExtendableArray], element: [subclass=JSPositiveInt], length: 1)*/
-  [0] /*invoke: [subclass=JSPositiveInt]*/ ++;
+  /*Container([exact=JSExtendableArray|powerset=0], element: [subclass=JSPositiveInt|powerset=0], length: 1, powerset: 0)*/
+  /*update: Container([exact=JSExtendableArray|powerset=0], element: [subclass=JSPositiveInt|powerset=0], length: 1, powerset: 0)*/
+  [0] /*invoke: [subclass=JSPositiveInt|powerset=0]*/ ++;
 }
 
-/*member: assignIndexDec:[subclass=JSInt]*/
+/*member: assignIndexDec:[subclass=JSInt|powerset=0]*/
 assignIndexDec() {
   var i = [87];
-  return /*invoke: [subclass=JSInt]*/ --i
-  /*Container([exact=JSExtendableArray], element: [subclass=JSInt], length: 1)*/
-  /*update: Container([exact=JSExtendableArray], element: [subclass=JSInt], length: 1)*/
+  return /*invoke: [subclass=JSInt|powerset=0]*/ --i
+  /*Container([exact=JSExtendableArray|powerset=0], element: [subclass=JSInt|powerset=0], length: 1, powerset: 0)*/
+  /*update: Container([exact=JSExtendableArray|powerset=0], element: [subclass=JSInt|powerset=0], length: 1, powerset: 0)*/
   [0];
 }
diff --git a/pkg/compiler/test/inference/data/async_marker.dart b/pkg/compiler/test/inference/data/async_marker.dart
index 97a9464..8c73e76 100644
--- a/pkg/compiler/test/inference/data/async_marker.dart
+++ b/pkg/compiler/test/inference/data/async_marker.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   asyncMethod();
   asyncMethodWithReturn();
@@ -10,16 +10,16 @@
   syncStarMethod();
 }
 
-/*member: asyncMethod:[exact=_Future]*/
+/*member: asyncMethod:[exact=_Future|powerset=0]*/
 asyncMethod() async {}
 
-/*member: asyncMethodWithReturn:Union([exact=JSUInt31], [exact=_Future])*/
+/*member: asyncMethodWithReturn:Union([exact=JSUInt31|powerset=0], [exact=_Future|powerset=0], powerset: 0)*/
 asyncMethodWithReturn() async {
   return 0;
 }
 
-/*member: asyncStarMethod:[exact=_ControllerStream]*/
+/*member: asyncStarMethod:[exact=_ControllerStream|powerset=0]*/
 asyncStarMethod() async* {}
 
-/*member: syncStarMethod:[exact=_SyncStarIterable]*/
+/*member: syncStarMethod:[exact=_SyncStarIterable|powerset=0]*/
 syncStarMethod() sync* {}
diff --git a/pkg/compiler/test/inference/data/await.dart b/pkg/compiler/test/inference/data/await.dart
index 96fcbc7..3966fd8 100644
--- a/pkg/compiler/test/inference/data/await.dart
+++ b/pkg/compiler/test/inference/data/await.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   awaitOfFuture();
   awaitOfFutureWithLocal();
@@ -17,19 +17,19 @@
 // Await of Future.value.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _method1a:[null]*/
-_method1a(/*[subclass=JSInt]*/ o) {}
+/*member: _method1a:[null|powerset=1]*/
+_method1a(/*[subclass=JSInt|powerset=0]*/ o) {}
 
-/*member: awaitOfFuture:[exact=_Future]*/
+/*member: awaitOfFuture:[exact=_Future|powerset=0]*/
 awaitOfFuture() async {
   var future = Future.value(0);
   _method1a(await future);
 }
 
-/*member: _method1b:[null]*/
-_method1b(/*[subclass=JSInt]*/ o) {}
+/*member: _method1b:[null|powerset=1]*/
+_method1b(/*[subclass=JSInt|powerset=0]*/ o) {}
 
-/*member: awaitOfFutureWithLocal:[exact=_Future]*/
+/*member: awaitOfFutureWithLocal:[exact=_Future|powerset=0]*/
 awaitOfFutureWithLocal() async {
   var future = Future.value(0);
   var local = await future;
@@ -40,18 +40,18 @@
 // Await of int.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _method2a:[null]*/
-_method2a(/*[subclass=JSInt]*/ o) {}
+/*member: _method2a:[null|powerset=1]*/
+_method2a(/*[subclass=JSInt|powerset=0]*/ o) {}
 
-/*member: awaitOfInt:[exact=_Future]*/
+/*member: awaitOfInt:[exact=_Future|powerset=0]*/
 awaitOfInt() async {
   _method2a(await 0);
 }
 
-/*member: _method2b:[null]*/
-_method2b(/*[subclass=JSInt]*/ o) {}
+/*member: _method2b:[null|powerset=1]*/
+_method2b(/*[subclass=JSInt|powerset=0]*/ o) {}
 
-/*member: awaitOfIntWithLocal:[exact=_Future]*/
+/*member: awaitOfIntWithLocal:[exact=_Future|powerset=0]*/
 awaitOfIntWithLocal() async {
   var local = await 0;
   _method2b(local);
@@ -61,22 +61,22 @@
 // Await for of Stream.fromIterable.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _method3:[null]*/
+/*member: _method3:[null|powerset=1]*/
 _method3(
-  /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+  /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
   o,
 ) {}
 
-/*member: _method4:[null]*/
-_method4(/*[subclass=JSInt]*/ o) {}
+/*member: _method4:[null|powerset=1]*/
+_method4(/*[subclass=JSInt|powerset=0]*/ o) {}
 
-/*member: awaitForOfStream:[exact=_Future]*/
+/*member: awaitForOfStream:[exact=_Future|powerset=0]*/
 awaitForOfStream() async {
   var list = [0];
   _method3(list);
   var stream = Stream.fromIterable(list);
-  /*current: [exact=_StreamIterator]*/
-  /*moveNext: [exact=_StreamIterator]*/
+  /*current: [exact=_StreamIterator|powerset=0]*/
+  /*moveNext: [exact=_StreamIterator|powerset=0]*/
   await for (var local in stream) {
     _method4(local);
   }
diff --git a/pkg/compiler/test/inference/data/break_continue.dart b/pkg/compiler/test/inference/data/break_continue.dart
index e03da61..91bfc64 100644
--- a/pkg/compiler/test/inference/data/break_continue.dart
+++ b/pkg/compiler/test/inference/data/break_continue.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   breakInWhile();
   noBreakInWhile();
@@ -18,8 +18,8 @@
 // A break statement in a while loop.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _breakInWhile:Union([exact=JSString], [exact=JSUInt31])*/
-_breakInWhile(/*[exact=JSBool]*/ b) {
+/*member: _breakInWhile:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+_breakInWhile(/*[exact=JSBool|powerset=0]*/ b) {
   dynamic local = 42;
   while (b) {
     if (b) {
@@ -31,7 +31,7 @@
   return local;
 }
 
-/*member: breakInWhile:[null]*/
+/*member: breakInWhile:[null|powerset=1]*/
 breakInWhile() {
   _breakInWhile(true);
   _breakInWhile(false);
@@ -41,8 +41,8 @@
 // The while loop above _without_ the break statement.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _noBreakInWhile:[exact=JSUInt31]*/
-_noBreakInWhile(/*[exact=JSBool]*/ b) {
+/*member: _noBreakInWhile:[exact=JSUInt31|powerset=0]*/
+_noBreakInWhile(/*[exact=JSBool|powerset=0]*/ b) {
   dynamic local = 42;
   while (b) {
     if (b) {
@@ -53,7 +53,7 @@
   return local;
 }
 
-/*member: noBreakInWhile:[null]*/
+/*member: noBreakInWhile:[null|powerset=1]*/
 noBreakInWhile() {
   _noBreakInWhile(true);
   _noBreakInWhile(false);
@@ -63,11 +63,12 @@
 // A continue statement in a while loop.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _continueInWhile:Union([exact=JSString], [exact=JSUInt31])*/
-_continueInWhile(/*[exact=JSBool]*/ b) {
+/*member: _continueInWhile:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+_continueInWhile(/*[exact=JSBool|powerset=0]*/ b) {
   dynamic local = 42;
   while (b) {
-    local /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ + null;
+    local /*invoke: Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ +
+        null;
     if (b) {
       local = '';
       continue;
@@ -77,7 +78,7 @@
   return local;
 }
 
-/*member: continueInWhile:[null]*/
+/*member: continueInWhile:[null|powerset=1]*/
 continueInWhile() {
   _continueInWhile(true);
   _continueInWhile(false);
@@ -87,11 +88,11 @@
 // The while loop above _without_ the continue statement.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _noContinueInWhile:[exact=JSUInt31]*/
-_noContinueInWhile(/*[exact=JSBool]*/ b) {
+/*member: _noContinueInWhile:[exact=JSUInt31|powerset=0]*/
+_noContinueInWhile(/*[exact=JSBool|powerset=0]*/ b) {
   dynamic local = 42;
   while (b) {
-    local /*invoke: [exact=JSUInt31]*/ + null;
+    local /*invoke: [exact=JSUInt31|powerset=0]*/ + null;
     if (b) {
       local = '';
     }
@@ -100,7 +101,7 @@
   return local;
 }
 
-/*member: noContinueInWhile:[null]*/
+/*member: noContinueInWhile:[null|powerset=1]*/
 noContinueInWhile() {
   _noContinueInWhile(true);
   _noContinueInWhile(false);
@@ -110,8 +111,8 @@
 // A conditional break statement in a labeled statement.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _breakInIf:Union([exact=JSString], [exact=JSUInt31])*/
-_breakInIf(/*[exact=JSBool]*/ b) {
+/*member: _breakInIf:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+_breakInIf(/*[exact=JSBool|powerset=0]*/ b) {
   dynamic local = 42;
   label:
   {
@@ -124,7 +125,7 @@
   return local;
 }
 
-/*member: breakInIf:[null]*/
+/*member: breakInIf:[null|powerset=1]*/
 breakInIf() {
   _breakInIf(true);
   _breakInIf(false);
@@ -134,8 +135,8 @@
 // The "labeled statement" above _without_ the break statement.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _noBreakInIf:[exact=JSUInt31]*/
-_noBreakInIf(/*[exact=JSBool]*/ b) {
+/*member: _noBreakInIf:[exact=JSUInt31|powerset=0]*/
+_noBreakInIf(/*[exact=JSBool|powerset=0]*/ b) {
   dynamic local = 42;
   {
     local = '';
@@ -145,7 +146,7 @@
   return local;
 }
 
-/*member: noBreakInIf:[null]*/
+/*member: noBreakInIf:[null|powerset=1]*/
 noBreakInIf() {
   _noBreakInIf(true);
   _noBreakInIf(false);
@@ -155,7 +156,7 @@
 // An unconditional break statement in a labeled statement.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: breakInBlock:Value([exact=JSString], value: "")*/
+/*member: breakInBlock:Value([exact=JSString|powerset=0], value: "", powerset: 0)*/
 breakInBlock() {
   dynamic local = 42;
   label:
@@ -171,7 +172,7 @@
 // The "labeled statement" above _without_ the break statement.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: noBreakInBlock:Value([exact=JSBool], value: false)*/
+/*member: noBreakInBlock:Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/
 noBreakInBlock() {
   dynamic local = 42;
   label:
diff --git a/pkg/compiler/test/inference/data/call_in_loop.dart b/pkg/compiler/test/inference/data/call_in_loop.dart
index b07d876..0e521c5 100644
--- a/pkg/compiler/test/inference/data/call_in_loop.dart
+++ b/pkg/compiler/test/inference/data/call_in_loop.dart
@@ -4,23 +4,23 @@
 
 /// Regression test for [ClosureCallSiteTypeInformation] in loops.
 
-/*member: Class.:[exact=Class]*/
+/*member: Class.:[exact=Class|powerset=0]*/
 class Class<T> {
-  /*member: Class.method:[null]*/
+  /*member: Class.method:[null|powerset=1]*/
   method() {
-    /*iterator: Container([exact=JSExtendableArray], element: [empty], length: 0)*/
-    /*current: [exact=ArrayIterator]*/
-    /*moveNext: [exact=ArrayIterator]*/
+    /*iterator: Container([exact=JSExtendableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)*/
+    /*current: [exact=ArrayIterator|powerset=0]*/
+    /*moveNext: [exact=ArrayIterator|powerset=0]*/
     for (var a in []) {
-      (T as dynamic) /*invoke: [exact=_Type]*/ (a);
-      (Object as dynamic) /*invoke: [exact=_Type]*/ ();
-      (this as dynamic) /*invoke: [exact=Class]*/ ();
-      (1 as dynamic) /*invoke: [exact=JSUInt31]*/ ();
+      (T as dynamic) /*invoke: [exact=_Type|powerset=0]*/ (a);
+      (Object as dynamic) /*invoke: [exact=_Type|powerset=0]*/ ();
+      (this as dynamic) /*invoke: [exact=Class|powerset=0]*/ ();
+      (1 as dynamic) /*invoke: [exact=JSUInt31|powerset=0]*/ ();
     }
   }
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
-  Class(). /*invoke: [exact=Class]*/ method();
+  Class(). /*invoke: [exact=Class|powerset=0]*/ method();
 }
diff --git a/pkg/compiler/test/inference/data/call_method_function_typed_value.dart b/pkg/compiler/test/inference/data/call_method_function_typed_value.dart
index ec90c7e..0063a63 100644
--- a/pkg/compiler/test/inference/data/call_method_function_typed_value.dart
+++ b/pkg/compiler/test/inference/data/call_method_function_typed_value.dart
@@ -6,26 +6,28 @@
 
 import "package:expect/expect.dart";
 
-/*member: f:[subclass=JSInt]*/
+/*member: f:[subclass=JSInt|powerset=0]*/
 int f(
   int
-  /*spec.[null|subclass=Object]*/
-  /*prod.[subclass=JSInt]*/
+  /*spec.[null|subclass=Object|powerset=1]*/
+  /*prod.[subclass=JSInt|powerset=0]*/
   i,
-) => 2 /*invoke: [exact=JSUInt31]*/ * i;
+) => 2 /*invoke: [exact=JSUInt31|powerset=0]*/ * i;
 
 typedef int IntToInt(int x);
 
-/*member: test:[null]*/
-test(/*[null|subclass=Object]*/ a, /*[subclass=Closure]*/ b) =>
-    Expect.identical(a, b);
+/*member: test:[null|powerset=1]*/
+test(
+  /*[null|subclass=Object|powerset=1]*/ a,
+  /*[subclass=Closure|powerset=0]*/ b,
+) => Expect.identical(a, b);
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   // It is possible to use `.call` on a function-typed value (even though it is
   // redundant).  Similarly, it is possible to tear off `.call` on a
   // function-typed value (but it is a no-op).
   IntToInt f2 = f;
 
-  test(f2. /*[subclass=Closure]*/ call, f);
+  test(f2. /*[subclass=Closure|powerset=0]*/ call, f);
 }
diff --git a/pkg/compiler/test/inference/data/call_site.dart b/pkg/compiler/test/inference/data/call_site.dart
index 5337b22..1dfc929 100644
--- a/pkg/compiler/test/inference/data/call_site.dart
+++ b/pkg/compiler/test/inference/data/call_site.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   test1();
   test2();
@@ -25,291 +25,301 @@
   test19();
 }
 
-/*member: A1.:[exact=A1]*/
+/*member: A1.:[exact=A1|powerset=0]*/
 class A1 {
-  /*member: A1.x1:Value([exact=JSString], value: "s")*/
-  x1(/*Value([exact=JSString], value: "s")*/ p) => p;
+  /*member: A1.x1:Value([exact=JSString|powerset=0], value: "s", powerset: 0)*/
+  x1(/*Value([exact=JSString|powerset=0], value: "s", powerset: 0)*/ p) => p;
 }
 
-/*member: test1:[null]*/
+/*member: test1:[null|powerset=1]*/
 test1() {
-  A1(). /*invoke: [exact=A1]*/ x1("s");
+  A1(). /*invoke: [exact=A1|powerset=0]*/ x1("s");
 }
 
-/*member: A2.:[exact=A2]*/
+/*member: A2.:[exact=A2|powerset=0]*/
 class A2 {
-  /*member: A2.x2:[exact=JSUInt31]*/
-  x2(/*[exact=JSUInt31]*/ p) => p;
+  /*member: A2.x2:[exact=JSUInt31|powerset=0]*/
+  x2(/*[exact=JSUInt31|powerset=0]*/ p) => p;
 }
 
-/*member: test2:[null]*/
+/*member: test2:[null|powerset=1]*/
 test2() {
-  A2(). /*invoke: [exact=A2]*/ x2(1);
+  A2(). /*invoke: [exact=A2|powerset=0]*/ x2(1);
 }
 
-/*member: A3.:[exact=A3]*/
+/*member: A3.:[exact=A3|powerset=0]*/
 class A3 {
-  /*member: A3.x3:[empty]*/
-  x3(/*[subclass=JSInt]*/ p) => /*invoke: [exact=A3]*/
-      x3(p /*invoke: [subclass=JSInt]*/ - 1);
+  /*member: A3.x3:[empty|powerset=0]*/
+  x3(/*[subclass=JSInt|powerset=0]*/ p) => /*invoke: [exact=A3|powerset=0]*/
+      x3(p /*invoke: [subclass=JSInt|powerset=0]*/ - 1);
 }
 
-/*member: test3:[null]*/
+/*member: test3:[null|powerset=1]*/
 test3() {
-  A3(). /*invoke: [exact=A3]*/ x3(1);
+  A3(). /*invoke: [exact=A3|powerset=0]*/ x3(1);
 }
 
-/*member: A4.:[exact=A4]*/
+/*member: A4.:[exact=A4|powerset=0]*/
 class A4 {
-  /*member: A4.x4:[empty]*/
-  x4(/*[subclass=JSNumber]*/ p) => /*invoke: [exact=A4]*/
-      x4(p /*invoke: [subclass=JSNumber]*/ - 1);
+  /*member: A4.x4:[empty|powerset=0]*/
+  x4(/*[subclass=JSNumber|powerset=0]*/ p) => /*invoke: [exact=A4|powerset=0]*/
+      x4(p /*invoke: [subclass=JSNumber|powerset=0]*/ - 1);
 }
 
-/*member: test4:[null]*/
+/*member: test4:[null|powerset=1]*/
 test4() {
-  A4(). /*invoke: [exact=A4]*/ x4(1.5);
+  A4(). /*invoke: [exact=A4|powerset=0]*/ x4(1.5);
 }
 
-/*member: A5.:[exact=A5]*/
+/*member: A5.:[exact=A5|powerset=0]*/
 class A5 {
-  /*member: A5.x5:Union([exact=JSNumNotInt], [exact=JSUInt31])*/
-  x5(/*Union([exact=JSNumNotInt], [exact=JSUInt31])*/ p) => p;
+  /*member: A5.x5:Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+  x5(
+    /*Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ p,
+  ) => p;
 }
 
-/*member: test5:[null]*/
+/*member: test5:[null|powerset=1]*/
 test5() {
-  A5(). /*invoke: [exact=A5]*/ x5(1);
-  A5(). /*invoke: [exact=A5]*/ x5(1.5);
+  A5(). /*invoke: [exact=A5|powerset=0]*/ x5(1);
+  A5(). /*invoke: [exact=A5|powerset=0]*/ x5(1.5);
 }
 
-/*member: A6.:[exact=A6]*/
+/*member: A6.:[exact=A6|powerset=0]*/
 class A6 {
-  /*member: A6.x6:Union([exact=JSNumNotInt], [exact=JSUInt31])*/
-  x6(/*Union([exact=JSNumNotInt], [exact=JSUInt31])*/ p) => p;
+  /*member: A6.x6:Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+  x6(
+    /*Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ p,
+  ) => p;
 }
 
-/*member: test6:[null]*/
+/*member: test6:[null|powerset=1]*/
 test6() {
-  A6(). /*invoke: [exact=A6]*/ x6(1.5);
-  A6(). /*invoke: [exact=A6]*/ x6(1);
+  A6(). /*invoke: [exact=A6|powerset=0]*/ x6(1.5);
+  A6(). /*invoke: [exact=A6|powerset=0]*/ x6(1);
 }
 
-/*member: A7.:[exact=A7]*/
+/*member: A7.:[exact=A7|powerset=0]*/
 class A7 {
-  /*member: A7.x7:[empty]*/
-  x7(/*Union([exact=JSString], [exact=JSUInt31])*/ p) => /*invoke: [exact=A7]*/
-      x7("x");
+  /*member: A7.x7:[empty|powerset=0]*/
+  x7(
+    /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ p,
+  ) => /*invoke: [exact=A7|powerset=0]*/ x7("x");
 }
 
-/*member: test7:[null]*/
+/*member: test7:[null|powerset=1]*/
 test7() {
-  A7(). /*invoke: [exact=A7]*/ x7(1);
+  A7(). /*invoke: [exact=A7|powerset=0]*/ x7(1);
 }
 
-/*member: A8.:[exact=A8]*/
+/*member: A8.:[exact=A8|powerset=0]*/
 class A8 {
-  /*member: A8.x8:[empty]*/
-  x8(/*Union([exact=JSString], [exact=JsLinkedHashMap])*/ p) =>
-  /*invoke: [exact=A8]*/ x8("x");
-}
-
-/*member: test8:[null]*/
-test8() {
-  A8(). /*invoke: [exact=A8]*/ x8({});
-}
-
-/*member: A9.:[exact=A9]*/
-class A9 {
-  /*member: A9.x9:[empty]*/
-  x9(
-    /*[exact=JSUInt31]*/ p1,
-    /*Union([exact=JSString], [exact=JSUInt31])*/ p2,
-    /*Union([exact=JSUInt31], [exact=JsLinkedHashMap])*/ p3,
+  /*member: A8.x8:[empty|powerset=0]*/
+  x8(
+    /*Union([exact=JSString|powerset=0], [exact=JsLinkedHashMap|powerset=0], powerset: 0)*/ p,
   ) =>
-  /*invoke: [exact=A9]*/ x9(p1, "x", {});
+  /*invoke: [exact=A8|powerset=0]*/ x8("x");
 }
 
-/*member: test9:[null]*/
+/*member: test8:[null|powerset=1]*/
+test8() {
+  A8(). /*invoke: [exact=A8|powerset=0]*/ x8({});
+}
+
+/*member: A9.:[exact=A9|powerset=0]*/
+class A9 {
+  /*member: A9.x9:[empty|powerset=0]*/
+  x9(
+    /*[exact=JSUInt31|powerset=0]*/ p1,
+    /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ p2,
+    /*Union([exact=JSUInt31|powerset=0], [exact=JsLinkedHashMap|powerset=0], powerset: 0)*/ p3,
+  ) =>
+  /*invoke: [exact=A9|powerset=0]*/ x9(p1, "x", {});
+}
+
+/*member: test9:[null|powerset=1]*/
 test9() {
-  A9(). /*invoke: [exact=A9]*/ x9(1, 2, 3);
+  A9(). /*invoke: [exact=A9|powerset=0]*/ x9(1, 2, 3);
 }
 
-/*member: A10.:[exact=A10]*/
+/*member: A10.:[exact=A10|powerset=0]*/
 class A10 {
-  /*member: A10.x10:[empty]*/
+  /*member: A10.x10:[empty|powerset=0]*/
   x10(
-    /*[exact=JSUInt31]*/ p1,
-    /*[exact=JSUInt31]*/ p2,
-  ) => /*invoke: [exact=A10]*/ x10(p1, p2);
+    /*[exact=JSUInt31|powerset=0]*/ p1,
+    /*[exact=JSUInt31|powerset=0]*/ p2,
+  ) => /*invoke: [exact=A10|powerset=0]*/ x10(p1, p2);
 }
 
-/*member: test10:[null]*/
+/*member: test10:[null|powerset=1]*/
 test10() {
-  A10(). /*invoke: [exact=A10]*/ x10(1, 2);
+  A10(). /*invoke: [exact=A10|powerset=0]*/ x10(1, 2);
 }
 
-/*member: A11.:[exact=A11]*/
+/*member: A11.:[exact=A11|powerset=0]*/
 class A11 {
-  /*member: A11.x11:[empty]*/
+  /*member: A11.x11:[empty|powerset=0]*/
   x11(
-    /*[exact=JSUInt31]*/ p1,
-    /*[exact=JSUInt31]*/ p2,
-  ) => /*invoke: [exact=A11]*/ x11(p1, p2);
+    /*[exact=JSUInt31|powerset=0]*/ p1,
+    /*[exact=JSUInt31|powerset=0]*/ p2,
+  ) => /*invoke: [exact=A11|powerset=0]*/ x11(p1, p2);
 }
 
-/*member: f11:[null]*/
-void f11(/*[null]*/ p) {
-  p. /*invoke: [null]*/ x11("x", "y");
+/*member: f11:[null|powerset=1]*/
+void f11(/*[null|powerset=1]*/ p) {
+  p. /*invoke: [null|powerset=1]*/ x11("x", "y");
 }
 
-/*member: test11:[null]*/
+/*member: test11:[null|powerset=1]*/
 test11() {
   f11(null);
-  A11(). /*invoke: [exact=A11]*/ x11(1, 2);
+  A11(). /*invoke: [exact=A11|powerset=0]*/ x11(1, 2);
 }
 
-/*member: A12.:[exact=A12]*/
+/*member: A12.:[exact=A12|powerset=0]*/
 class A12 {
-  /*member: A12.x12:[empty]*/
+  /*member: A12.x12:[empty|powerset=0]*/
   x12(
-    /*Union([exact=JSString], [exact=JSUInt31])*/ p1,
-    /*Union([exact=JSString], [exact=JSUInt31])*/ p2,
+    /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ p1,
+    /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ p2,
   ) =>
-  /*invoke: [exact=A12]*/ x12(1, 2);
+  /*invoke: [exact=A12|powerset=0]*/ x12(1, 2);
 }
 
-/*member: test12:[null]*/
+/*member: test12:[null|powerset=1]*/
 test12() {
-  A12(). /*invoke: [exact=A12]*/ x12("x", "y");
+  A12(). /*invoke: [exact=A12|powerset=0]*/ x12("x", "y");
 }
 
-/*member: A13.:[exact=A13]*/
+/*member: A13.:[exact=A13|powerset=0]*/
 class A13 {
-  /*member: A13.x13:[exact=JSUInt31]*/
+  /*member: A13.x13:[exact=JSUInt31|powerset=0]*/
   x13(
-    /*Value([exact=JSString], value: "x")*/ p1, [
-    /*[exact=JSUInt31]*/ p2 = 1,
+    /*Value([exact=JSString|powerset=0], value: "x", powerset: 0)*/ p1, [
+    /*[exact=JSUInt31|powerset=0]*/ p2 = 1,
   ]) => 1;
 }
 
-/*member: test13:[null]*/
+/*member: test13:[null|powerset=1]*/
 test13() {
-  A13(). /*invoke: [exact=A13]*/ x13("x", 1);
-  A13(). /*invoke: [exact=A13]*/ x13("x");
+  A13(). /*invoke: [exact=A13|powerset=0]*/ x13("x", 1);
+  A13(). /*invoke: [exact=A13|powerset=0]*/ x13("x");
 }
 
-/*member: A14.:[exact=A14]*/
+/*member: A14.:[exact=A14|powerset=0]*/
 class A14 {
-  /*member: A14.x14:[exact=JSUInt31]*/
-  x14(/*Union([exact=JSNumNotInt], [exact=JSUInt31])*/ p) => 1;
+  /*member: A14.x14:[exact=JSUInt31|powerset=0]*/
+  x14(
+    /*Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ p,
+  ) => 1;
 }
 
-/*member: f14:[exact=JSUInt31]*/
-f14(/*[exact=A14]*/ p) => p. /*invoke: [exact=A14]*/ x14(2.2);
+/*member: f14:[exact=JSUInt31|powerset=0]*/
+f14(/*[exact=A14|powerset=0]*/ p) =>
+    p. /*invoke: [exact=A14|powerset=0]*/ x14(2.2);
 
-/*member: test14:[null]*/
+/*member: test14:[null|powerset=1]*/
 test14() {
-  A14(). /*invoke: [exact=A14]*/ x14(1);
+  A14(). /*invoke: [exact=A14|powerset=0]*/ x14(1);
   f14(new A14());
 }
 
-/*member: A15.:[exact=A15]*/
+/*member: A15.:[exact=A15|powerset=0]*/
 class A15 {
-  /*member: A15.x15:[exact=JSUInt31]*/
+  /*member: A15.x15:[exact=JSUInt31|powerset=0]*/
   x15(
-    /*[exact=JSUInt31]*/ p1, [
-    /*Value([exact=JSString], value: "s")*/ p2 = "s",
+    /*[exact=JSUInt31|powerset=0]*/ p1, [
+    /*Value([exact=JSString|powerset=0], value: "s", powerset: 0)*/ p2 = "s",
   ]) {
-    p2. /*Value([exact=JSString], value: "s")*/ length;
+    p2. /*Value([exact=JSString|powerset=0], value: "s", powerset: 0)*/ length;
     return 1;
   }
 }
 
-/*member: test15:[null]*/
+/*member: test15:[null|powerset=1]*/
 test15() {
-  A15(). /*invoke: [exact=A15]*/ x15(1);
+  A15(). /*invoke: [exact=A15|powerset=0]*/ x15(1);
 }
 
-/*member: A16.:[exact=A16]*/
+/*member: A16.:[exact=A16|powerset=0]*/
 class A16 {
-  /*member: A16.x16:[exact=JSUInt31]*/
+  /*member: A16.x16:[exact=JSUInt31|powerset=0]*/
   x16(
-    /*Value([exact=JSString], value: "x")*/ p1, [
-    /*[exact=JSBool]*/ p2 = true,
+    /*Value([exact=JSString|powerset=0], value: "x", powerset: 0)*/ p1, [
+    /*[exact=JSBool|powerset=0]*/ p2 = true,
   ]) => 1;
 }
 
-/*member: f16:[empty]*/
-f16(/*[null]*/ p) => p. /*invoke: [null]*/ a("x");
+/*member: f16:[empty|powerset=0]*/
+f16(/*[null|powerset=1]*/ p) => p. /*invoke: [null|powerset=1]*/ a("x");
 
-/*member: test16:[null]*/
+/*member: test16:[null|powerset=1]*/
 test16() {
-  A16(). /*invoke: [exact=A16]*/ x16("x");
-  A16(). /*invoke: [exact=A16]*/ x16("x", false);
+  A16(). /*invoke: [exact=A16|powerset=0]*/ x16("x");
+  A16(). /*invoke: [exact=A16|powerset=0]*/ x16("x", false);
   f16(null);
 }
 
-/*member: A17.:[exact=A17]*/
+/*member: A17.:[exact=A17|powerset=0]*/
 class A17 {
-  /*member: A17.x17:[exact=JSUInt31]*/
+  /*member: A17.x17:[exact=JSUInt31|powerset=0]*/
   x17(
-    /*[exact=JSUInt31]*/ p1, [
-    /*[exact=JSUInt31]*/ p2 = 1,
-    /*[exact=JSString]*/ p3 = "s",
+    /*[exact=JSUInt31|powerset=0]*/ p1, [
+    /*[exact=JSUInt31|powerset=0]*/ p2 = 1,
+    /*[exact=JSString|powerset=0]*/ p3 = "s",
   ]) => 1;
 }
 
-/*member: test17:[null]*/
+/*member: test17:[null|powerset=1]*/
 test17() {
-  A17(). /*invoke: [exact=A17]*/ x17(1);
-  A17(). /*invoke: [exact=A17]*/ x17(1, 2);
-  A17(). /*invoke: [exact=A17]*/ x17(1, 2, "x");
+  A17(). /*invoke: [exact=A17|powerset=0]*/ x17(1);
+  A17(). /*invoke: [exact=A17|powerset=0]*/ x17(1, 2);
+  A17(). /*invoke: [exact=A17|powerset=0]*/ x17(1, 2, "x");
   dynamic a = A17();
-  a. /*invoke: [exact=A17]*/ x17(1, p2: 2);
+  a. /*invoke: [exact=A17|powerset=0]*/ x17(1, p2: 2);
   dynamic b = A17();
-  b. /*invoke: [exact=A17]*/ x17(1, p3: "x");
+  b. /*invoke: [exact=A17|powerset=0]*/ x17(1, p3: "x");
   dynamic c = A17();
-  c. /*invoke: [exact=A17]*/ x17(1, p3: "x", p2: 2);
+  c. /*invoke: [exact=A17|powerset=0]*/ x17(1, p3: "x", p2: 2);
   dynamic d = A17();
-  d. /*invoke: [exact=A17]*/ x17(1, p2: 2, p3: "x");
+  d. /*invoke: [exact=A17|powerset=0]*/ x17(1, p2: 2, p3: "x");
 }
 
-/*member: A18.:[exact=A18]*/
+/*member: A18.:[exact=A18|powerset=0]*/
 class A18 {
-  /*member: A18.x18:[exact=JSUInt31]*/
+  /*member: A18.x18:[exact=JSUInt31|powerset=0]*/
   x18(
-    /*[exact=JSUInt31]*/ p1, [
-    /*[exact=JSBool]*/ p2 = 1,
-    /*[exact=JSNumNotInt]*/ p3 = "s",
+    /*[exact=JSUInt31|powerset=0]*/ p1, [
+    /*[exact=JSBool|powerset=0]*/ p2 = 1,
+    /*[exact=JSNumNotInt|powerset=0]*/ p3 = "s",
   ]) => 1;
 }
 
-/*member: test18:[null]*/
+/*member: test18:[null|powerset=1]*/
 test18() {
-  A18(). /*invoke: [exact=A18]*/ x18(1, true, 1.1);
-  A18(). /*invoke: [exact=A18]*/ x18(1, false, 2.2);
+  A18(). /*invoke: [exact=A18|powerset=0]*/ x18(1, true, 1.1);
+  A18(). /*invoke: [exact=A18|powerset=0]*/ x18(1, false, 2.2);
   dynamic a = A18();
-  a. /*invoke: [exact=A18]*/ x18(1, p3: 3.3, p2: true);
+  a. /*invoke: [exact=A18|powerset=0]*/ x18(1, p3: 3.3, p2: true);
   dynamic b = A18();
-  b. /*invoke: [exact=A18]*/ x18(1, p2: false, p3: 4.4);
+  b. /*invoke: [exact=A18|powerset=0]*/ x18(1, p2: false, p3: 4.4);
 }
 
-/*member: A19.:[exact=A19]*/
+/*member: A19.:[exact=A19|powerset=0]*/
 class A19 {
-  /*member: A19.x19:[empty]*/
+  /*member: A19.x19:[empty|powerset=0]*/
   x19(
-    /*Union([exact=JSString], [exact=JSUInt31])*/ p1,
-    /*Union([exact=JSString], [exact=JSUInt31])*/ p2,
+    /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ p1,
+    /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ p2,
   ) =>
-  /*invoke: [subclass=A19]*/ x19(p1, p2);
+  /*invoke: [subclass=A19|powerset=0]*/ x19(p1, p2);
 }
 
-/*member: B19.:[exact=B19]*/
+/*member: B19.:[exact=B19|powerset=0]*/
 class B19 extends A19 {}
 
-/*member: test19:[null]*/
+/*member: test19:[null|powerset=1]*/
 test19() {
-  B19(). /*invoke: [exact=B19]*/ x19("a", "b");
-  A19(). /*invoke: [exact=A19]*/ x19(1, 2);
+  B19(). /*invoke: [exact=B19|powerset=0]*/ x19("a", "b");
+  A19(). /*invoke: [exact=A19|powerset=0]*/ x19(1, 2);
 }
diff --git a/pkg/compiler/test/inference/data/catch.dart b/pkg/compiler/test/inference/data/catch.dart
index d87f53a..759b322 100644
--- a/pkg/compiler/test/inference/data/catch.dart
+++ b/pkg/compiler/test/inference/data/catch.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   catchUntyped();
   catchTyped();
@@ -13,7 +13,7 @@
 /// Untyped catch clause.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: catchUntyped:[subclass=Object]*/
+/*member: catchUntyped:[subclass=Object|powerset=0]*/
 catchUntyped() {
   dynamic local = 0;
   try {} catch (e) {
@@ -26,7 +26,7 @@
 /// Typed catch clause.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: catchTyped:Union([exact=JSString], [exact=JSUInt31])*/
+/*member: catchTyped:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 catchTyped() {
   dynamic local = 0;
   try {} on String catch (e) {
@@ -39,7 +39,7 @@
 /// Catch clause with stack trace.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: catchStackTrace:[null|subclass=Object]*/
+/*member: catchStackTrace:[null|subclass=Object|powerset=1]*/
 catchStackTrace() {
   dynamic local = 0;
   try {} catch (_, s) {
diff --git a/pkg/compiler/test/inference/data/closure.dart b/pkg/compiler/test/inference/data/closure.dart
index bc754a0..6d7337d 100644
--- a/pkg/compiler/test/inference/data/closure.dart
+++ b/pkg/compiler/test/inference/data/closure.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   returnInClosure();
   accessInClosure();
@@ -17,139 +17,139 @@
   postfixInClosure();
 }
 
-/*member: returnInClosure:[exact=JSUInt31]*/
+/*member: returnInClosure:[exact=JSUInt31|powerset=0]*/
 returnInClosure() {
-  /*[null|subclass=Object]*/
-  local(/*[subclass=Closure]*/ f) => f();
+  /*[null|subclass=Object|powerset=1]*/
+  local(/*[subclass=Closure|powerset=0]*/ f) => f();
 
   int lines = 0;
-  local(/*[exact=JSUInt31]*/ () {
+  local(/*[exact=JSUInt31|powerset=0]*/ () {
     return lines;
   });
   return lines;
 }
 
-/*member: accessInClosure:[exact=JSUInt31]*/
+/*member: accessInClosure:[exact=JSUInt31|powerset=0]*/
 accessInClosure() {
-  /*[null|subclass=Object]*/
-  local(/*[subclass=Closure]*/ f) => f();
+  /*[null|subclass=Object|powerset=1]*/
+  local(/*[subclass=Closure|powerset=0]*/ f) => f();
 
   int lines = 0;
-  local(/*[exact=JSBool]*/ () {
-    return lines. /*[exact=JSUInt31]*/ isEven;
+  local(/*[exact=JSBool|powerset=0]*/ () {
+    return lines. /*[exact=JSUInt31|powerset=0]*/ isEven;
   });
   return lines;
 }
 
-/*member: invokeInClosure:[exact=JSUInt31]*/
+/*member: invokeInClosure:[exact=JSUInt31|powerset=0]*/
 invokeInClosure() {
-  /*[null|subclass=Object]*/
-  local(/*[subclass=Closure]*/ f) => f();
+  /*[null|subclass=Object|powerset=1]*/
+  local(/*[subclass=Closure|powerset=0]*/ f) => f();
 
   int lines = 0;
-  local(/*[subclass=JSNumber]*/ () {
-    return lines. /*invoke: [exact=JSUInt31]*/ ceilToDouble();
+  local(/*[subclass=JSNumber|powerset=0]*/ () {
+    return lines. /*invoke: [exact=JSUInt31|powerset=0]*/ ceilToDouble();
   });
   return lines;
 }
 
-/*member: operatorInClosure:[exact=JSUInt31]*/
+/*member: operatorInClosure:[exact=JSUInt31|powerset=0]*/
 operatorInClosure() {
-  /*[null|subclass=Object]*/
-  local(/*[subclass=Closure]*/ f) => f();
+  /*[null|subclass=Object|powerset=1]*/
+  local(/*[subclass=Closure|powerset=0]*/ f) => f();
 
   int lines = 0;
-  local(/*[subclass=JSInt]*/ () {
-    return lines /*invoke: [exact=JSUInt31]*/ - 42;
+  local(/*[subclass=JSInt|powerset=0]*/ () {
+    return lines /*invoke: [exact=JSUInt31|powerset=0]*/ - 42;
   });
   return lines;
 }
 
-/*member: assignInClosure:[subclass=JSInt]*/
+/*member: assignInClosure:[subclass=JSInt|powerset=0]*/
 assignInClosure() {
-  /*[null|subclass=Object]*/
-  local(/*[subclass=Closure]*/ f) => f();
+  /*[null|subclass=Object|powerset=1]*/
+  local(/*[subclass=Closure|powerset=0]*/ f) => f();
 
   int lines = 0;
-  local(/*[null]*/ () {
+  local(/*[null|powerset=1]*/ () {
     lines = -42;
   });
   return lines;
 }
 
-/*member: assignInTwoClosures:[subclass=JSInt]*/
+/*member: assignInTwoClosures:[subclass=JSInt|powerset=0]*/
 assignInTwoClosures() {
-  /*[null|subclass=Object]*/
-  local(/*[subclass=Closure]*/ f) => f();
+  /*[null|subclass=Object|powerset=1]*/
+  local(/*[subclass=Closure|powerset=0]*/ f) => f();
 
   int lines = 0;
-  local(/*[null]*/ () {
+  local(/*[null|powerset=1]*/ () {
     lines = -42;
   });
-  local(/*[null]*/ () {
+  local(/*[null|powerset=1]*/ () {
     lines = -87;
   });
   return lines;
 }
 
-/*member: accessAssignInClosure:[subclass=JSInt]*/
+/*member: accessAssignInClosure:[subclass=JSInt|powerset=0]*/
 accessAssignInClosure() {
-  /*[null|subclass=Object]*/
-  local(/*[subclass=Closure]*/ f) => f();
+  /*[null|subclass=Object|powerset=1]*/
+  local(/*[subclass=Closure|powerset=0]*/ f) => f();
 
   int lines = 0;
-  local(/*[null]*/ () {
-    lines = lines /*invoke: [subclass=JSInt]*/ - 42;
+  local(/*[null|powerset=1]*/ () {
+    lines = lines /*invoke: [subclass=JSInt|powerset=0]*/ - 42;
   });
   return lines;
 }
 
-/*member: accessBeforeAssignInClosure:[exact=JSUInt31]*/
+/*member: accessBeforeAssignInClosure:[exact=JSUInt31|powerset=0]*/
 accessBeforeAssignInClosure() {
-  /*[null|subclass=Object]*/
-  local(/*[subclass=Closure]*/ f) => f();
+  /*[null|subclass=Object|powerset=1]*/
+  local(/*[subclass=Closure|powerset=0]*/ f) => f();
 
   int lines = 0;
-  local(/*[null]*/ () {
-    lines /*invoke: [exact=JSUInt31]*/ - 42;
+  local(/*[null|powerset=1]*/ () {
+    lines /*invoke: [exact=JSUInt31|powerset=0]*/ - 42;
     lines = 42;
   });
   return lines;
 }
 
-/*member: accessAfterAssignInClosure:[exact=JSUInt31]*/
+/*member: accessAfterAssignInClosure:[exact=JSUInt31|powerset=0]*/
 accessAfterAssignInClosure() {
-  /*[null|subclass=Object]*/
-  local(/*[subclass=Closure]*/ f) => f();
+  /*[null|subclass=Object|powerset=1]*/
+  local(/*[subclass=Closure|powerset=0]*/ f) => f();
 
   int lines = 0;
-  local(/*[subclass=JSInt]*/ () {
+  local(/*[subclass=JSInt|powerset=0]*/ () {
     lines = 42;
-    return lines /*invoke: [exact=JSUInt31]*/ - 42;
+    return lines /*invoke: [exact=JSUInt31|powerset=0]*/ - 42;
   });
   return lines;
 }
 
-/*member: compoundInClosure:[subclass=JSInt]*/
+/*member: compoundInClosure:[subclass=JSInt|powerset=0]*/
 compoundInClosure() {
-  /*[null|subclass=Object]*/
-  local(/*[subclass=Closure]*/ f) => f();
+  /*[null|subclass=Object|powerset=1]*/
+  local(/*[subclass=Closure|powerset=0]*/ f) => f();
 
   int lines = 0;
-  local(/*[null]*/ () {
-    lines /*invoke: [subclass=JSInt]*/ -= 42;
+  local(/*[null|powerset=1]*/ () {
+    lines /*invoke: [subclass=JSInt|powerset=0]*/ -= 42;
   });
   return lines;
 }
 
-/*member: postfixInClosure:[subclass=JSPositiveInt]*/
+/*member: postfixInClosure:[subclass=JSPositiveInt|powerset=0]*/
 postfixInClosure() {
-  /*[null|subclass=Object]*/
-  local(/*[subclass=Closure]*/ f) => f();
+  /*[null|subclass=Object|powerset=1]*/
+  local(/*[subclass=Closure|powerset=0]*/ f) => f();
 
   int lines = 0;
-  local(/*[null]*/ () {
-    lines /*invoke: [subclass=JSPositiveInt]*/ ++;
+  local(/*[null|powerset=1]*/ () {
+    lines /*invoke: [subclass=JSPositiveInt|powerset=0]*/ ++;
   });
   return lines;
 }
diff --git a/pkg/compiler/test/inference/data/closure2.dart b/pkg/compiler/test/inference/data/closure2.dart
index 37ff4dd..9dc3efc 100644
--- a/pkg/compiler/test/inference/data/closure2.dart
+++ b/pkg/compiler/test/inference/data/closure2.dart
@@ -2,78 +2,79 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: returnInt1:[exact=JSUInt31]*/
+/*member: returnInt1:[exact=JSUInt31|powerset=0]*/
 returnInt1() {
   var a = 42;
   // ignore: unused_local_variable
-  var f = /*[exact=JSUInt31]*/ () {
+  var f = /*[exact=JSUInt31|powerset=0]*/ () {
     return a;
   };
   return a;
 }
 
-/*member: returnDyn1:Union([exact=JSUInt31], [exact=JsLinkedHashMap])*/
+/*member: returnDyn1:Union([exact=JSUInt31|powerset=0], [exact=JsLinkedHashMap|powerset=0], powerset: 0)*/
 returnDyn1() {
   dynamic a = 42;
   // ignore: unused_local_variable
-  var f = /*[null]*/ () {
+  var f = /*[null|powerset=1]*/ () {
     a = {};
   };
   return a;
 }
 
-/*member: returnInt2:[exact=JSUInt31]*/
+/*member: returnInt2:[exact=JSUInt31|powerset=0]*/
 returnInt2() {
   var a = 42;
   // ignore: unused_local_variable
-  var f = /*[null]*/ () {
+  var f = /*[null|powerset=1]*/ () {
     a = 54;
   };
   return a;
 }
 
-/*member: returnDyn2:Union([exact=JSUInt31], [exact=JsLinkedHashMap])*/
+/*member: returnDyn2:Union([exact=JSUInt31|powerset=0], [exact=JsLinkedHashMap|powerset=0], powerset: 0)*/
 returnDyn2() {
   dynamic a = 42;
   // ignore: unused_local_variable
-  var f = /*[null]*/ () {
+  var f = /*[null|powerset=1]*/ () {
     a = 54;
   };
   // ignore: unused_local_variable
-  var g = /*[null]*/ () {
+  var g = /*[null|powerset=1]*/ () {
     a = {};
   };
   return a;
 }
 
-/*member: returnInt3:[exact=JSUInt31]*/
+/*member: returnInt3:[exact=JSUInt31|powerset=0]*/
 returnInt3() {
   var a = 42;
-  if (a /*invoke: [exact=JSUInt31]*/ == 53) {
+  if (a /*invoke: [exact=JSUInt31|powerset=0]*/ == 53) {
     // ignore: unused_local_variable
-    var f = /*[exact=JSUInt31]*/ () {
+    var f = /*[exact=JSUInt31|powerset=0]*/ () {
       return a;
     };
   }
   return a;
 }
 
-/*member: returnDyn3:Union([exact=JSUInt31], [exact=JsLinkedHashMap])*/
+/*member: returnDyn3:Union([exact=JSUInt31|powerset=0], [exact=JsLinkedHashMap|powerset=0], powerset: 0)*/
 returnDyn3() {
   dynamic a = 42;
-  if (a /*invoke: Union([exact=JSUInt31], [exact=JsLinkedHashMap])*/ == 53) {
+  if (a /*invoke: Union([exact=JSUInt31|powerset=0], [exact=JsLinkedHashMap|powerset=0], powerset: 0)*/ ==
+      53) {
     // ignore: unused_local_variable
-    var f = /*[null]*/ () {
+    var f = /*[null|powerset=1]*/ () {
       a = {};
     };
   }
   return a;
 }
 
-/*member: returnInt4:[exact=JSUInt31]*/
+/*member: returnInt4:[exact=JSUInt31|powerset=0]*/
 returnInt4() {
   var a = 42;
-  /*[exact=JSUInt31]*/
+  /*[exact=JSUInt31|powerset=0]*/
   g() {
     return a;
   }
@@ -81,11 +82,11 @@
   return g();
 }
 
-/*member: returnNum1:Union([exact=JSNumNotInt], [exact=JSUInt31])*/
+/*member: returnNum1:Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 returnNum1() {
   dynamic a = 42.5;
   try {
-    /*[exact=JSUInt31]*/
+    /*[exact=JSUInt31|powerset=0]*/
     g() {
       dynamic b = {};
       b = 42;
@@ -97,16 +98,16 @@
   return a;
 }
 
-/*member: returnIntOrNull:[null|exact=JSUInt31]*/
+/*member: returnIntOrNull:[null|exact=JSUInt31|powerset=1]*/
 returnIntOrNull() {
-  /*iterator: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
-  /*current: [exact=ArrayIterator]*/
-  /*moveNext: [exact=ArrayIterator]*/
+  /*iterator: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
+  /*current: [exact=ArrayIterator|powerset=0]*/
+  /*moveNext: [exact=ArrayIterator|powerset=0]*/
   for (
   // ignore: unused_local_variable
   var b in [42]) {
     int? bar = 42;
-    /*[null|exact=JSUInt31]*/
+    /*[null|exact=JSUInt31|powerset=1]*/
     f() => bar;
     bar = null;
     return f();
@@ -114,17 +115,17 @@
   return 42;
 }
 
-/*member: A.:[exact=A]*/
+/*member: A.:[exact=A|powerset=0]*/
 class A {
-  /*member: A.foo:[exact=A]*/
+  /*member: A.foo:[exact=A|powerset=0]*/
   foo() {
-    /*[exact=A]*/
+    /*[exact=A|powerset=0]*/
     f() => this;
     return f();
   }
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   returnInt1();
   returnDyn1();
@@ -135,5 +136,5 @@
   returnInt4();
   returnNum1();
   returnIntOrNull();
-  A(). /*invoke: [exact=A]*/ foo();
+  A(). /*invoke: [exact=A|powerset=0]*/ foo();
 }
diff --git a/pkg/compiler/test/inference/data/closure_tracer.dart b/pkg/compiler/test/inference/data/closure_tracer.dart
index 0fab03e..0b23d5a 100644
--- a/pkg/compiler/test/inference/data/closure_tracer.dart
+++ b/pkg/compiler/test/inference/data/closure_tracer.dart
@@ -2,182 +2,185 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: testFunctionStatement:[null|exact=JSUInt31]*/
+/*member: testFunctionStatement:[null|exact=JSUInt31|powerset=1]*/
 testFunctionStatement() {
   var res;
-  /*[exact=JSUInt31]*/
-  closure(/*[exact=JSUInt31]*/ a) => res = a;
+  /*[exact=JSUInt31|powerset=0]*/
+  closure(/*[exact=JSUInt31|powerset=0]*/ a) => res = a;
   closure(42);
   return res;
 }
 
-/*member: testFunctionExpression:[null|exact=JSUInt31]*/
+/*member: testFunctionExpression:[null|exact=JSUInt31|powerset=1]*/
 testFunctionExpression() {
   var res;
-  var closure = /*[exact=JSUInt31]*/ (/*[exact=JSUInt31]*/ a) => res = a;
+  var closure = /*[exact=JSUInt31|powerset=0]*/
+      (/*[exact=JSUInt31|powerset=0]*/ a) => res = a;
   closure(42);
   return res;
 }
 
-/*member: staticField:[null|subclass=Closure]*/
+/*member: staticField:[null|subclass=Closure|powerset=1]*/
 var staticField;
 
-/*member: testStoredInStatic:[null|exact=JSUInt31]*/
+/*member: testStoredInStatic:[null|exact=JSUInt31|powerset=1]*/
 testStoredInStatic() {
   var res;
-  /*[exact=JSUInt31]*/
-  closure(/*[exact=JSUInt31]*/ a) => res = a;
+  /*[exact=JSUInt31|powerset=0]*/
+  closure(/*[exact=JSUInt31|powerset=0]*/ a) => res = a;
   staticField = closure;
   staticField(42);
   return res;
 }
 
 class A {
-  /*member: A.field:[subclass=Closure]*/
+  /*member: A.field:[subclass=Closure|powerset=0]*/
   var field;
-  /*member: A.:[exact=A]*/
-  A(this. /*[subclass=Closure]*/ field);
+  /*member: A.:[exact=A|powerset=0]*/
+  A(this. /*[subclass=Closure|powerset=0]*/ field);
 
-  /*member: A.foo:[exact=JSUInt31]*/
-  static foo(/*[exact=JSUInt31]*/ a) => topLevel3 = a;
+  /*member: A.foo:[exact=JSUInt31|powerset=0]*/
+  static foo(/*[exact=JSUInt31|powerset=0]*/ a) => topLevel3 = a;
 }
 
-/*member: testStoredInInstance:[null|exact=JSUInt31]*/
+/*member: testStoredInInstance:[null|exact=JSUInt31|powerset=1]*/
 testStoredInInstance() {
   var res;
-  /*[exact=JSUInt31]*/
-  closure(/*[exact=JSUInt31]*/ a) => res = a;
+  /*[exact=JSUInt31|powerset=0]*/
+  closure(/*[exact=JSUInt31|powerset=0]*/ a) => res = a;
   var a = A(closure);
-  a.field /*invoke: [exact=A]*/ (42);
+  a.field /*invoke: [exact=A|powerset=0]*/ (42);
   return res;
 }
 
-/*member: testStoredInMapOfList:[null|exact=JSUInt31]*/
+/*member: testStoredInMapOfList:[null|exact=JSUInt31|powerset=1]*/
 testStoredInMapOfList() {
   var res;
-  /*[exact=JSUInt31]*/
-  closure(/*[exact=JSUInt31]*/ a) => res = a;
+  /*[exact=JSUInt31|powerset=0]*/
+  closure(/*[exact=JSUInt31|powerset=0]*/ a) => res = a;
   dynamic a = <dynamic>[closure];
   dynamic b = <dynamic, dynamic>{'foo': 1};
 
   b
-      /*update: Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSUInt31]), map: {foo: [exact=JSUInt31], bar: Container([null|exact=JSExtendableArray], element: [subclass=Closure], length: 1)})*/
+      /*update: Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {foo: [exact=JSUInt31|powerset=0], bar: Container([null|exact=JSExtendableArray|powerset=1], element: [subclass=Closure|powerset=0], length: 1, powerset: 1)}, powerset: 0)*/
       ['bar'] =
       a;
 
   b
-  /*Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSUInt31]), map: {foo: [exact=JSUInt31], bar: Container([null|exact=JSExtendableArray], element: [subclass=Closure], length: 1)})*/
+  /*Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {foo: [exact=JSUInt31|powerset=0], bar: Container([null|exact=JSExtendableArray|powerset=1], element: [subclass=Closure|powerset=0], length: 1, powerset: 1)}, powerset: 0)*/
   ['bar']
-  /*Container([null|exact=JSExtendableArray], element: [subclass=Closure], length: 1)*/
+  /*Container([null|exact=JSExtendableArray|powerset=1], element: [subclass=Closure|powerset=0], length: 1, powerset: 1)*/
   [0](42);
   return res;
 }
 
-/*member: testStoredInListOfList:[null|exact=JSUInt31]*/
+/*member: testStoredInListOfList:[null|exact=JSUInt31|powerset=1]*/
 testStoredInListOfList() {
   var res;
-  /*[exact=JSUInt31]*/
-  closure(/*[exact=JSUInt31]*/ a) => res = a;
+  /*[exact=JSUInt31|powerset=0]*/
+  closure(/*[exact=JSUInt31|powerset=0]*/ a) => res = a;
   dynamic a = <dynamic>[closure];
   dynamic b = <dynamic>[0, 1, 2];
 
   b
-      /*update: Container([exact=JSExtendableArray], element: Union([exact=JSExtendableArray], [exact=JSUInt31]), length: 3)*/
+      /*update: Container([exact=JSExtendableArray|powerset=0], element: Union([exact=JSExtendableArray|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0), length: 3, powerset: 0)*/
       [1] =
       a;
 
   b
-  /*Container([exact=JSExtendableArray], element: Union([exact=JSExtendableArray], [exact=JSUInt31]), length: 3)*/
+  /*Container([exact=JSExtendableArray|powerset=0], element: Union([exact=JSExtendableArray|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0), length: 3, powerset: 0)*/
   [1]
-  /*Union([exact=JSExtendableArray], [exact=JSUInt31])*/
+  /*Union([exact=JSExtendableArray|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
   [0](42);
   return res;
 }
 
-/*member: testStoredInListOfListUsingInsert:[null|exact=JSUInt31]*/
+/*member: testStoredInListOfListUsingInsert:[null|exact=JSUInt31|powerset=1]*/
 testStoredInListOfListUsingInsert() {
   var res;
-  /*[exact=JSUInt31]*/
-  closure(/*[exact=JSUInt31]*/ a) => res = a;
+  /*[exact=JSUInt31|powerset=0]*/
+  closure(/*[exact=JSUInt31|powerset=0]*/ a) => res = a;
   dynamic a = <dynamic>[closure];
   dynamic b = <dynamic>[0, 1, 2];
 
   b.
-  /*invoke: Container([exact=JSExtendableArray], element: Union([exact=JSExtendableArray], [exact=JSUInt31]), length: null)*/
+  /*invoke: Container([exact=JSExtendableArray|powerset=0], element: Union([exact=JSExtendableArray|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0), length: null, powerset: 0)*/
   insert(1, a);
 
-  b /*Container([exact=JSExtendableArray], element: Union([exact=JSExtendableArray], [exact=JSUInt31]), length: null)*/ [1]
-  /*Union([exact=JSExtendableArray], [exact=JSUInt31])*/
+  b /*Container([exact=JSExtendableArray|powerset=0], element: Union([exact=JSExtendableArray|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0), length: null, powerset: 0)*/ [1]
+  /*Union([exact=JSExtendableArray|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
   [0](42);
   return res;
 }
 
-/*member: testStoredInListOfListUsingAdd:[null|exact=JSUInt31]*/
+/*member: testStoredInListOfListUsingAdd:[null|exact=JSUInt31|powerset=1]*/
 testStoredInListOfListUsingAdd() {
   var res;
-  /*[exact=JSUInt31]*/
-  closure(/*[exact=JSUInt31]*/ a) => res = a;
+  /*[exact=JSUInt31|powerset=0]*/
+  closure(/*[exact=JSUInt31|powerset=0]*/ a) => res = a;
   dynamic a = <dynamic>[closure];
   dynamic b = <dynamic>[0, 1, 2];
 
   b.
-  /*invoke: Container([exact=JSExtendableArray], element: Union([exact=JSExtendableArray], [exact=JSUInt31]), length: null)*/
+  /*invoke: Container([exact=JSExtendableArray|powerset=0], element: Union([exact=JSExtendableArray|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0), length: null, powerset: 0)*/
   add(a);
 
   b
-  /*Container([exact=JSExtendableArray], element: Union([exact=JSExtendableArray], [exact=JSUInt31]), length: null)*/
+  /*Container([exact=JSExtendableArray|powerset=0], element: Union([exact=JSExtendableArray|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0), length: null, powerset: 0)*/
   [3]
-  /*Union([exact=JSExtendableArray], [exact=JSUInt31])*/
+  /*Union([exact=JSExtendableArray|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
   [0](42);
   return res;
 }
 
-/*member: testStoredInRecord:[null|exact=JSUInt31]*/
+/*member: testStoredInRecord:[null|exact=JSUInt31|powerset=1]*/
 testStoredInRecord() {
   var res;
-  /*[exact=JSUInt31]*/
-  closure(/*[exact=JSUInt31]*/ a) => res = a;
+  /*[exact=JSUInt31|powerset=0]*/
+  closure(/*[exact=JSUInt31|powerset=0]*/ a) => res = a;
   final a = (3, closure);
 
-  a. /*[Record(RecordShape(2), [[exact=JSUInt31], [subclass=Closure]])]*/ $2(
+  a. /*[Record(RecordShape(2), [[exact=JSUInt31|powerset=0], [subclass=Closure|powerset=0]], powerset: 0)]*/ $2(
     42,
   );
   return res;
 }
 
-/*member: foo:[null]*/
-foo(/*[subclass=Closure]*/ closure) {
+/*member: foo:[null|powerset=1]*/
+foo(/*[subclass=Closure|powerset=0]*/ closure) {
   closure(42);
 }
 
-/*member: testPassedInParameter:[null|exact=JSUInt31]*/
+/*member: testPassedInParameter:[null|exact=JSUInt31|powerset=1]*/
 testPassedInParameter() {
   var res;
-  /*[exact=JSUInt31]*/
-  closure(/*[exact=JSUInt31]*/ a) => res = a;
+  /*[exact=JSUInt31|powerset=0]*/
+  closure(/*[exact=JSUInt31|powerset=0]*/ a) => res = a;
   foo(closure);
   return res;
 }
 
-/*member: topLevel1:[null|exact=JSUInt31]*/
+/*member: topLevel1:[null|exact=JSUInt31|powerset=1]*/
 var topLevel1;
-/*member: foo2:[exact=JSUInt31]*/
-foo2(/*[exact=JSUInt31]*/ a) => topLevel1 = a;
+/*member: foo2:[exact=JSUInt31|powerset=0]*/
+foo2(/*[exact=JSUInt31|powerset=0]*/ a) => topLevel1 = a;
 
-/*member: testStaticClosure1:[null|exact=JSUInt31]*/
+/*member: testStaticClosure1:[null|exact=JSUInt31|powerset=1]*/
 testStaticClosure1() {
   var a = foo2;
   a(42);
   return topLevel1;
 }
 
-/*member: topLevel2:Union(null, [exact=JSNumNotInt], [exact=JSUInt31])*/
+/*member: topLevel2:Union(null, [exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
 var topLevel2;
 
-/*member: bar:Union([exact=JSNumNotInt], [exact=JSUInt31])*/
-bar(/*Union([exact=JSNumNotInt], [exact=JSUInt31])*/ a) => topLevel2 = a;
+/*member: bar:Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+bar(
+  /*Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ a,
+) => topLevel2 = a;
 
-/*member: testStaticClosure2:Union(null, [exact=JSNumNotInt], [exact=JSUInt31])*/
+/*member: testStaticClosure2:Union(null, [exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
 testStaticClosure2() {
   var a = bar;
   a(42);
@@ -186,24 +189,25 @@
   return topLevel2;
 }
 
-/*member: topLevel3:[null|exact=JSUInt31]*/
+/*member: topLevel3:[null|exact=JSUInt31|powerset=1]*/
 var topLevel3;
 
-/*member: testStaticClosure3:[null|exact=JSUInt31]*/
+/*member: testStaticClosure3:[null|exact=JSUInt31|powerset=1]*/
 testStaticClosure3() {
   var a = A.foo;
   a(42);
   return topLevel3;
 }
 
-/*member: topLevel4:Union(null, [exact=JSNumNotInt], [exact=JSUInt31])*/
+/*member: topLevel4:Union(null, [exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
 var topLevel4;
 
-/*member: testStaticClosure4Helper:Union([exact=JSNumNotInt], [exact=JSUInt31])*/
-testStaticClosure4Helper(/*Union([exact=JSNumNotInt], [exact=JSUInt31])*/ a) =>
-    topLevel4 = a;
+/*member: testStaticClosure4Helper:Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+testStaticClosure4Helper(
+  /*Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ a,
+) => topLevel4 = a;
 
-/*member: testStaticClosure4:Union(null, [exact=JSNumNotInt], [exact=JSUInt31])*/
+/*member: testStaticClosure4:Union(null, [exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
 testStaticClosure4() {
   var a = testStaticClosure4Helper;
   // Test calling the static after tearing it off.
@@ -212,75 +216,96 @@
   return topLevel4;
 }
 
-/*member: bar1:[subclass=Closure]*/
+/*member: bar1:[subclass=Closure|powerset=0]*/
 int Function(int, [int]) bar1(
-  int /*[exact=JSUInt31]*/ a,
-) => /*[subclass=JSInt]*/
+  int /*[exact=JSUInt31|powerset=0]*/ a,
+) => /*[subclass=JSInt|powerset=0]*/
     (
-      int /*spec.[null|subclass=Object]*/ /*prod.[subclass=JSInt]*/ b, [
-      int /*spec.[null|subclass=Object]*/ /*prod.[subclass=JSInt]*/ c = 17,
-    ]) => a /*invoke: [exact=JSUInt31]*/ + b /*invoke: [subclass=JSInt]*/ + c;
-/*member: bar2:[subclass=Closure]*/
-int Function(int, [int]) bar2(
-  int /*[exact=JSUInt31]*/ a,
-) => /*[subclass=JSInt]*/
-    (
-      int /*spec.[null|subclass=Object]*/ /*prod.[subclass=JSInt]*/ b, [
-      int /*spec.[null|subclass=Object]*/ /*prod.[subclass=JSInt]*/ c = 17,
-    ]) => a /*invoke: [exact=JSUInt31]*/ + b /*invoke: [subclass=JSInt]*/ + c;
-/*member: bar3:[subclass=Closure]*/
-int Function(int, [int]) bar3(
-  int /*[exact=JSUInt31]*/ a,
-) => /*[subclass=JSPositiveInt]*/
-    (int /*[exact=JSUInt31]*/ b, [int /*[exact=JSUInt31]*/ c = 17]) =>
-        a /*invoke: [exact=JSUInt31]*/ + b /*invoke: [subclass=JSUInt32]*/ + c;
-/*member: bar4:[subclass=Closure]*/
-num Function(int, [int]) bar4(
-  int /*[exact=JSUInt31]*/ a,
-) => /*[subclass=JSNumber]*/
-    (
-      int /*spec.[null|subclass=Object]*/ /*prod.[subclass=JSInt]*/ b, [
-      dynamic /*[null|su
-    bclass=Object]*/
-      c,
-    ]) => a /*invoke: [exact=JSUInt31]*/ + b /*invoke: [subclass=JSInt]*/ + c;
-/*member: bar5:[subclass=Closure]*/
-num Function(int, [int]) bar5(
-  int /*[exact=JSUInt31]*/ a,
-) => /*[subclass=JSNumber]*/
-    (
-      int /*spec.[null|subclass=Object]*/ /*prod.[subclass=JSInt]*/ b, [
-      num? /*spec.[null|subclass=Object]*/ /*prod.[null|subclass=JSNumber]*/ c,
+      int /*spec.[null|subclass=Object|powerset=1]*/ /*prod.[subclass=JSInt|powerset=0]*/
+      b, [
+      int /*spec.[null|subclass=Object|powerset=1]*/ /*prod.[subclass=JSInt|powerset=0]*/
+          c =
+          17,
     ]) =>
-        a /*invoke: [exact=JSUInt31]*/ +
-        b /*invoke: [subclass=JSInt]*/ +
+        a /*invoke: [exact=JSUInt31|powerset=0]*/ +
+        b /*invoke: [subclass=JSInt|powerset=0]*/ +
+        c;
+/*member: bar2:[subclass=Closure|powerset=0]*/
+int Function(int, [int]) bar2(
+  int /*[exact=JSUInt31|powerset=0]*/ a,
+) => /*[subclass=JSInt|powerset=0]*/
+    (
+      int /*spec.[null|subclass=Object|powerset=1]*/ /*prod.[subclass=JSInt|powerset=0]*/
+      b, [
+      int /*spec.[null|subclass=Object|powerset=1]*/ /*prod.[subclass=JSInt|powerset=0]*/
+          c =
+          17,
+    ]) =>
+        a /*invoke: [exact=JSUInt31|powerset=0]*/ +
+        b /*invoke: [subclass=JSInt|powerset=0]*/ +
+        c;
+/*member: bar3:[subclass=Closure|powerset=0]*/
+int Function(int, [int]) bar3(
+  int /*[exact=JSUInt31|powerset=0]*/ a,
+) => /*[subclass=JSPositiveInt|powerset=0]*/
+    (
+      int /*[exact=JSUInt31|powerset=0]*/ b, [
+      int /*[exact=JSUInt31|powerset=0]*/ c = 17,
+    ]) =>
+        a /*invoke: [exact=JSUInt31|powerset=0]*/ +
+        b /*invoke: [subclass=JSUInt32|powerset=0]*/ +
+        c;
+/*member: bar4:[subclass=Closure|powerset=0]*/
+num Function(int, [int]) bar4(
+  int /*[exact=JSUInt31|powerset=0]*/ a,
+) => /*[subclass=JSNumber|powerset=0]*/
+    (
+      int /*spec.[null|subclass=Object|powerset=1]*/ /*prod.[subclass=JSInt|powerset=0]*/
+      b, [
+      dynamic /*[null|subclass=Object|powerset=1]*/ c,
+    ]) =>
+        a /*invoke: [exact=JSUInt31|powerset=0]*/ +
+        b /*invoke: [subclass=JSInt|powerset=0]*/ +
+        c;
+/*member: bar5:[subclass=Closure|powerset=0]*/
+num Function(int, [int]) bar5(
+  int /*[exact=JSUInt31|powerset=0]*/ a,
+) => /*[subclass=JSNumber|powerset=0]*/
+    (
+      int /*spec.[null|subclass=Object|powerset=1]*/ /*prod.[subclass=JSInt|powerset=0]*/
+      b, [
+      num? /*spec.[null|subclass=Object|powerset=1]*/ /*prod.[null|subclass=JSNumber|powerset=1]*/
+      c,
+    ]) =>
+        a /*invoke: [exact=JSUInt31|powerset=0]*/ +
+        b /*invoke: [subclass=JSInt|powerset=0]*/ +
         (c ?? 0);
 
-/*member: testFunctionApply:[null|subclass=Object]*/
+/*member: testFunctionApply:[null|subclass=Object|powerset=1]*/
 testFunctionApply() {
   return Function.apply(bar1(10), [20]);
 }
 
-/*member: testFunctionApplyNoDefault:[null|subclass=Object]*/
+/*member: testFunctionApplyNoDefault:[null|subclass=Object|powerset=1]*/
 testFunctionApplyNoDefault() {
   Function.apply(bar4(10), [30]);
   return Function.apply(bar5(10), [30]);
 }
 
-/*member: testRecordFunctionApply:[null|subclass=Object]*/
+/*member: testRecordFunctionApply:[null|subclass=Object|powerset=1]*/
 testRecordFunctionApply() {
   final rec = (bar2(10), bar3(10));
-  (rec. /*[Record(RecordShape(2), [[subclass=Closure], [subclass=Closure]])]*/ $2)(
+  (rec. /*[Record(RecordShape(2), [[subclass=Closure|powerset=0], [subclass=Closure|powerset=0]], powerset: 0)]*/ $2)(
     2,
     3,
   );
   return Function.apply(
-    rec. /*[Record(RecordShape(2), [[subclass=Closure], [subclass=Closure]])]*/ $1,
+    rec. /*[Record(RecordShape(2), [[subclass=Closure|powerset=0], [subclass=Closure|powerset=0]], powerset: 0)]*/ $1,
     [20],
   );
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   testFunctionStatement();
   testFunctionExpression();
diff --git a/pkg/compiler/test/inference/data/closure_tracer_28919.dart b/pkg/compiler/test/inference/data/closure_tracer_28919.dart
index 766af9a..c37ea16 100644
--- a/pkg/compiler/test/inference/data/closure_tracer_28919.dart
+++ b/pkg/compiler/test/inference/data/closure_tracer_28919.dart
@@ -4,24 +4,24 @@
 
 // Regression test for issue 28919.
 
-/*member: foo1:[null]*/
+/*member: foo1:[null|powerset=1]*/
 foo1() {
   final methods = [];
   var res, sum;
   for (
     int i = 0;
-    i /*invoke: [subclass=JSPositiveInt]*/ != 3;
-    i /*invoke: [subclass=JSPositiveInt]*/ ++
+    i /*invoke: [subclass=JSPositiveInt|powerset=0]*/ != 3;
+    i /*invoke: [subclass=JSPositiveInt|powerset=0]*/ ++
   ) {
     methods
-        . /*invoke: Container([exact=JSExtendableArray], element: [subclass=Closure], length: null)*/ add(
-          /*[null]*/ (int /*[exact=JSUInt31]*/ x) {
+        . /*invoke: Container([exact=JSExtendableArray|powerset=0], element: [subclass=Closure|powerset=0], length: null, powerset: 0)*/ add(
+          /*[null|powerset=1]*/ (int /*[exact=JSUInt31|powerset=0]*/ x) {
             res = x;
-            sum = x /*invoke: [exact=JSUInt31]*/ + i;
+            sum = x /*invoke: [exact=JSUInt31|powerset=0]*/ + i;
           },
         );
   }
-  methods /*Container([exact=JSExtendableArray], element: [subclass=Closure], length: null)*/ [0](
+  methods /*Container([exact=JSExtendableArray|powerset=0], element: [subclass=Closure|powerset=0], length: null, powerset: 0)*/ [0](
     499,
   );
   probe1res(res);
@@ -29,61 +29,63 @@
   probe1methods(methods);
 }
 
-/*member: probe1res:[null|exact=JSUInt31]*/
-probe1res(/*[null|exact=JSUInt31]*/ x) => x;
+/*member: probe1res:[null|exact=JSUInt31|powerset=1]*/
+probe1res(/*[null|exact=JSUInt31|powerset=1]*/ x) => x;
 
-/*member: probe1sum:[null|subclass=JSPositiveInt]*/
-probe1sum(/*[null|subclass=JSPositiveInt]*/ x) => x;
+/*member: probe1sum:[null|subclass=JSPositiveInt|powerset=1]*/
+probe1sum(/*[null|subclass=JSPositiveInt|powerset=1]*/ x) => x;
 
-/*member: probe1methods:Container([exact=JSExtendableArray], element: [subclass=Closure], length: null)*/
+/*member: probe1methods:Container([exact=JSExtendableArray|powerset=0], element: [subclass=Closure|powerset=0], length: null, powerset: 0)*/
 probe1methods(
-  /*Container([exact=JSExtendableArray], element: [subclass=Closure], length: null)*/ x,
+  /*Container([exact=JSExtendableArray|powerset=0], element: [subclass=Closure|powerset=0], length: null, powerset: 0)*/ x,
 ) => x;
 
-/*member: nonContainer:[exact=JSExtendableArray]*/
-nonContainer(/*[exact=JSUInt31]*/ choice) {
-  var m = choice /*invoke: [exact=JSUInt31]*/ == 0 ? [] : "<String>";
+/*member: nonContainer:[exact=JSExtendableArray|powerset=0]*/
+nonContainer(/*[exact=JSUInt31|powerset=0]*/ choice) {
+  var m = choice /*invoke: [exact=JSUInt31|powerset=0]*/ == 0 ? [] : "<String>";
   if (m is! List) throw 123;
   // The union then filter leaves us with a non-container type.
   return m;
 }
 
-/*member: foo2:[null]*/
-foo2(int /*[exact=JSUInt31]*/ choice) {
+/*member: foo2:[null|powerset=1]*/
+foo2(int /*[exact=JSUInt31|powerset=0]*/ choice) {
   final methods = nonContainer(choice);
 
   /// ignore: unused_local_variable
   var res, sum;
   for (
     int i = 0;
-    i /*invoke: [subclass=JSPositiveInt]*/ != 3;
-    i /*invoke: [subclass=JSPositiveInt]*/ ++
+    i /*invoke: [subclass=JSPositiveInt|powerset=0]*/ != 3;
+    i /*invoke: [subclass=JSPositiveInt|powerset=0]*/ ++
   ) {
-    methods. /*invoke: [exact=JSExtendableArray]*/ add(/*[null]*/ (
-      int
-      /*spec.[null|subclass=Object]*/
-      /*prod.[subclass=JSInt]*/
-      x,
-    ) {
-      res = x;
-      sum = x /*invoke: [subclass=JSInt]*/ + i;
-    });
+    methods. /*invoke: [exact=JSExtendableArray|powerset=0]*/ add(
+      /*[null|powerset=1]*/ (
+        int
+        /*spec.[null|subclass=Object|powerset=1]*/
+        /*prod.[subclass=JSInt|powerset=0]*/
+        x,
+      ) {
+        res = x;
+        sum = x /*invoke: [subclass=JSInt|powerset=0]*/ + i;
+      },
+    );
   }
-  methods /*[exact=JSExtendableArray]*/ [0](499);
+  methods /*[exact=JSExtendableArray|powerset=0]*/ [0](499);
   probe2res(res);
   probe2methods(methods);
 }
 
-/*member: probe2res:[null|subclass=JSInt]*/
+/*member: probe2res:[null|subclass=JSInt|powerset=1]*/
 probe2res(
-  /*[null|subclass=JSInt]*/
+  /*[null|subclass=JSInt|powerset=1]*/
   x,
 ) => x;
 
-/*member: probe2methods:[exact=JSExtendableArray]*/
-probe2methods(/*[exact=JSExtendableArray]*/ x) => x;
+/*member: probe2methods:[exact=JSExtendableArray|powerset=0]*/
+probe2methods(/*[exact=JSExtendableArray|powerset=0]*/ x) => x;
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   foo1();
   foo2(0);
diff --git a/pkg/compiler/test/inference/data/closurization_instance.dart b/pkg/compiler/test/inference/data/closurization_instance.dart
index a7ad3f7..9e90b9e 100644
--- a/pkg/compiler/test/inference/data/closurization_instance.dart
+++ b/pkg/compiler/test/inference/data/closurization_instance.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   closurizedCallToString();
 }
@@ -11,19 +11,19 @@
 // Implicit/explicit .call on instance method tear-off.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class.:[exact=Class]*/
+/*member: Class.:[exact=Class|powerset=0]*/
 class Class {
-  /*member: Class.method:[exact=JSUInt31]*/
+  /*member: Class.method:[exact=JSUInt31|powerset=0]*/
   method() => 42;
 }
 
-/*member: closurizedCallToString:[exact=JSString]*/
+/*member: closurizedCallToString:[exact=JSString|powerset=0]*/
 closurizedCallToString() {
   var c = Class();
-  var local = c. /*[exact=Class]*/ method;
-  local. /*invoke: [subclass=Closure]*/ toString();
+  var local = c. /*[exact=Class|powerset=0]*/ method;
+  local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
   local();
-  local. /*invoke: [subclass=Closure]*/ toString();
+  local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
   local.call();
-  return local. /*invoke: [subclass=Closure]*/ toString();
+  return local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
 }
diff --git a/pkg/compiler/test/inference/data/closurization_instance_call.dart b/pkg/compiler/test/inference/data/closurization_instance_call.dart
index 269d197..50148e1 100644
--- a/pkg/compiler/test/inference/data/closurization_instance_call.dart
+++ b/pkg/compiler/test/inference/data/closurization_instance_call.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   closurizedCallToString();
 }
@@ -12,23 +12,23 @@
 // '.call' method in the closed world.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class.:[exact=Class]*/
+/*member: Class.:[exact=Class|powerset=0]*/
 class Class {
-  /*member: Class.call:Value([exact=JSBool], value: true)*/
+  /*member: Class.call:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
   call() => true;
 
-  /*member: Class.method:[exact=JSUInt31]*/
+  /*member: Class.method:[exact=JSUInt31|powerset=0]*/
   method() => 42;
 }
 
-/*member: closurizedCallToString:[exact=JSString]*/
+/*member: closurizedCallToString:[exact=JSString|powerset=0]*/
 closurizedCallToString() {
   var c = Class();
-  c. /*invoke: [exact=Class]*/ call(); // Make `Class.call` live.
-  var local = c. /*[exact=Class]*/ method;
-  local. /*invoke: [subclass=Closure]*/ toString();
+  c. /*invoke: [exact=Class|powerset=0]*/ call(); // Make `Class.call` live.
+  var local = c. /*[exact=Class|powerset=0]*/ method;
+  local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
   local();
-  local. /*invoke: [subclass=Closure]*/ toString();
+  local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
   local.call();
-  return local. /*invoke: [subclass=Closure]*/ toString();
+  return local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
 }
diff --git a/pkg/compiler/test/inference/data/closurization_local_call.dart b/pkg/compiler/test/inference/data/closurization_local_call.dart
index f752280..6f6c28a 100644
--- a/pkg/compiler/test/inference/data/closurization_local_call.dart
+++ b/pkg/compiler/test/inference/data/closurization_local_call.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   closurizedCallToString();
 }
@@ -12,20 +12,20 @@
 // method in the closed world.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class.:[exact=Class]*/
+/*member: Class.:[exact=Class|powerset=0]*/
 class Class {
-  /*member: Class.call:Value([exact=JSBool], value: true)*/
+  /*member: Class.call:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
   call() => true;
 }
 
-/*member: closurizedCallToString:[exact=JSString]*/
+/*member: closurizedCallToString:[exact=JSString|powerset=0]*/
 closurizedCallToString() {
   var c = Class();
-  c. /*invoke: [exact=Class]*/ call(); // Make `Class.call` live.
-  var local = /*[exact=JSUInt31]*/ () => 42;
-  local. /*invoke: [subclass=Closure]*/ toString();
+  c. /*invoke: [exact=Class|powerset=0]*/ call(); // Make `Class.call` live.
+  var local = /*[exact=JSUInt31|powerset=0]*/ () => 42;
+  local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
   local();
-  local. /*invoke: [subclass=Closure]*/ toString();
+  local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
   local.call();
-  return local. /*invoke: [subclass=Closure]*/ toString();
+  return local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
 }
diff --git a/pkg/compiler/test/inference/data/closurization_static.dart b/pkg/compiler/test/inference/data/closurization_static.dart
index deea1db..f3b5fd0 100644
--- a/pkg/compiler/test/inference/data/closurization_static.dart
+++ b/pkg/compiler/test/inference/data/closurization_static.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   closurizedCallToString();
 }
@@ -11,15 +11,15 @@
 // Implicit/explicit .call on static method tear-off.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: method:[exact=JSUInt31]*/
+/*member: method:[exact=JSUInt31|powerset=0]*/
 method() => 42;
 
-/*member: closurizedCallToString:[exact=JSString]*/
+/*member: closurizedCallToString:[exact=JSString|powerset=0]*/
 closurizedCallToString() {
   var local = method;
-  local. /*invoke: [subclass=Closure]*/ toString();
+  local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
   local();
-  local. /*invoke: [subclass=Closure]*/ toString();
+  local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
   local.call();
-  return local. /*invoke: [subclass=Closure]*/ toString();
+  return local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
 }
diff --git a/pkg/compiler/test/inference/data/closurization_static_call.dart b/pkg/compiler/test/inference/data/closurization_static_call.dart
index ceed460..a0dba61 100644
--- a/pkg/compiler/test/inference/data/closurization_static_call.dart
+++ b/pkg/compiler/test/inference/data/closurization_static_call.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   closurizedCallToString();
 }
@@ -12,23 +12,23 @@
 // '.call' method in the closed world.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: method:[exact=JSUInt31]*/
+/*member: method:[exact=JSUInt31|powerset=0]*/
 method() => 42;
 
-/*member: Class.:[exact=Class]*/
+/*member: Class.:[exact=Class|powerset=0]*/
 class Class {
-  /*member: Class.call:Value([exact=JSBool], value: true)*/
+  /*member: Class.call:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
   call() => true;
 }
 
-/*member: closurizedCallToString:[exact=JSString]*/
+/*member: closurizedCallToString:[exact=JSString|powerset=0]*/
 closurizedCallToString() {
   var c = Class();
-  c. /*invoke: [exact=Class]*/ call(); // Make `Class.call` live.
+  c. /*invoke: [exact=Class|powerset=0]*/ call(); // Make `Class.call` live.
   var local = method;
-  local. /*invoke: [subclass=Closure]*/ toString();
+  local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
   local();
-  local. /*invoke: [subclass=Closure]*/ toString();
+  local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
   local.call();
-  return local. /*invoke: [subclass=Closure]*/ toString();
+  return local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
 }
diff --git a/pkg/compiler/test/inference/data/closurized_tear_off.dart b/pkg/compiler/test/inference/data/closurized_tear_off.dart
index d9de11b..3da4f2d 100644
--- a/pkg/compiler/test/inference/data/closurized_tear_off.dart
+++ b/pkg/compiler/test/inference/data/closurized_tear_off.dart
@@ -2,35 +2,36 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: A.:[exact=A]*/
+/*member: A.:[exact=A|powerset=0]*/
 class A {
-  /*member: A.foo:[exact=JSUInt31]*/
-  foo(/*[null|subclass=Object]*/ a) => 3;
-  /*member: A.bar:[exact=MappedListIterable]*/
+  /*member: A.foo:[exact=JSUInt31|powerset=0]*/
+  foo(/*[null|subclass=Object|powerset=1]*/ a) => 3;
+  /*member: A.bar:[exact=MappedListIterable|powerset=0]*/
   bar(
-    /*Container([exact=JSExtendableArray], element: [subclass=JSPositiveInt], length: 10)*/ x,
+    /*Container([exact=JSExtendableArray|powerset=0], element: [subclass=JSPositiveInt|powerset=0], length: 10, powerset: 0)*/ x,
   ) => x
-      . /*invoke: Container([exact=JSExtendableArray], element: [subclass=JSPositiveInt], length: 10)*/ map(
-        /*[subclass=A]*/ foo,
+      . /*invoke: Container([exact=JSExtendableArray|powerset=0], element: [subclass=JSPositiveInt|powerset=0], length: 10, powerset: 0)*/ map(
+        /*[subclass=A|powerset=0]*/ foo,
       );
 }
 
-/*member: B.:[exact=B]*/
+/*member: B.:[exact=B|powerset=0]*/
 class B extends A {
-  /*member: B.foo:[exact=JSUInt31]*/
-  foo(/*[null|subclass=Object]*/ b) {
+  /*member: B.foo:[exact=JSUInt31|powerset=0]*/
+  foo(/*[null|subclass=Object|powerset=1]*/ b) {
     b.abs();
     return 4;
   }
 }
 
-/*member: getA:[subclass=A]*/
-getA(bool /*Value([exact=JSBool], value: false)*/ x) => x ? A() : B();
+/*member: getA:[subclass=A|powerset=0]*/
+getA(bool /*Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/ x) =>
+    x ? A() : B();
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
-  getA(false). /*invoke: [subclass=A]*/ bar(
-    List. /*update: Container([exact=JSExtendableArray], element: [subclass=JSPositiveInt], length: 10)*/ generate(
+  getA(false). /*invoke: [subclass=A|powerset=0]*/ bar(
+    List. /*update: Container([exact=JSExtendableArray|powerset=0], element: [subclass=JSPositiveInt|powerset=0], length: 10, powerset: 0)*/ generate(
       10,
       (i) => i,
     ),
diff --git a/pkg/compiler/test/inference/data/conditional.dart b/pkg/compiler/test/inference/data/conditional.dart
index e8af4fe..92e2189 100644
--- a/pkg/compiler/test/inference/data/conditional.dart
+++ b/pkg/compiler/test/inference/data/conditional.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   simpleConditional();
   simpleConditionalTrue();
@@ -19,10 +19,10 @@
 /// Simple conditional with unknown condition value.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _simpleConditional:Union([exact=JSString], [exact=JSUInt31])*/
-_simpleConditional(/*[exact=JSBool]*/ c) => c ? '' : 0;
+/*member: _simpleConditional:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+_simpleConditional(/*[exact=JSBool|powerset=0]*/ c) => c ? '' : 0;
 
-/*member: simpleConditional:[null]*/
+/*member: simpleConditional:[null|powerset=1]*/
 simpleConditional() {
   _simpleConditional(true);
   _simpleConditional(false);
@@ -32,10 +32,12 @@
 /// Simple conditional with unknown condition value.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _simpleConditionalTrue:Union([exact=JSString], [exact=JSUInt31])*/
-_simpleConditionalTrue(/*Value([exact=JSBool], value: true)*/ c) => c ? '' : 0;
+/*member: _simpleConditionalTrue:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+_simpleConditionalTrue(
+  /*Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/ c,
+) => c ? '' : 0;
 
-/*member: simpleConditionalTrue:[null]*/
+/*member: simpleConditionalTrue:[null|powerset=1]*/
 simpleConditionalTrue() {
   _simpleConditionalTrue(true);
 }
@@ -44,11 +46,12 @@
 /// Simple conditional with unknown condition value.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _simpleConditionalFalse:Union([exact=JSString], [exact=JSUInt31])*/
-_simpleConditionalFalse(/*Value([exact=JSBool], value: false)*/ c) =>
-    c ? '' : 0;
+/*member: _simpleConditionalFalse:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+_simpleConditionalFalse(
+  /*Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/ c,
+) => c ? '' : 0;
 
-/*member: simpleConditionalFalse:[null]*/
+/*member: simpleConditionalFalse:[null|powerset=1]*/
 simpleConditionalFalse() {
   _simpleConditionalFalse(false);
 }
@@ -56,11 +59,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 /// Conditional with an is test.
 ////////////////////////////////////////////////////////////////////////////////
-/*member: _conditionalIs:Union([exact=JSString], [subclass=JSPositiveInt])*/
-_conditionalIs(/*[null|exact=JSUInt31]*/ o) =>
-    o is int ? o. /*invoke: [exact=JSUInt31]*/ abs() : '';
+/*member: _conditionalIs:Union([exact=JSString|powerset=0], [subclass=JSPositiveInt|powerset=0], powerset: 0)*/
+_conditionalIs(/*[null|exact=JSUInt31|powerset=1]*/ o) =>
+    o is int ? o. /*invoke: [exact=JSUInt31|powerset=0]*/ abs() : '';
 
-/*member: conditionalIs:[null]*/
+/*member: conditionalIs:[null|powerset=1]*/
 conditionalIs() {
   _conditionalIs(null);
   _conditionalIs(1);
@@ -69,11 +72,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 /// Conditional with an is `int` test known to be true.
 ////////////////////////////////////////////////////////////////////////////////
-/*member: _conditionalIsInt:Union([exact=JSString], [subclass=JSPositiveInt])*/
-_conditionalIsInt(/*[exact=JSUInt31]*/ o) =>
-    o is int ? o. /*invoke: [exact=JSUInt31]*/ abs() : '';
+/*member: _conditionalIsInt:Union([exact=JSString|powerset=0], [subclass=JSPositiveInt|powerset=0], powerset: 0)*/
+_conditionalIsInt(/*[exact=JSUInt31|powerset=0]*/ o) =>
+    o is int ? o. /*invoke: [exact=JSUInt31|powerset=0]*/ abs() : '';
 
-/*member: conditionalIsInt:[null]*/
+/*member: conditionalIsInt:[null|powerset=1]*/
 conditionalIsInt() {
   _conditionalIsInt(1);
 }
@@ -81,11 +84,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 /// Conditional with an is-not test.
 ////////////////////////////////////////////////////////////////////////////////
-/*member: _conditionalIsNot:Union([exact=JSString], [subclass=JSPositiveInt])*/
-_conditionalIsNot(/*[null|exact=JSUInt31]*/ o) =>
-    o is! int ? '' : o. /*invoke: [exact=JSUInt31]*/ abs();
+/*member: _conditionalIsNot:Union([exact=JSString|powerset=0], [subclass=JSPositiveInt|powerset=0], powerset: 0)*/
+_conditionalIsNot(/*[null|exact=JSUInt31|powerset=1]*/ o) =>
+    o is! int ? '' : o. /*invoke: [exact=JSUInt31|powerset=0]*/ abs();
 
-/*member: conditionalIsNot:[null]*/
+/*member: conditionalIsNot:[null|powerset=1]*/
 conditionalIsNot() {
   _conditionalIsNot(null);
   _conditionalIsNot(1);
@@ -94,11 +97,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 /// Conditional with an is-not `int` test known to be false.
 ////////////////////////////////////////////////////////////////////////////////
-/*member: _conditionalIsNotInt:Union([exact=JSString], [subclass=JSPositiveInt])*/
-_conditionalIsNotInt(/*[exact=JSUInt31]*/ o) =>
-    o is! int ? '' : o. /*invoke: [exact=JSUInt31]*/ abs();
+/*member: _conditionalIsNotInt:Union([exact=JSString|powerset=0], [subclass=JSPositiveInt|powerset=0], powerset: 0)*/
+_conditionalIsNotInt(/*[exact=JSUInt31|powerset=0]*/ o) =>
+    o is! int ? '' : o. /*invoke: [exact=JSUInt31|powerset=0]*/ abs();
 
-/*member: conditionalIsNotInt:[null]*/
+/*member: conditionalIsNotInt:[null|powerset=1]*/
 conditionalIsNotInt() {
   _conditionalIsNotInt(1);
 }
@@ -106,11 +109,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 /// Conditional with an is test.
 ////////////////////////////////////////////////////////////////////////////////
-/*member: _conditionalNull:Union([exact=JSString], [subclass=JSPositiveInt])*/
-_conditionalNull(/*[null|exact=JSUInt31]*/ o) =>
-    o == null ? '' : o. /*invoke: [exact=JSUInt31]*/ abs();
+/*member: _conditionalNull:Union([exact=JSString|powerset=0], [subclass=JSPositiveInt|powerset=0], powerset: 0)*/
+_conditionalNull(/*[null|exact=JSUInt31|powerset=1]*/ o) =>
+    o == null ? '' : o. /*invoke: [exact=JSUInt31|powerset=0]*/ abs();
 
-/*member: conditionalNull:[null]*/
+/*member: conditionalNull:[null|powerset=1]*/
 conditionalNull() {
   _conditionalNull(null);
   _conditionalNull(1);
@@ -119,11 +122,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 /// Conditional with an is `int` test known to be true.
 ////////////////////////////////////////////////////////////////////////////////
-/*member: _conditionalNotNull:Union([exact=JSString], [subclass=JSPositiveInt])*/
-_conditionalNotNull(/*[null|exact=JSUInt31]*/ o) =>
-    o != null ? o. /*invoke: [exact=JSUInt31]*/ abs() : '';
+/*member: _conditionalNotNull:Union([exact=JSString|powerset=0], [subclass=JSPositiveInt|powerset=0], powerset: 0)*/
+_conditionalNotNull(/*[null|exact=JSUInt31|powerset=1]*/ o) =>
+    o != null ? o. /*invoke: [exact=JSUInt31|powerset=0]*/ abs() : '';
 
-/*member: conditionalNotNull:[null]*/
+/*member: conditionalNotNull:[null|powerset=1]*/
 conditionalNotNull() {
   _conditionalNotNull(null);
   _conditionalNotNull(1);
diff --git a/pkg/compiler/test/inference/data/const_closure.dart b/pkg/compiler/test/inference/data/const_closure.dart
index ca22d2e..d94cee0 100644
--- a/pkg/compiler/test/inference/data/const_closure.dart
+++ b/pkg/compiler/test/inference/data/const_closure.dart
@@ -2,13 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: method1:[exact=JSUInt31]*/
+/*member: method1:[exact=JSUInt31|powerset=0]*/
 method1() {
   return 42;
 }
 
-/*member: method2:[exact=JSUInt31]*/
-method2(/*[exact=JSUInt31]*/ a) {
+/*member: method2:[exact=JSUInt31|powerset=0]*/
+method2(/*[exact=JSUInt31|powerset=0]*/ a) {
   // Called only via [foo2] with a small integer.
   return a;
 }
@@ -17,17 +17,17 @@
 
 const foo2 = method2;
 
-/*member: returnInt1:[null|subclass=Object]*/
+/*member: returnInt1:[null|subclass=Object|powerset=1]*/
 returnInt1() {
   return foo1();
 }
 
-/*member: returnInt2:[null|subclass=Object]*/
+/*member: returnInt2:[null|subclass=Object|powerset=1]*/
 returnInt2() {
   return foo2(54);
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   returnInt1();
   returnInt2();
diff --git a/pkg/compiler/test/inference/data/const_closure2.dart b/pkg/compiler/test/inference/data/const_closure2.dart
index 5a45b05..e178a5b 100644
--- a/pkg/compiler/test/inference/data/const_closure2.dart
+++ b/pkg/compiler/test/inference/data/const_closure2.dart
@@ -2,20 +2,24 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: method:Union([exact=JSNumNotInt], [exact=JSUInt31])*/
+/*member: method:Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 // Called via [foo] with integer then double.
-method(/*Union([exact=JSNumNotInt], [exact=JSUInt31])*/ a) {
+method(
+  /*Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ a,
+) {
   return a;
 }
 
 const foo = method;
 
-/*member: returnNum:[null|subclass=Object]*/
-returnNum(/*Union([exact=JSNumNotInt], [exact=JSUInt31])*/ x) {
+/*member: returnNum:[null|subclass=Object|powerset=1]*/
+returnNum(
+  /*Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ x,
+) {
   return foo(x);
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   returnNum(10);
   returnNum(10.5);
diff --git a/pkg/compiler/test/inference/data/const_closure3.dart b/pkg/compiler/test/inference/data/const_closure3.dart
index 31bcc35..e9a2994 100644
--- a/pkg/compiler/test/inference/data/const_closure3.dart
+++ b/pkg/compiler/test/inference/data/const_closure3.dart
@@ -2,20 +2,20 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: method:[exact=JSUInt31]*/
+/*member: method:[exact=JSUInt31|powerset=0]*/
 // Called only via [foo2] with a small integer.
-method(/*[exact=JSUInt31]*/ a) {
+method(/*[exact=JSUInt31|powerset=0]*/ a) {
   return a;
 }
 
 const foo = method;
 
-/*member: returnInt:[null|subclass=Object]*/
+/*member: returnInt:[null|subclass=Object|powerset=1]*/
 returnInt() {
   return foo(54);
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   returnInt();
 }
diff --git a/pkg/compiler/test/inference/data/const_closure4.dart b/pkg/compiler/test/inference/data/const_closure4.dart
index 5a45b05..e178a5b 100644
--- a/pkg/compiler/test/inference/data/const_closure4.dart
+++ b/pkg/compiler/test/inference/data/const_closure4.dart
@@ -2,20 +2,24 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: method:Union([exact=JSNumNotInt], [exact=JSUInt31])*/
+/*member: method:Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 // Called via [foo] with integer then double.
-method(/*Union([exact=JSNumNotInt], [exact=JSUInt31])*/ a) {
+method(
+  /*Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ a,
+) {
   return a;
 }
 
 const foo = method;
 
-/*member: returnNum:[null|subclass=Object]*/
-returnNum(/*Union([exact=JSNumNotInt], [exact=JSUInt31])*/ x) {
+/*member: returnNum:[null|subclass=Object|powerset=1]*/
+returnNum(
+  /*Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ x,
+) {
   return foo(x);
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   returnNum(10);
   returnNum(10.5);
diff --git a/pkg/compiler/test/inference/data/const_closure5.dart b/pkg/compiler/test/inference/data/const_closure5.dart
index 0877631..26b5533 100644
--- a/pkg/compiler/test/inference/data/const_closure5.dart
+++ b/pkg/compiler/test/inference/data/const_closure5.dart
@@ -2,20 +2,22 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: method:Union([exact=JSNumNotInt], [exact=JSUInt31])*/
+/*member: method:Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 // Called only via [foo2] with a small integer.
-method(/*Union([exact=JSNumNotInt], [exact=JSUInt31])*/ a) {
+method(
+  /*Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ a,
+) {
   return a;
 }
 
 const foo = method;
 
-/*member: returnInt:[null|subclass=Object]*/
+/*member: returnInt:[null|subclass=Object|powerset=1]*/
 returnInt() {
   return foo(54);
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   returnInt();
   method(55.2);
diff --git a/pkg/compiler/test/inference/data/const_closure_default.dart b/pkg/compiler/test/inference/data/const_closure_default.dart
index bd33b03..2fc77ba 100644
--- a/pkg/compiler/test/inference/data/const_closure_default.dart
+++ b/pkg/compiler/test/inference/data/const_closure_default.dart
@@ -4,43 +4,43 @@
 
 // [defaultFn_i] is called only via [foo_i]'s default value with a small integer.
 
-/*member: defaultFn1:[exact=JSUInt31]*/
-defaultFn1(/*[exact=JSUInt31]*/ a) => a;
+/*member: defaultFn1:[exact=JSUInt31|powerset=0]*/
+defaultFn1(/*[exact=JSUInt31|powerset=0]*/ a) => a;
 
-/*member: defaultFn2:[exact=JSUInt31]*/
-defaultFn2(/*[exact=JSUInt31]*/ a) => a;
+/*member: defaultFn2:[exact=JSUInt31|powerset=0]*/
+defaultFn2(/*[exact=JSUInt31|powerset=0]*/ a) => a;
 
-/*member: defaultFn3:[exact=JSUInt31]*/
-defaultFn3(/*[exact=JSUInt31]*/ a) => a;
+/*member: defaultFn3:[exact=JSUInt31|powerset=0]*/
+defaultFn3(/*[exact=JSUInt31|powerset=0]*/ a) => a;
 
-/*member: defaultFn4:[exact=JSUInt31]*/
-defaultFn4(/*[exact=JSUInt31]*/ a) => a;
+/*member: defaultFn4:[exact=JSUInt31|powerset=0]*/
+defaultFn4(/*[exact=JSUInt31|powerset=0]*/ a) => a;
 
-/*member: defaultFn5:[exact=JSUInt31]*/
-defaultFn5(/*[exact=JSUInt31]*/ a) => a;
+/*member: defaultFn5:[exact=JSUInt31|powerset=0]*/
+defaultFn5(/*[exact=JSUInt31|powerset=0]*/ a) => a;
 
-/*member: defaultFn6:[exact=JSUInt31]*/
-defaultFn6(/*[exact=JSUInt31]*/ a) => a;
+/*member: defaultFn6:[exact=JSUInt31|powerset=0]*/
+defaultFn6(/*[exact=JSUInt31|powerset=0]*/ a) => a;
 
-/*member: foo1:[null|subclass=Object]*/
-foo1([/*[subclass=Closure]*/ fn = defaultFn1]) => fn(54);
+/*member: foo1:[null|subclass=Object|powerset=1]*/
+foo1([/*[subclass=Closure|powerset=0]*/ fn = defaultFn1]) => fn(54);
 
-/*member: foo2:[null|subclass=Object]*/
-foo2({/*[subclass=Closure]*/ fn = defaultFn2}) => fn(54);
+/*member: foo2:[null|subclass=Object|powerset=1]*/
+foo2({/*[subclass=Closure|powerset=0]*/ fn = defaultFn2}) => fn(54);
 
-/*member: foo3:[null|subclass=Object]*/
-foo3([/*[subclass=Closure]*/ fn = defaultFn3]) => fn(54);
+/*member: foo3:[null|subclass=Object|powerset=1]*/
+foo3([/*[subclass=Closure|powerset=0]*/ fn = defaultFn3]) => fn(54);
 
-/*member: foo4:[null|subclass=Object]*/
-foo4({/*[subclass=Closure]*/ fn = defaultFn4}) => fn(54);
+/*member: foo4:[null|subclass=Object|powerset=1]*/
+foo4({/*[subclass=Closure|powerset=0]*/ fn = defaultFn4}) => fn(54);
 
-/*member: foo5:[null|subclass=Object]*/
-foo5([/*[null|subclass=Object]*/ fn = defaultFn5]) => fn(54);
+/*member: foo5:[null|subclass=Object|powerset=1]*/
+foo5([/*[null|subclass=Object|powerset=1]*/ fn = defaultFn5]) => fn(54);
 
-/*member: foo6:[null|subclass=Object]*/
-foo6({/*[null|subclass=Object]*/ fn = defaultFn6}) => fn(54);
+/*member: foo6:[null|subclass=Object|powerset=1]*/
+foo6({/*[null|subclass=Object|powerset=1]*/ fn = defaultFn6}) => fn(54);
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   // Direct calls.
   foo1();
diff --git a/pkg/compiler/test/inference/data/container_mask_equal.dart b/pkg/compiler/test/inference/data/container_mask_equal.dart
index 59d548d..4bbbed1 100644
--- a/pkg/compiler/test/inference/data/container_mask_equal.dart
+++ b/pkg/compiler/test/inference/data/container_mask_equal.dart
@@ -7,25 +7,25 @@
 
 import 'dart:typed_data';
 
-/*member: method1:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+/*member: method1:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
 method1() => [0];
 
-/*member: method2:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 2)*/
+/*member: method2:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 2, powerset: 0)*/
 method2() => [1, 2];
 
-/*member: method3:Container([exact=NativeUint8List], element: [exact=JSUInt31], length: 1)*/
+/*member: method3:Container([exact=NativeUint8List|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
 method3() => Uint8List(1);
 
-/*member: method4:Container([exact=NativeUint8List], element: [exact=JSUInt31], length: 2)*/
+/*member: method4:Container([exact=NativeUint8List|powerset=0], element: [exact=JSUInt31|powerset=0], length: 2, powerset: 0)*/
 method4() => Uint8List(2);
 
-/*member: method1or2:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: null)*/
-method1or2(/*[exact=JSBool]*/ c) => c ? method1() : method2();
+/*member: method1or2:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: null, powerset: 0)*/
+method1or2(/*[exact=JSBool|powerset=0]*/ c) => c ? method1() : method2();
 
-/*member: method3or4:Container([exact=NativeUint8List], element: [exact=JSUInt31], length: null)*/
-method3or4(/*[exact=JSBool]*/ c) => c ? method3() : method4();
+/*member: method3or4:Container([exact=NativeUint8List|powerset=0], element: [exact=JSUInt31|powerset=0], length: null, powerset: 0)*/
+method3or4(/*[exact=JSBool|powerset=0]*/ c) => c ? method3() : method4();
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   method1or2(true);
   method1or2(false);
diff --git a/pkg/compiler/test/inference/data/default_value.dart b/pkg/compiler/test/inference/data/default_value.dart
index a9c6f46..a485020 100644
--- a/pkg/compiler/test/inference/data/default_value.dart
+++ b/pkg/compiler/test/inference/data/default_value.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   positionalWithoutDefaultOnLocal();
   positionalWithNullDefaultOnLocal();
@@ -12,38 +12,40 @@
   positionalWithOneDefaultOnStatic();
 }
 
-/*member: positionalWithoutDefaultOnLocal:[null]*/
+/*member: positionalWithoutDefaultOnLocal:[null|powerset=1]*/
 positionalWithoutDefaultOnLocal() {
-  /*[null]*/
-  local([/*[null]*/ parameter]) => parameter;
+  /*[null|powerset=1]*/
+  local([/*[null|powerset=1]*/ parameter]) => parameter;
   return local();
 }
 
-/*member: positionalWithNullDefaultOnLocal:[null]*/
+/*member: positionalWithNullDefaultOnLocal:[null|powerset=1]*/
 positionalWithNullDefaultOnLocal() {
-  /*[null]*/
-  local([/*[null]*/ parameter = null]) => parameter;
+  /*[null|powerset=1]*/
+  local([/*[null|powerset=1]*/ parameter = null]) => parameter;
   return local();
 }
 
-/*member: positionalWithOneDefaultOnLocal:[exact=JSUInt31]*/
+/*member: positionalWithOneDefaultOnLocal:[exact=JSUInt31|powerset=0]*/
 positionalWithOneDefaultOnLocal() {
-  /*[exact=JSUInt31]*/
-  local([/*[exact=JSUInt31]*/ parameter = 1]) => parameter;
+  /*[exact=JSUInt31|powerset=0]*/
+  local([/*[exact=JSUInt31|powerset=0]*/ parameter = 1]) => parameter;
   return local();
 }
 
-/*member: positionalWithoutDefaultOnStatic:[null]*/
-positionalWithoutDefaultOnStatic([/*[null]*/ parameter]) {
+/*member: positionalWithoutDefaultOnStatic:[null|powerset=1]*/
+positionalWithoutDefaultOnStatic([/*[null|powerset=1]*/ parameter]) {
   return parameter;
 }
 
-/*member: positionalWithNullDefaultOnStatic:[null]*/
-positionalWithNullDefaultOnStatic([/*[null]*/ parameter = null]) {
+/*member: positionalWithNullDefaultOnStatic:[null|powerset=1]*/
+positionalWithNullDefaultOnStatic([/*[null|powerset=1]*/ parameter = null]) {
   return parameter;
 }
 
-/*member: positionalWithOneDefaultOnStatic:[exact=JSUInt31]*/
-positionalWithOneDefaultOnStatic([/*[exact=JSUInt31]*/ parameter = 1]) {
+/*member: positionalWithOneDefaultOnStatic:[exact=JSUInt31|powerset=0]*/
+positionalWithOneDefaultOnStatic([
+  /*[exact=JSUInt31|powerset=0]*/ parameter = 1,
+]) {
   return parameter;
 }
diff --git a/pkg/compiler/test/inference/data/deferred_load.dart b/pkg/compiler/test/inference/data/deferred_load.dart
index e6c371e..2c8babb 100644
--- a/pkg/compiler/test/inference/data/deferred_load.dart
+++ b/pkg/compiler/test/inference/data/deferred_load.dart
@@ -4,10 +4,10 @@
 
 import 'package:expect/expect.dart' deferred as expect;
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   callLoadLibrary();
 }
 
-/*member: callLoadLibrary:[exact=_Future]*/
+/*member: callLoadLibrary:[exact=_Future|powerset=0]*/
 callLoadLibrary() => expect.loadLibrary();
diff --git a/pkg/compiler/test/inference/data/deferred_load_get.dart b/pkg/compiler/test/inference/data/deferred_load_get.dart
index 27a7a3a..8d7c40e 100644
--- a/pkg/compiler/test/inference/data/deferred_load_get.dart
+++ b/pkg/compiler/test/inference/data/deferred_load_get.dart
@@ -6,12 +6,12 @@
 
 // Synthetic getter added by kernel.
 
-/*member: _#loadLibrary_expect:[exact=_Future]*/
+/*member: _#loadLibrary_expect:[exact=_Future|powerset=0]*/
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   tearOffLoadLibrary();
 }
 
-/*member: tearOffLoadLibrary:[subclass=Closure]*/
+/*member: tearOffLoadLibrary:[subclass=Closure|powerset=0]*/
 tearOffLoadLibrary() => expect.loadLibrary;
diff --git a/pkg/compiler/test/inference/data/dictionary_types.dart b/pkg/compiler/test/inference/data/dictionary_types.dart
index 464ec76..fd41375 100644
--- a/pkg/compiler/test/inference/data/dictionary_types.dart
+++ b/pkg/compiler/test/inference/data/dictionary_types.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   test1();
   test2();
@@ -11,7 +11,7 @@
   test5();
 }
 
-/*member: dictionaryA1:Map([exact=JsLinkedHashMap], key: [null|subclass=Object], value: [null|subclass=Object])*/
+/*member: dictionaryA1:Map([exact=JsLinkedHashMap|powerset=0], key: [null|subclass=Object|powerset=1], value: [null|subclass=Object|powerset=1], powerset: 0)*/
 dynamic dictionaryA1 = {
   'string': "aString",
   'int': 42,
@@ -19,7 +19,7 @@
   'list': [],
 };
 
-/*member: dictionaryB1:Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt], [exact=JSString], [exact=JSUInt31]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSNumNotInt], list: Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null), stringTwo: Value([null|exact=JSString], value: "anotherString"), intTwo: [null|exact=JSUInt31]})*/
+/*member: dictionaryB1:Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {string: Value([exact=JSString|powerset=0], value: "aString", powerset: 0), int: [exact=JSUInt31|powerset=0], double: [exact=JSNumNotInt|powerset=0], list: Container([exact=JSExtendableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0), stringTwo: Value([null|exact=JSString|powerset=1], value: "anotherString", powerset: 1), intTwo: [null|exact=JSUInt31|powerset=1]}, powerset: 0)*/
 dynamic dictionaryB1 = {
   'string': "aString",
   'int': 42,
@@ -27,48 +27,48 @@
   'list': [],
 };
 
-/*member: otherDict1:Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSString], [exact=JSUInt31]), map: {stringTwo: Value([exact=JSString], value: "anotherString"), intTwo: [exact=JSUInt31]})*/
+/*member: otherDict1:Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {stringTwo: Value([exact=JSString|powerset=0], value: "anotherString", powerset: 0), intTwo: [exact=JSUInt31|powerset=0]}, powerset: 0)*/
 dynamic otherDict1 = {'stringTwo': "anotherString", 'intTwo': 84};
 
-/*member: int1:[exact=JSUInt31]*/
+/*member: int1:[exact=JSUInt31|powerset=0]*/
 dynamic int1 = 0;
 
-/*member: anotherInt1:[exact=JSUInt31]*/
+/*member: anotherInt1:[exact=JSUInt31|powerset=0]*/
 dynamic anotherInt1 = 0;
 
-/*member: nullOrInt1:[null|exact=JSUInt31]*/
+/*member: nullOrInt1:[null|exact=JSUInt31|powerset=1]*/
 dynamic nullOrInt1 = 0;
 
-/*member: dynamic1:[null|subclass=Object]*/
+/*member: dynamic1:[null|subclass=Object|powerset=1]*/
 dynamic dynamic1 = 0;
 
-/*member: test1:[null]*/
+/*member: test1:[null|powerset=1]*/
 test1() {
   dictionaryA1
-      . /*invoke: Map([exact=JsLinkedHashMap], key: [null|subclass=Object], value: [null|subclass=Object])*/ addAll(
+      . /*invoke: Map([exact=JsLinkedHashMap|powerset=0], key: [null|subclass=Object|powerset=1], value: [null|subclass=Object|powerset=1], powerset: 0)*/ addAll(
         otherDict1,
       );
   dictionaryB1
-      . /*invoke: Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt], [exact=JSString], [exact=JSUInt31]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSNumNotInt], list: Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null), stringTwo: Value([null|exact=JSString], value: "anotherString"), intTwo: [null|exact=JSUInt31]})*/ addAll(
+      . /*invoke: Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {string: Value([exact=JSString|powerset=0], value: "aString", powerset: 0), int: [exact=JSUInt31|powerset=0], double: [exact=JSNumNotInt|powerset=0], list: Container([exact=JSExtendableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0), stringTwo: Value([null|exact=JSString|powerset=1], value: "anotherString", powerset: 1), intTwo: [null|exact=JSUInt31|powerset=1]}, powerset: 0)*/ addAll(
         {'stringTwo': "anotherString", 'intTwo': 84},
       );
   int1 =
       dictionaryB1
-      /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt], [exact=JSString], [exact=JSUInt31]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSNumNotInt], list: Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null), stringTwo: Value([null|exact=JSString], value: "anotherString"), intTwo: [null|exact=JSUInt31]})*/
+      /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {string: Value([exact=JSString|powerset=0], value: "aString", powerset: 0), int: [exact=JSUInt31|powerset=0], double: [exact=JSNumNotInt|powerset=0], list: Container([exact=JSExtendableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0), stringTwo: Value([null|exact=JSString|powerset=1], value: "anotherString", powerset: 1), intTwo: [null|exact=JSUInt31|powerset=1]}, powerset: 0)*/
       ['int'];
   anotherInt1 =
       otherDict1
-      /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSString], [exact=JSUInt31]), map: {stringTwo: Value([exact=JSString], value: "anotherString"), intTwo: [exact=JSUInt31]})*/
+      /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {stringTwo: Value([exact=JSString|powerset=0], value: "anotherString", powerset: 0), intTwo: [exact=JSUInt31|powerset=0]}, powerset: 0)*/
       ['intTwo'];
   dynamic1 =
-      dictionaryA1 /*Map([exact=JsLinkedHashMap], key: [null|subclass=Object], value: [null|subclass=Object])*/ ['int'];
+      dictionaryA1 /*Map([exact=JsLinkedHashMap|powerset=0], key: [null|subclass=Object|powerset=1], value: [null|subclass=Object|powerset=1], powerset: 0)*/ ['int'];
   nullOrInt1 =
       dictionaryB1
-      /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt], [exact=JSString], [exact=JSUInt31]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSNumNotInt], list: Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null), stringTwo: Value([null|exact=JSString], value: "anotherString"), intTwo: [null|exact=JSUInt31]})*/
+      /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {string: Value([exact=JSString|powerset=0], value: "aString", powerset: 0), int: [exact=JSUInt31|powerset=0], double: [exact=JSNumNotInt|powerset=0], list: Container([exact=JSExtendableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0), stringTwo: Value([null|exact=JSString|powerset=1], value: "anotherString", powerset: 1), intTwo: [null|exact=JSUInt31|powerset=1]}, powerset: 0)*/
       ['intTwo'];
 }
 
-/*member: dictionaryA2:Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt], [exact=JSString], [exact=JSUInt31]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSNumNotInt], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+/*member: dictionaryA2:Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {string: Value([exact=JSString|powerset=0], value: "aString", powerset: 0), int: [exact=JSUInt31|powerset=0], double: [exact=JSNumNotInt|powerset=0], list: Container([exact=JSExtendableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)}, powerset: 0)*/
 dynamic dictionaryA2 = {
   'string': "aString",
   'int': 42,
@@ -76,161 +76,161 @@
   'list': [],
 };
 
-/*member: dictionaryB2:Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSString], [exact=JSUInt31]), map: {string: Value([exact=JSString], value: "aString"), intTwo: [exact=JSUInt31], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+/*member: dictionaryB2:Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {string: Value([exact=JSString|powerset=0], value: "aString", powerset: 0), intTwo: [exact=JSUInt31|powerset=0], list: Container([exact=JSExtendableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)}, powerset: 0)*/
 dynamic dictionaryB2 = {'string': "aString", 'intTwo': 42, 'list': []};
 
-/*member: nullOrInt2:[null|exact=JSUInt31]*/
+/*member: nullOrInt2:[null|exact=JSUInt31|powerset=1]*/
 dynamic nullOrInt2 = 0;
 
-/*member: aString2:[exact=JSString]*/
+/*member: aString2:[exact=JSString|powerset=0]*/
 dynamic aString2 = "";
 
-/*member: doubleOrNull2:[null|exact=JSNumNotInt]*/
+/*member: doubleOrNull2:[null|exact=JSNumNotInt|powerset=1]*/
 dynamic doubleOrNull2 = 22.2;
 
-/*member: test2:[null]*/
+/*member: test2:[null|powerset=1]*/
 test2() {
   var union =
       dictionaryA2
-          /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt], [exact=JSString], [exact=JSUInt31]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSNumNotInt], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+          /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {string: Value([exact=JSString|powerset=0], value: "aString", powerset: 0), int: [exact=JSUInt31|powerset=0], double: [exact=JSNumNotInt|powerset=0], list: Container([exact=JSExtendableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)}, powerset: 0)*/
           ['foo']
           ? dictionaryA2
           : dictionaryB2;
   nullOrInt2 =
       union
-      /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt], [exact=JSString], [exact=JSUInt31]), map: {int: [null|exact=JSUInt31], double: [null|exact=JSNumNotInt], string: Value([exact=JSString], value: "aString"), intTwo: [null|exact=JSUInt31], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+      /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {int: [null|exact=JSUInt31|powerset=1], double: [null|exact=JSNumNotInt|powerset=1], string: Value([exact=JSString|powerset=0], value: "aString", powerset: 0), intTwo: [null|exact=JSUInt31|powerset=1], list: Container([exact=JSExtendableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)}, powerset: 0)*/
       ['intTwo'];
   aString2 =
       union
-      /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt], [exact=JSString], [exact=JSUInt31]), map: {int: [null|exact=JSUInt31], double: [null|exact=JSNumNotInt], string: Value([exact=JSString], value: "aString"), intTwo: [null|exact=JSUInt31], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+      /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {int: [null|exact=JSUInt31|powerset=1], double: [null|exact=JSNumNotInt|powerset=1], string: Value([exact=JSString|powerset=0], value: "aString", powerset: 0), intTwo: [null|exact=JSUInt31|powerset=1], list: Container([exact=JSExtendableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)}, powerset: 0)*/
       ['string'];
   doubleOrNull2 =
       union
-      /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt], [exact=JSString], [exact=JSUInt31]), map: {int: [null|exact=JSUInt31], double: [null|exact=JSNumNotInt], string: Value([exact=JSString], value: "aString"), intTwo: [null|exact=JSUInt31], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+      /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {int: [null|exact=JSUInt31|powerset=1], double: [null|exact=JSNumNotInt|powerset=1], string: Value([exact=JSString|powerset=0], value: "aString", powerset: 0), intTwo: [null|exact=JSUInt31|powerset=1], list: Container([exact=JSExtendableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)}, powerset: 0)*/
       ['double'];
 }
 
-/*member: dictionary3:Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt], [exact=JSString], [exact=JSUInt31]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSNumNotInt], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+/*member: dictionary3:Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {string: Value([exact=JSString|powerset=0], value: "aString", powerset: 0), int: [exact=JSUInt31|powerset=0], double: [exact=JSNumNotInt|powerset=0], list: Container([exact=JSExtendableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)}, powerset: 0)*/
 dynamic dictionary3 = {
   'string': "aString",
   'int': 42,
   'double': 21.5,
   'list': [],
 };
-/*member: keyD3:Value([exact=JSString], value: "double")*/
+/*member: keyD3:Value([exact=JSString|powerset=0], value: "double", powerset: 0)*/
 dynamic keyD3 = 'double';
 
-/*member: keyI3:Value([exact=JSString], value: "int")*/
+/*member: keyI3:Value([exact=JSString|powerset=0], value: "int", powerset: 0)*/
 dynamic keyI3 = 'int';
 
-/*member: keyN3:Value([exact=JSString], value: "notFoundInMap")*/
+/*member: keyN3:Value([exact=JSString|powerset=0], value: "notFoundInMap", powerset: 0)*/
 dynamic keyN3 = 'notFoundInMap';
 
-/*member: knownDouble3:[exact=JSNumNotInt]*/
+/*member: knownDouble3:[exact=JSNumNotInt|powerset=0]*/
 dynamic knownDouble3 = 42.2;
 
-/*member: intOrNull3:[null|exact=JSUInt31]*/
+/*member: intOrNull3:[null|exact=JSUInt31|powerset=1]*/
 dynamic intOrNull3 =
     dictionary3
-    /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt], [exact=JSString], [exact=JSUInt31]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSNumNotInt], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+    /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {string: Value([exact=JSString|powerset=0], value: "aString", powerset: 0), int: [exact=JSUInt31|powerset=0], double: [exact=JSNumNotInt|powerset=0], list: Container([exact=JSExtendableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)}, powerset: 0)*/
     [keyI3];
 
-/*member: justNull3:[null]*/
+/*member: justNull3:[null|powerset=1]*/
 dynamic justNull3 =
     dictionary3
-    /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt], [exact=JSString], [exact=JSUInt31]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSNumNotInt], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+    /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {string: Value([exact=JSString|powerset=0], value: "aString", powerset: 0), int: [exact=JSUInt31|powerset=0], double: [exact=JSNumNotInt|powerset=0], list: Container([exact=JSExtendableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)}, powerset: 0)*/
     [keyN3];
 
-/*member: test3:[null]*/
+/*member: test3:[null|powerset=1]*/
 test3() {
   knownDouble3 =
       dictionary3
-      /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt], [exact=JSString], [exact=JSUInt31]), map: {string: Value([exact=JSString], value: "aString"), int: [exact=JSUInt31], double: [exact=JSNumNotInt], list: Container([exact=JSExtendableArray], element: [empty], length: 0)})*/
+      /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {string: Value([exact=JSString|powerset=0], value: "aString", powerset: 0), int: [exact=JSUInt31|powerset=0], double: [exact=JSNumNotInt|powerset=0], list: Container([exact=JSExtendableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)}, powerset: 0)*/
       [keyD3];
   // ignore: unused_local_variable
   var x = [intOrNull3, justNull3];
 }
 
 class A4 {
-  /*member: A4.:[exact=A4]*/
+  /*member: A4.:[exact=A4|powerset=0]*/
   A4();
-  /*member: A4.foo4:[exact=JSUInt31]*/
+  /*member: A4.foo4:[exact=JSUInt31|powerset=0]*/
   foo4(
-    /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSString], [exact=JSUInt31]), map: {anInt: [exact=JSUInt31], aString: Value([exact=JSString], value: "theString")})*/ value,
+    /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {anInt: [exact=JSUInt31|powerset=0], aString: Value([exact=JSString|powerset=0], value: "theString", powerset: 0)}, powerset: 0)*/ value,
   ) {
-    return value /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSString], [exact=JSUInt31]), map: {anInt: [exact=JSUInt31], aString: Value([exact=JSString], value: "theString")})*/ ['anInt'];
+    return value /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {anInt: [exact=JSUInt31|powerset=0], aString: Value([exact=JSString|powerset=0], value: "theString", powerset: 0)}, powerset: 0)*/ ['anInt'];
   }
 }
 
 class B4 {
-  /*member: B4.:[exact=B4]*/
+  /*member: B4.:[exact=B4|powerset=0]*/
   B4();
 
-  /*member: B4.foo4:[exact=JSUInt31]*/
+  /*member: B4.foo4:[exact=JSUInt31|powerset=0]*/
   foo4(
-    /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSString], [exact=JSUInt31]), map: {anInt: [exact=JSUInt31], aString: Value([exact=JSString], value: "theString")})*/ value,
+    /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), map: {anInt: [exact=JSUInt31|powerset=0], aString: Value([exact=JSString|powerset=0], value: "theString", powerset: 0)}, powerset: 0)*/ value,
   ) {
     return 0;
   }
 }
 
-/*member: test4:[null]*/
+/*member: test4:[null|powerset=1]*/
 test4() {
   var dictionary = {'anInt': 42, 'aString': "theString"};
   var it;
   if ([true, false]
-  /*Container([exact=JSExtendableArray], element: [exact=JSBool], length: 2)*/
+  /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSBool|powerset=0], length: 2, powerset: 0)*/
   [0]) {
     it = A4();
   } else {
     it = B4();
   }
   print(
-    it. /*invoke: Union([exact=A4], [exact=B4])*/ foo4(
+    it. /*invoke: Union([exact=A4|powerset=0], [exact=B4|powerset=0], powerset: 0)*/ foo4(
           dictionary,
-        ) /*invoke: [exact=JSUInt31]*/ +
+        ) /*invoke: [exact=JSUInt31|powerset=0]*/ +
         2,
   );
 }
 
-/*member: dict5:Map([null|exact=JsLinkedHashMap], key: [exact=JSString], value: [null|subclass=Object])*/
+/*member: dict5:Map([null|exact=JsLinkedHashMap|powerset=1], key: [exact=JSString|powerset=0], value: [null|subclass=Object|powerset=1], powerset: 1)*/
 dynamic dict5 = makeMap5([1, 2]);
 
-/*member: notInt5:[null|subclass=Object]*/
+/*member: notInt5:[null|subclass=Object|powerset=1]*/
 dynamic notInt5 = 0;
 
-/*member: alsoNotInt5:[null|subclass=Object]*/
+/*member: alsoNotInt5:[null|subclass=Object|powerset=1]*/
 dynamic alsoNotInt5 = 0;
 
-/*member: makeMap5:Map([exact=JsLinkedHashMap], key: [exact=JSString], value: [null|subclass=Object])*/
+/*member: makeMap5:Map([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: [null|subclass=Object|powerset=1], powerset: 0)*/
 makeMap5(
-  /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 2)*/ values,
+  /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 2, powerset: 0)*/ values,
 ) {
   return {
     'moo':
         values
-        /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 2)*/
+        /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 2, powerset: 0)*/
         [0],
     'boo':
         values
-        /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 2)*/
+        /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 2, powerset: 0)*/
         [1],
   };
 }
 
-/*member: test5:[null]*/
+/*member: test5:[null|powerset=1]*/
 test5() {
   dict5
-      /*update: Map([null|exact=JsLinkedHashMap], key: [exact=JSString], value: [null|subclass=Object])*/
+      /*update: Map([null|exact=JsLinkedHashMap|powerset=1], key: [exact=JSString|powerset=0], value: [null|subclass=Object|powerset=1], powerset: 1)*/
       ['goo'] =
       42;
   var closure =
-      /*Map([null|exact=JsLinkedHashMap], key: [exact=JSString], value: [null|subclass=Object])*/
+      /*Map([null|exact=JsLinkedHashMap|powerset=1], key: [exact=JSString|powerset=0], value: [null|subclass=Object|powerset=1], powerset: 1)*/
       () => dict5;
   notInt5 = closure()['boo'];
   alsoNotInt5 =
       dict5
-      /*Map([null|exact=JsLinkedHashMap], key: [exact=JSString], value: [null|subclass=Object])*/
+      /*Map([null|exact=JsLinkedHashMap|powerset=1], key: [exact=JSString|powerset=0], value: [null|subclass=Object|powerset=1], powerset: 1)*/
       ['goo'];
   print("$notInt5 and $alsoNotInt5.");
 }
diff --git a/pkg/compiler/test/inference/data/do.dart b/pkg/compiler/test/inference/data/do.dart
index 3ca816d..6d4bc51 100644
--- a/pkg/compiler/test/inference/data/do.dart
+++ b/pkg/compiler/test/inference/data/do.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   simpleDo();
   doNull();
@@ -16,24 +16,24 @@
 /// Simple int based do-while loop.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: simpleDo:[null]*/
+/*member: simpleDo:[null|powerset=1]*/
 simpleDo() {
   var i = 0;
   do {
-    i = i /*invoke: [subclass=JSPositiveInt]*/ + 1;
-  } while (i /*invoke: [subclass=JSPositiveInt]*/ < 10);
-  i. /*invoke: [subclass=JSPositiveInt]*/ abs();
+    i = i /*invoke: [subclass=JSPositiveInt|powerset=0]*/ + 1;
+  } while (i /*invoke: [subclass=JSPositiveInt|powerset=0]*/ < 10);
+  i. /*invoke: [subclass=JSPositiveInt|powerset=0]*/ abs();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Do-while loop with null test.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: doNull:[exact=JSString]*/
+/*member: doNull:[exact=JSString|powerset=0]*/
 doNull() {
   var o;
   do {
-    o = o. /*invoke: [null|exact=JSString]*/ toString();
+    o = o. /*invoke: [null|exact=JSString|powerset=1]*/ toString();
   } while (o == null);
   return o;
 }
@@ -42,12 +42,12 @@
 /// Do-while loop with not-null test.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: doNotNull:[exact=JSString]*/
+/*member: doNotNull:[exact=JSString|powerset=0]*/
 doNotNull() {
   var o = '';
   do {
-    o = o. /*invoke: [exact=JSString]*/ toString();
-  } while (o /*invoke: [exact=JSString]*/ != null);
+    o = o. /*invoke: [exact=JSString|powerset=0]*/ toString();
+  } while (o /*invoke: [exact=JSString|powerset=0]*/ != null);
   return o;
 }
 
@@ -55,12 +55,12 @@
 /// Do-while loop with null test known to be false.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: doNullFalse:[exact=JSString]*/
+/*member: doNullFalse:[exact=JSString|powerset=0]*/
 doNullFalse() {
   var o = '';
   do {
-    o = o. /*invoke: [exact=JSString]*/ toString();
-  } while (o /*invoke: [exact=JSString]*/ == null);
+    o = o. /*invoke: [exact=JSString|powerset=0]*/ toString();
+  } while (o /*invoke: [exact=JSString|powerset=0]*/ == null);
   return o;
 }
 
@@ -68,11 +68,11 @@
 /// Do-while loop with not-null test known to be true.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: doNotNullTrue:[exact=JSString]*/
+/*member: doNotNullTrue:[exact=JSString|powerset=0]*/
 doNotNullTrue() {
   var o = null;
   do {
-    o = o. /*invoke: [null|exact=JSString]*/ toString();
+    o = o. /*invoke: [null|exact=JSString|powerset=1]*/ toString();
   } while (o != null);
   return o;
 }
@@ -81,31 +81,31 @@
 /// Do-while loop with not-null test that mixes field accesses.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
-  /*member: Class1.field:[null|exact=Class2]*/
+  /*member: Class1.field:[null|exact=Class2|powerset=1]*/
   var field;
 }
 
-/*member: Class2.:[exact=Class2]*/
+/*member: Class2.:[exact=Class2|powerset=0]*/
 class Class2 {
-  /*member: Class2.field:[null|exact=Class1]*/
+  /*member: Class2.field:[null|exact=Class1|powerset=1]*/
   var field;
 }
 
-/*member: _doUnion:Union(null, [exact=Class1], [exact=Class2])*/
-_doUnion(/*[exact=Class1]*/ o) {
+/*member: _doUnion:Union(null, [exact=Class1|powerset=0], [exact=Class2|powerset=0], powerset: 1)*/
+_doUnion(/*[exact=Class1|powerset=0]*/ o) {
   do {
-    o = o. /*Union(null, [exact=Class1], [exact=Class2])*/ field;
+    o = o. /*Union(null, [exact=Class1|powerset=0], [exact=Class2|powerset=0], powerset: 1)*/ field;
   } while (o != null);
   return o;
 }
 
-/*member: doUnion:[null]*/
+/*member: doUnion:[null|powerset=1]*/
 doUnion() {
   var c1 = Class1();
   var c2 = Class2();
-  c1. /*update: [exact=Class1]*/ field = c2;
-  c2. /*update: [exact=Class2]*/ field = c1;
+  c1. /*update: [exact=Class1|powerset=0]*/ field = c2;
+  c2. /*update: [exact=Class2|powerset=0]*/ field = c1;
   _doUnion(c1);
 }
diff --git a/pkg/compiler/test/inference/data/enum.dart b/pkg/compiler/test/inference/data/enum.dart
index 04ba330..f4a9e47 100644
--- a/pkg/compiler/test/inference/data/enum.dart
+++ b/pkg/compiler/test/inference/data/enum.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   enumValue();
   enumIndex();
@@ -17,7 +17,7 @@
 
 enum Enum1 { a }
 
-/*member: enumValue:[exact=Enum1]*/
+/*member: enumValue:[exact=Enum1|powerset=0]*/
 enumValue() => Enum1.a;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -26,8 +26,8 @@
 
 enum Enum2 { a }
 
-/*member: enumIndex:[exact=JSUInt31]*/
-enumIndex() => Enum2.a. /*[exact=Enum2]*/ index;
+/*member: enumIndex:[exact=JSUInt31|powerset=0]*/
+enumIndex() => Enum2.a. /*[exact=Enum2|powerset=0]*/ index;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Access an enum 'values' property.
@@ -35,7 +35,7 @@
 
 enum Enum3 { a, b }
 
-/*member: enumValues:Container([exact=JSUnmodifiableArray], element: [exact=Enum3], length: 2)*/
+/*member: enumValues:Container([exact=JSUnmodifiableArray|powerset=0], element: [exact=Enum3|powerset=0], length: 2, powerset: 0)*/
 enumValues() => Enum3.values;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -44,9 +44,9 @@
 
 enum Enum4 { a }
 
-/*member: enumToString1:[exact=JSString]*/
+/*member: enumToString1:[exact=JSString|powerset=0]*/
 enumToString1() {
-  return Enum4.a. /*invoke: [exact=Enum4]*/ toString();
+  return Enum4.a. /*invoke: [exact=Enum4|powerset=0]*/ toString();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -55,8 +55,8 @@
 
 enum Enum5 { a, b }
 
-/*member: enumToString2:[exact=JSString]*/
+/*member: enumToString2:[exact=JSString|powerset=0]*/
 enumToString2() {
-  Enum5.b. /*invoke: [exact=Enum5]*/ toString();
-  return Enum5.a. /*invoke: [exact=Enum5]*/ toString();
+  Enum5.b. /*invoke: [exact=Enum5|powerset=0]*/ toString();
+  return Enum5.a. /*invoke: [exact=Enum5|powerset=0]*/ toString();
 }
diff --git a/pkg/compiler/test/inference/data/expose_this.dart b/pkg/compiler/test/inference/data/expose_this.dart
index 40e4bcf..c5e94ad 100644
--- a/pkg/compiler/test/inference/data/expose_this.dart
+++ b/pkg/compiler/test/inference/data/expose_this.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   exposeThis1();
   exposeThis2();
@@ -17,24 +17,24 @@
 // Expose this through a top level method invocation.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _method1:[null]*/
-_method1(/*[exact=Class1]*/ o) {}
+/*member: _method1:[null|powerset=1]*/
+_method1(/*[exact=Class1|powerset=0]*/ o) {}
 
 class Class1 {
   // The inferred type of the field includes `null` because `this` has been
   // exposed before its initialization.
-  /*member: Class1.field:[null|exact=JSUInt31]*/
+  /*member: Class1.field:[null|exact=JSUInt31|powerset=1]*/
   var field;
 
-  /*member: Class1.:[exact=Class1]*/
+  /*member: Class1.:[exact=Class1|powerset=0]*/
   Class1() {
     _method1(this);
-    /*update: [exact=Class1]*/
+    /*update: [exact=Class1|powerset=0]*/
     field = 42;
   }
 }
 
-/*member: exposeThis1:[exact=Class1]*/
+/*member: exposeThis1:[exact=Class1|powerset=0]*/
 exposeThis1() => Class1();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -42,22 +42,22 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class2 {
-  /*member: Class2.field:[null|exact=JSUInt31]*/
+  /*member: Class2.field:[null|exact=JSUInt31|powerset=1]*/
   var field;
 
-  /*member: Class2.:[exact=Class2]*/
+  /*member: Class2.:[exact=Class2|powerset=0]*/
   Class2() {
-    /*invoke: [exact=Class2]*/
+    /*invoke: [exact=Class2|powerset=0]*/
     method();
-    /*update: [exact=Class2]*/
+    /*update: [exact=Class2|powerset=0]*/
     field = 42;
   }
 
-  /*member: Class2.method:[null]*/
+  /*member: Class2.method:[null|powerset=1]*/
   method() {}
 }
 
-/*member: exposeThis2:[exact=Class2]*/
+/*member: exposeThis2:[exact=Class2|powerset=0]*/
 exposeThis2() => Class2();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -65,40 +65,40 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class3 {
-  /*member: Class3.field:[exact=JSUInt31]*/
+  /*member: Class3.field:[exact=JSUInt31|powerset=0]*/
   var field;
 
-  /*member: Class3.:[exact=Class3]*/
+  /*member: Class3.:[exact=Class3|powerset=0]*/
   Class3() {
     this;
-    /*update: [exact=Class3]*/
+    /*update: [exact=Class3|powerset=0]*/
     field = 42;
   }
 }
 
-/*member: exposeThis3:[exact=Class3]*/
+/*member: exposeThis3:[exact=Class3|powerset=0]*/
 exposeThis3() => Class3();
 
 ////////////////////////////////////////////////////////////////////////////////
 // Expose this through a static field assignment.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: field1:[null|exact=Class4]*/
+/*member: field1:[null|exact=Class4|powerset=1]*/
 var field1;
 
 class Class4 {
-  /*member: Class4.field:[null|exact=JSUInt31]*/
+  /*member: Class4.field:[null|exact=JSUInt31|powerset=1]*/
   var field;
 
-  /*member: Class4.:[exact=Class4]*/
+  /*member: Class4.:[exact=Class4|powerset=0]*/
   Class4() {
     field1 = this;
-    /*update: [exact=Class4]*/
+    /*update: [exact=Class4|powerset=0]*/
     field = 42;
   }
 }
 
-/*member: exposeThis4:[exact=Class4]*/
+/*member: exposeThis4:[exact=Class4|powerset=0]*/
 exposeThis4() => Class4();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -106,18 +106,18 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class5 {
-  /*member: Class5.field:[null|exact=JSUInt31]*/
+  /*member: Class5.field:[null|exact=JSUInt31|powerset=1]*/
   var field;
 
-  /*member: Class5.:[exact=Class5]*/
-  Class5(/*[null]*/ o) {
-    o. /*update: [null]*/ field5 = this;
-    /*update: [exact=Class5]*/
+  /*member: Class5.:[exact=Class5|powerset=0]*/
+  Class5(/*[null|powerset=1]*/ o) {
+    o. /*update: [null|powerset=1]*/ field5 = this;
+    /*update: [exact=Class5|powerset=0]*/
     field = 42;
   }
 }
 
-/*member: exposeThis5:[exact=Class5]*/
+/*member: exposeThis5:[exact=Class5|powerset=0]*/
 exposeThis5() => Class5(null);
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -125,20 +125,20 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class6 {
-  /*member: Class6.field:[null|exact=JSUInt31]*/
+  /*member: Class6.field:[null|exact=JSUInt31|powerset=1]*/
   var field;
 
-  /*member: Class6.:[exact=Class6]*/
+  /*member: Class6.:[exact=Class6|powerset=0]*/
   Class6() {
     // ignore: UNUSED_LOCAL_VARIABLE
     var o;
     o = this;
-    /*update: [exact=Class6]*/
+    /*update: [exact=Class6|powerset=0]*/
     field = 42;
   }
 }
 
-/*member: exposeThis6:[exact=Class6]*/
+/*member: exposeThis6:[exact=Class6|powerset=0]*/
 exposeThis6() => Class6();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -146,17 +146,17 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class7 {
-  /*member: Class7.field:[null|exact=JSUInt31]*/
+  /*member: Class7.field:[null|exact=JSUInt31|powerset=1]*/
   var field;
 
-  /*member: Class7.:[exact=Class7]*/
+  /*member: Class7.:[exact=Class7|powerset=0]*/
   Class7() {
     // ignore: UNUSED_LOCAL_VARIABLE
     var o = this;
-    /*update: [exact=Class7]*/
+    /*update: [exact=Class7|powerset=0]*/
     field = 42;
   }
 }
 
-/*member: exposeThis7:[exact=Class7]*/
+/*member: exposeThis7:[exact=Class7|powerset=0]*/
 exposeThis7() => Class7();
diff --git a/pkg/compiler/test/inference/data/expose_this_closure.dart b/pkg/compiler/test/inference/data/expose_this_closure.dart
index 9fabc5b..4494b28 100644
--- a/pkg/compiler/test/inference/data/expose_this_closure.dart
+++ b/pkg/compiler/test/inference/data/expose_this_closure.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   exposeThis1();
   exposeThis2();
@@ -17,16 +17,16 @@
 class Class1 {
   // The inferred type of the field does _not_ include `null` because `this`
   // is _not_ been exposed.
-  /*member: Class1.field1:[exact=JSUInt31]*/
+  /*member: Class1.field1:[exact=JSUInt31|powerset=0]*/
   var field1;
-  /*member: Class1.field2:[exact=JSUInt31]*/
+  /*member: Class1.field2:[exact=JSUInt31|powerset=0]*/
   var field2;
 
-  /*member: Class1.:[exact=Class1]*/
+  /*member: Class1.:[exact=Class1|powerset=0]*/
   Class1() : field1 = 42, field2 = 87;
 }
 
-/*member: exposeThis1:[exact=Class1]*/
+/*member: exposeThis1:[exact=Class1|powerset=0]*/
 exposeThis1() => Class1();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -34,21 +34,21 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class2 {
-  /*member: Class2.field1:[exact=JSUInt31]*/
+  /*member: Class2.field1:[exact=JSUInt31|powerset=0]*/
   var field1;
-  /*member: Class2.field2:[exact=JSUInt31]*/
+  /*member: Class2.field2:[exact=JSUInt31|powerset=0]*/
   var field2;
 
-  /*member: Class2.:[exact=Class2]*/
+  /*member: Class2.:[exact=Class2|powerset=0]*/
   Class2() {
-    /*update: [exact=Class2]*/
+    /*update: [exact=Class2|powerset=0]*/
     field1 = 42;
-    /*update: [exact=Class2]*/
+    /*update: [exact=Class2|powerset=0]*/
     field2 = 87;
   }
 }
 
-/*member: exposeThis2:[exact=Class2]*/
+/*member: exposeThis2:[exact=Class2|powerset=0]*/
 exposeThis2() => Class2();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -56,21 +56,21 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class4 {
-  /*member: Class4.field1:[exact=JSUInt31]*/
+  /*member: Class4.field1:[exact=JSUInt31|powerset=0]*/
   var field1;
-  /*member: Class4.field2:[exact=JSUInt31]*/
+  /*member: Class4.field2:[exact=JSUInt31|powerset=0]*/
   var field2;
 
-  /*member: Class4.:[exact=Class4]*/
+  /*member: Class4.:[exact=Class4|powerset=0]*/
   Class4() : field1 = 42, field2 = 87 {
-    /*[exact=JSUInt31]*/
+    /*[exact=JSUInt31|powerset=0]*/
     () {
       return 42;
     };
   }
 }
 
-/*member: exposeThis4:[exact=Class4]*/
+/*member: exposeThis4:[exact=Class4|powerset=0]*/
 exposeThis4() => Class4();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -78,23 +78,23 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class5 {
-  /*member: Class5.field1:[exact=JSUInt31]*/
+  /*member: Class5.field1:[exact=JSUInt31|powerset=0]*/
   var field1;
-  /*member: Class5.field2:[null|exact=JSUInt31]*/
+  /*member: Class5.field2:[null|exact=JSUInt31|powerset=1]*/
   var field2;
 
-  /*member: Class5.:[exact=Class5]*/
+  /*member: Class5.:[exact=Class5|powerset=0]*/
   Class5() {
-    /*update: [exact=Class5]*/
+    /*update: [exact=Class5|powerset=0]*/
     field1 = 42;
-    /*[exact=JSUInt31]*/
+    /*[exact=JSUInt31|powerset=0]*/
     () {
       return 42;
     };
-    /*update: [exact=Class5]*/
+    /*update: [exact=Class5|powerset=0]*/
     field2 = 87;
   }
 }
 
-/*member: exposeThis5:[exact=Class5]*/
+/*member: exposeThis5:[exact=Class5|powerset=0]*/
 exposeThis5() => Class5();
diff --git a/pkg/compiler/test/inference/data/expose_this_field.dart b/pkg/compiler/test/inference/data/expose_this_field.dart
index 120bb8e..4d2709e 100644
--- a/pkg/compiler/test/inference/data/expose_this_field.dart
+++ b/pkg/compiler/test/inference/data/expose_this_field.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   exposeThis1();
   exposeThis2();
@@ -20,17 +20,17 @@
 class Class1 {
   // The inferred type of the field does _not_ include `null` because it has
   // _not_ been read before its initialization.
-  /*member: Class1.field:[exact=JSUInt31]*/
+  /*member: Class1.field:[exact=JSUInt31|powerset=0]*/
   var field;
 
-  /*member: Class1.:[exact=Class1]*/
+  /*member: Class1.:[exact=Class1|powerset=0]*/
   Class1() {
-    /*update: [exact=Class1]*/
+    /*update: [exact=Class1|powerset=0]*/
     field = 42;
   }
 }
 
-/*member: exposeThis1:[exact=Class1]*/
+/*member: exposeThis1:[exact=Class1|powerset=0]*/
 exposeThis1() => Class1();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -40,17 +40,17 @@
 class Class2 {
   // The inferred type of the field includes `null` because it has been read
   // before its initialization.
-  /*member: Class2.field:[null]*/
+  /*member: Class2.field:[null|powerset=1]*/
   var field;
 
-  /*member: Class2.:[exact=Class2]*/
+  /*member: Class2.:[exact=Class2|powerset=0]*/
   Class2() {
-    /*update: [exact=Class2]*/
-    field = /*[exact=Class2]*/ field;
+    /*update: [exact=Class2|powerset=0]*/
+    field = /*[exact=Class2|powerset=0]*/ field;
   }
 }
 
-/*member: exposeThis2:[exact=Class2]*/
+/*member: exposeThis2:[exact=Class2|powerset=0]*/
 exposeThis2() => Class2();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -58,19 +58,19 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class3 {
-  /*member: Class3.field:[null|exact=JSUInt31]*/
+  /*member: Class3.field:[null|exact=JSUInt31|powerset=1]*/
   var field;
 
-  /*member: Class3.:[exact=Class3]*/
+  /*member: Class3.:[exact=Class3|powerset=0]*/
   Class3() {
-    /*update: [exact=Class3]*/
-    field = /*[exact=Class3]*/ field;
-    /*update: [exact=Class3]*/
+    /*update: [exact=Class3|powerset=0]*/
+    field = /*[exact=Class3|powerset=0]*/ field;
+    /*update: [exact=Class3|powerset=0]*/
     field = 42;
   }
 }
 
-/*member: exposeThis3:[exact=Class3]*/
+/*member: exposeThis3:[exact=Class3|powerset=0]*/
 exposeThis3() => Class3();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -78,19 +78,19 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class4 {
-  /*member: Class4.field:[null|exact=JSUInt31]*/
+  /*member: Class4.field:[null|exact=JSUInt31|powerset=1]*/
   var field;
 
-  /*member: Class4.:[exact=Class4]*/
+  /*member: Class4.:[exact=Class4|powerset=0]*/
   Class4() {
     // ignore: UNUSED_LOCAL_VARIABLE
-    var o = /*[exact=Class4]*/ field;
-    /*update: [exact=Class4]*/
+    var o = /*[exact=Class4|powerset=0]*/ field;
+    /*update: [exact=Class4|powerset=0]*/
     field = 42;
   }
 }
 
-/*member: exposeThis4:[exact=Class4]*/
+/*member: exposeThis4:[exact=Class4|powerset=0]*/
 exposeThis4() => Class4();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -98,19 +98,19 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class5 {
-  /*member: Class5.field:[null|subclass=JSPositiveInt]*/
+  /*member: Class5.field:[null|subclass=JSPositiveInt|powerset=1]*/
   var field;
 
-  /*member: Class5.:[exact=Class5]*/
+  /*member: Class5.:[exact=Class5|powerset=0]*/
   Class5() {
-    /*[exact=Class5]*/ /*update: [exact=Class5]*/
-    field /*invoke: [null|subclass=JSPositiveInt]*/ ++;
-    /*update: [exact=Class5]*/
+    /*[exact=Class5|powerset=0]*/ /*update: [exact=Class5|powerset=0]*/
+    field /*invoke: [null|subclass=JSPositiveInt|powerset=1]*/ ++;
+    /*update: [exact=Class5|powerset=0]*/
     field = 42;
   }
 }
 
-/*member: exposeThis5:[exact=Class5]*/
+/*member: exposeThis5:[exact=Class5|powerset=0]*/
 exposeThis5() => Class5();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -118,19 +118,19 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class6 {
-  /*member: Class6.field:[subclass=JSPositiveInt]*/
+  /*member: Class6.field:[subclass=JSPositiveInt|powerset=0]*/
   var field;
 
-  /*member: Class6.:[exact=Class6]*/
+  /*member: Class6.:[exact=Class6|powerset=0]*/
   Class6() {
-    /*update: [exact=Class6]*/
+    /*update: [exact=Class6|powerset=0]*/
     field = 42;
-    /*[exact=Class6]*/ /*update: [exact=Class6]*/
-    field /*invoke: [subclass=JSPositiveInt]*/ ++;
+    /*[exact=Class6|powerset=0]*/ /*update: [exact=Class6|powerset=0]*/
+    field /*invoke: [subclass=JSPositiveInt|powerset=0]*/ ++;
   }
 }
 
-/*member: exposeThis6:[exact=Class6]*/
+/*member: exposeThis6:[exact=Class6|powerset=0]*/
 exposeThis6() => Class6();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -138,24 +138,24 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class7 {
-  /*member: Class7.field1:[null|exact=JSUInt31]*/
+  /*member: Class7.field1:[null|exact=JSUInt31|powerset=1]*/
   var field1;
 
-  /*member: Class7.field2:[null|exact=JSUInt31]*/
+  /*member: Class7.field2:[null|exact=JSUInt31|powerset=1]*/
   var field2;
 
-  /*member: Class7.:[exact=Class7]*/
+  /*member: Class7.:[exact=Class7|powerset=0]*/
   Class7() {
     // ignore: UNUSED_LOCAL_VARIABLE
-    var o1 = /*[exact=Class7]*/ field1;
+    var o1 = /*[exact=Class7|powerset=0]*/ field1;
     // ignore: UNUSED_LOCAL_VARIABLE
-    var o2 = /*[exact=Class7]*/ field2;
-    /*update: [exact=Class7]*/
+    var o2 = /*[exact=Class7|powerset=0]*/ field2;
+    /*update: [exact=Class7|powerset=0]*/
     field1 = 42;
-    /*update: [exact=Class7]*/
+    /*update: [exact=Class7|powerset=0]*/
     field2 = 87;
   }
 }
 
-/*member: exposeThis7:[exact=Class7]*/
+/*member: exposeThis7:[exact=Class7|powerset=0]*/
 exposeThis7() => Class7();
diff --git a/pkg/compiler/test/inference/data/expose_this_mask.dart b/pkg/compiler/test/inference/data/expose_this_mask.dart
index 88560c1..2f0cefa 100644
--- a/pkg/compiler/test/inference/data/expose_this_mask.dart
+++ b/pkg/compiler/test/inference/data/expose_this_mask.dart
@@ -5,7 +5,7 @@
 /// Check that exposure of this is correctly restricted through the receiver
 /// mask.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   otherGetter();
   otherMethod();
@@ -23,27 +23,27 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class1 {
-  /*member: Class1.field1a:[exact=JSUInt31]*/
+  /*member: Class1.field1a:[exact=JSUInt31|powerset=0]*/
   var field1a;
-  /*member: Class1.field1b:[exact=JSUInt31]*/
+  /*member: Class1.field1b:[exact=JSUInt31|powerset=0]*/
   var field1b;
 
-  /*member: Class1.:[exact=Class1]*/
+  /*member: Class1.:[exact=Class1|powerset=0]*/
   Class1() : field1a = 42 {
-    /*update: [exact=Class1]*/
-    field1b = /*[exact=Class1]*/ field1a;
+    /*update: [exact=Class1|powerset=0]*/
+    field1b = /*[exact=Class1|powerset=0]*/ field1a;
   }
 }
 
-/*member: OtherClass1.:[exact=OtherClass1]*/
+/*member: OtherClass1.:[exact=OtherClass1|powerset=0]*/
 class OtherClass1 {
-  /*member: OtherClass1.field1a:[null]*/
+  /*member: OtherClass1.field1a:[null|powerset=1]*/
   get field1a => null;
 }
 
-/*member: otherGetter:[null]*/
+/*member: otherGetter:[null|powerset=1]*/
 otherGetter() {
-  OtherClass1(). /*[exact=OtherClass1]*/ field1a;
+  OtherClass1(). /*[exact=OtherClass1|powerset=0]*/ field1a;
   Class1();
 }
 
@@ -52,27 +52,27 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class2 {
-  /*member: Class2.field2a:[exact=JSUInt31]*/
+  /*member: Class2.field2a:[exact=JSUInt31|powerset=0]*/
   var field2a;
-  /*member: Class2.field2b:[exact=JSUInt31]*/
+  /*member: Class2.field2b:[exact=JSUInt31|powerset=0]*/
   var field2b;
 
-  /*member: Class2.:[exact=Class2]*/
+  /*member: Class2.:[exact=Class2|powerset=0]*/
   Class2() : field2a = 42 {
-    /*update: [exact=Class2]*/
-    field2b = /*[exact=Class2]*/ field2a;
+    /*update: [exact=Class2|powerset=0]*/
+    field2b = /*[exact=Class2|powerset=0]*/ field2a;
   }
 }
 
-/*member: OtherClass2.:[exact=OtherClass2]*/
+/*member: OtherClass2.:[exact=OtherClass2|powerset=0]*/
 class OtherClass2 {
-  /*member: OtherClass2.field2a:[null]*/
+  /*member: OtherClass2.field2a:[null|powerset=1]*/
   field2a() {}
 }
 
-/*member: otherMethod:[null]*/
+/*member: otherMethod:[null|powerset=1]*/
 otherMethod() {
-  OtherClass2(). /*[exact=OtherClass2]*/ field2a;
+  OtherClass2(). /*[exact=OtherClass2|powerset=0]*/ field2a;
   Class2();
 }
 
@@ -81,25 +81,25 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class3 {
-  /*member: Class3.field3a:[exact=JSUInt31]*/
+  /*member: Class3.field3a:[exact=JSUInt31|powerset=0]*/
   var field3a;
-  /*member: Class3.field3b:[exact=JSUInt31]*/
+  /*member: Class3.field3b:[exact=JSUInt31|powerset=0]*/
   var field3b;
 
-  /*member: Class3.:[exact=Class3]*/
+  /*member: Class3.:[exact=Class3|powerset=0]*/
   Class3() : field3a = 42 {
-    /*update: [exact=Class3]*/
-    field3b = /*[exact=Class3]*/ field3a;
+    /*update: [exact=Class3|powerset=0]*/
+    field3b = /*[exact=Class3|powerset=0]*/ field3a;
   }
 }
 
-/*member: OtherClass3.:[exact=OtherClass3]*/
+/*member: OtherClass3.:[exact=OtherClass3|powerset=0]*/
 class OtherClass3 {
-  /*member: OtherClass3.field3a:[null]*/
+  /*member: OtherClass3.field3a:[null|powerset=1]*/
   var field3a;
 }
 
-/*member: otherField:[null]*/
+/*member: otherField:[null|powerset=1]*/
 otherField() {
   OtherClass3();
   Class3();
@@ -109,26 +109,26 @@
 // Read a field when a field in the superclass has the same name.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: SuperClass5.:[exact=SuperClass5]*/
+/*member: SuperClass5.:[exact=SuperClass5|powerset=0]*/
 class SuperClass5 {
-  /*member: SuperClass5.field5a:[null|exact=JSUInt31]*/
+  /*member: SuperClass5.field5a:[null|exact=JSUInt31|powerset=1]*/
   var field5a;
 }
 
 class Class5 extends SuperClass5 {
-  /*member: Class5.field5a:[null|exact=JSUInt31]*/
+  /*member: Class5.field5a:[null|exact=JSUInt31|powerset=1]*/
   var field5a;
-  /*member: Class5.field5b:[null|exact=JSUInt31]*/
+  /*member: Class5.field5b:[null|exact=JSUInt31|powerset=1]*/
   var field5b;
 
-  /*member: Class5.:[exact=Class5]*/
+  /*member: Class5.:[exact=Class5|powerset=0]*/
   Class5() : field5a = 42 {
-    /*update: [exact=Class5]*/
-    field5b = /*[exact=Class5]*/ field5a;
+    /*update: [exact=Class5|powerset=0]*/
+    field5b = /*[exact=Class5|powerset=0]*/ field5a;
   }
 }
 
-/*member: superclassField:[null]*/
+/*member: superclassField:[null|powerset=1]*/
 superclassField() {
   SuperClass5();
   Class5();
@@ -139,27 +139,27 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class4 {
-  /*member: Class4.field4a:[null|exact=JSUInt31]*/
+  /*member: Class4.field4a:[null|exact=JSUInt31|powerset=1]*/
   var field4a;
-  /*member: Class4.field4b:[null|exact=JSUInt31]*/
+  /*member: Class4.field4b:[null|exact=JSUInt31|powerset=1]*/
   var field4b;
 
-  /*member: Class4.:[exact=Class4]*/
+  /*member: Class4.:[exact=Class4|powerset=0]*/
   Class4() : field4a = 42 {
-    /*update: [subclass=Class4]*/
-    field4b = /*[subclass=Class4]*/ field4a;
+    /*update: [subclass=Class4|powerset=0]*/
+    field4b = /*[subclass=Class4|powerset=0]*/ field4a;
   }
 }
 
 class SubClass4 extends Class4 {
-  /*member: SubClass4.field4a:[null|exact=JSUInt31]*/
+  /*member: SubClass4.field4a:[null|exact=JSUInt31|powerset=1]*/
   var field4a;
 
-  /*member: SubClass4.:[exact=SubClass4]*/
+  /*member: SubClass4.:[exact=SubClass4|powerset=0]*/
   SubClass4() : field4a = 42;
 }
 
-/*member: subclassFieldRead:[null]*/
+/*member: subclassFieldRead:[null|powerset=1]*/
 subclassFieldRead() {
   Class4();
   SubClass4();
@@ -170,33 +170,33 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class6 {
-  /*member: Class6.field6a:[exact=JSUInt31]*/
+  /*member: Class6.field6a:[exact=JSUInt31|powerset=0]*/
   var field6a;
-  /*member: Class6.field6b:[null|exact=JSUInt31]*/
+  /*member: Class6.field6b:[null|exact=JSUInt31|powerset=1]*/
   var field6b;
 
-  /*member: Class6.:[exact=Class6]*/
+  /*member: Class6.:[exact=Class6|powerset=0]*/
   Class6() : field6a = 42 {
-    /*update: [subclass=Class6]*/
-    field6b = /*[subclass=Class6]*/ field6a;
+    /*update: [subclass=Class6|powerset=0]*/
+    field6b = /*[subclass=Class6|powerset=0]*/ field6a;
   }
 }
 
 class SubClass6 extends Class6 {
-  /*member: SubClass6.field6b:[null|exact=JSUInt31]*/
+  /*member: SubClass6.field6b:[null|exact=JSUInt31|powerset=1]*/
   var field6b;
 
-  /*member: SubClass6.:[exact=SubClass6]*/
+  /*member: SubClass6.:[exact=SubClass6|powerset=0]*/
   SubClass6() : field6b = 42;
 
-  /*member: SubClass6.access:[null|exact=JSUInt31]*/
+  /*member: SubClass6.access:[null|exact=JSUInt31|powerset=1]*/
   get access => super.field6b;
 }
 
-/*member: subclassFieldWrite:[null|exact=JSUInt31]*/
+/*member: subclassFieldWrite:[null|exact=JSUInt31|powerset=1]*/
 subclassFieldWrite() {
   Class6();
-  return SubClass6(). /*[exact=SubClass6]*/ access;
+  return SubClass6(). /*[exact=SubClass6|powerset=0]*/ access;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -205,37 +205,37 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class9 {
-  /*member: Class9.field9a:[exact=JSUInt31]*/
+  /*member: Class9.field9a:[exact=JSUInt31|powerset=0]*/
   var field9a;
-  /*member: Class9.field9b:[null|exact=JSUInt31]*/
+  /*member: Class9.field9b:[null|exact=JSUInt31|powerset=1]*/
   var field9b;
 
-  /*member: Class9.:[exact=Class9]*/
+  /*member: Class9.:[exact=Class9|powerset=0]*/
   Class9() : field9a = 42 {
-    /*update: [subclass=Class9]*/
-    field9b = /*[subclass=Class9]*/ field9a;
+    /*update: [subclass=Class9|powerset=0]*/
+    field9b = /*[subclass=Class9|powerset=0]*/ field9a;
   }
 }
 
 class SubClass9a extends Class9 {
-  /*member: SubClass9a.field9b:[null|exact=JSUInt31]*/
+  /*member: SubClass9a.field9b:[null|exact=JSUInt31|powerset=1]*/
   var field9b;
 
-  /*member: SubClass9a.:[exact=SubClass9a]*/
+  /*member: SubClass9a.:[exact=SubClass9a|powerset=0]*/
   SubClass9a() : field9b = 42;
 
-  /*member: SubClass9a.access:[null|exact=JSUInt31]*/
+  /*member: SubClass9a.access:[null|exact=JSUInt31|powerset=1]*/
   get access => super.field9b;
 }
 
-/*member: SubClass9b.:[exact=SubClass9b]*/
+/*member: SubClass9b.:[exact=SubClass9b|powerset=0]*/
 class SubClass9b extends Class9 {}
 
-/*member: subclassesFieldWrite:[null|exact=JSUInt31]*/
+/*member: subclassesFieldWrite:[null|exact=JSUInt31|powerset=1]*/
 subclassesFieldWrite() {
   Class9();
   SubClass9b();
-  return SubClass9a(). /*[exact=SubClass9a]*/ access;
+  return SubClass9a(). /*[exact=SubClass9a|powerset=0]*/ access;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -243,26 +243,28 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class7 {
-  /*member: Class7.field7a:[exact=JSUInt31]*/
+  /*member: Class7.field7a:[exact=JSUInt31|powerset=0]*/
   var field7a;
-  /*member: Class7.field7b:[null|exact=JSUInt31]*/
+  /*member: Class7.field7b:[null|exact=JSUInt31|powerset=1]*/
   var field7b;
 
-  /*member: Class7.:[exact=Class7]*/
+  /*member: Class7.:[exact=Class7|powerset=0]*/
   Class7() : field7a = 42 {
-    field7b /*invoke: [subclass=Class7]*/ (/*[subclass=Class7]*/ field7a);
+    field7b /*invoke: [subclass=Class7|powerset=0]*/ (
+      /*[subclass=Class7|powerset=0]*/ field7a,
+    );
   }
 }
 
 class SubClass7 extends Class7 {
-  /*member: SubClass7.field7b:[null|exact=JSUInt31]*/
+  /*member: SubClass7.field7b:[null|exact=JSUInt31|powerset=1]*/
   var field7b;
 
-  /*member: SubClass7.:[exact=SubClass7]*/
+  /*member: SubClass7.:[exact=SubClass7|powerset=0]*/
   SubClass7() : field7b = 42;
 }
 
-/*member: subclassFieldInvoke:[null]*/
+/*member: subclassFieldInvoke:[null|powerset=1]*/
 subclassFieldInvoke() {
   Class7();
   SubClass7();
@@ -273,34 +275,34 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 abstract class Class8 {
-  /*member: Class8.field8:[null|exact=JSUInt31]*/
+  /*member: Class8.field8:[null|exact=JSUInt31|powerset=1]*/
   var field8;
 
-  /*member: Class8.:[subclass=Class8]*/
+  /*member: Class8.:[subclass=Class8|powerset=0]*/
   Class8() {
-    /*invoke: [subclass=Class8]*/
+    /*invoke: [subclass=Class8|powerset=0]*/
     method8();
   }
 
   method8();
 }
 
-/*member: SubClass8a.:[exact=SubClass8a]*/
+/*member: SubClass8a.:[exact=SubClass8a|powerset=0]*/
 class SubClass8a extends Class8 {
-  /*member: SubClass8a.method8:[null]*/
+  /*member: SubClass8a.method8:[null|powerset=1]*/
   method8() {
-    /*update: [exact=SubClass8a]*/
+    /*update: [exact=SubClass8a|powerset=0]*/
     field8 = 42;
   }
 }
 
-/*member: SubClass8b.:[exact=SubClass8b]*/
+/*member: SubClass8b.:[exact=SubClass8b|powerset=0]*/
 class SubClass8b extends Class8 {
-  /*member: SubClass8b.method8:[null]*/
+  /*member: SubClass8b.method8:[null|powerset=1]*/
   method8() {}
 }
 
-/*member: subclassFieldSet:[null]*/
+/*member: subclassFieldSet:[null|powerset=1]*/
 subclassFieldSet() {
   SubClass8a();
   SubClass8b();
diff --git a/pkg/compiler/test/inference/data/expose_this_super.dart b/pkg/compiler/test/inference/data/expose_this_super.dart
index d021ae4..5c57e4d 100644
--- a/pkg/compiler/test/inference/data/expose_this_super.dart
+++ b/pkg/compiler/test/inference/data/expose_this_super.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   exposeThis1();
   exposeThis2();
@@ -14,102 +14,102 @@
 // Expose this through super invocation.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Super1.:[exact=Class1]*/
+/*member: Super1.:[exact=Class1|powerset=0]*/
 abstract class Super1 {
-  /*member: Super1.method:[null]*/
+  /*member: Super1.method:[null|powerset=1]*/
   method() {}
 }
 
 class Class1 extends Super1 {
   // The inferred type of the field includes `null` because `this` has been
   // exposed before its initialization.
-  /*member: Class1.field:[null|exact=JSUInt31]*/
+  /*member: Class1.field:[null|exact=JSUInt31|powerset=1]*/
   var field;
 
-  /*member: Class1.:[exact=Class1]*/
+  /*member: Class1.:[exact=Class1|powerset=0]*/
   Class1() {
     super.method();
-    /*update: [exact=Class1]*/
+    /*update: [exact=Class1|powerset=0]*/
     field = 42;
   }
 }
 
-/*member: exposeThis1:[exact=Class1]*/
+/*member: exposeThis1:[exact=Class1|powerset=0]*/
 exposeThis1() => Class1();
 
 ////////////////////////////////////////////////////////////////////////////////
 // Expose this through super access.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Super2.:[exact=Class2]*/
+/*member: Super2.:[exact=Class2|powerset=0]*/
 abstract class Super2 {
-  /*member: Super2.getter:[null]*/
+  /*member: Super2.getter:[null|powerset=1]*/
   get getter => null;
 }
 
 class Class2 extends Super2 {
-  /*member: Class2.field:[null|exact=JSUInt31]*/
+  /*member: Class2.field:[null|exact=JSUInt31|powerset=1]*/
   var field;
 
-  /*member: Class2.:[exact=Class2]*/
+  /*member: Class2.:[exact=Class2|powerset=0]*/
   Class2() {
     super.getter;
-    /*update: [exact=Class2]*/
+    /*update: [exact=Class2|powerset=0]*/
     field = 42;
   }
 }
 
-/*member: exposeThis2:[exact=Class2]*/
+/*member: exposeThis2:[exact=Class2|powerset=0]*/
 exposeThis2() => Class2();
 
 ////////////////////////////////////////////////////////////////////////////////
 // Expose this through super access.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Super3.:[exact=Class3]*/
+/*member: Super3.:[exact=Class3|powerset=0]*/
 abstract class Super3 {
-  set setter(/*[null]*/ o) {}
+  set setter(/*[null|powerset=1]*/ o) {}
 }
 
 class Class3 extends Super3 {
-  /*member: Class3.field:[null|exact=JSUInt31]*/
+  /*member: Class3.field:[null|exact=JSUInt31|powerset=1]*/
   var field;
 
-  /*member: Class3.:[exact=Class3]*/
+  /*member: Class3.:[exact=Class3|powerset=0]*/
   Class3() {
     super.setter = null;
-    /*update: [exact=Class3]*/
+    /*update: [exact=Class3|powerset=0]*/
     field = 42;
   }
 }
 
-/*member: exposeThis3:[exact=Class3]*/
+/*member: exposeThis3:[exact=Class3|powerset=0]*/
 exposeThis3() => Class3();
 
 ////////////////////////////////////////////////////////////////////////////////
 // Expose this in the constructor of a super class.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: field4:[null|exact=Class4]*/
+/*member: field4:[null|exact=Class4|powerset=1]*/
 var field4;
 
 abstract class Super4 {
-  /*member: Super4.:[exact=Class4]*/
+  /*member: Super4.:[exact=Class4|powerset=0]*/
   Super4() {
     field4 = this;
   }
 }
 
 class Class4 extends Super4 {
-  /*member: Class4.field:[null|exact=JSUInt31]*/
+  /*member: Class4.field:[null|exact=JSUInt31|powerset=1]*/
   var field;
 
-  /*member: Class4.:[exact=Class4]*/
+  /*member: Class4.:[exact=Class4|powerset=0]*/
   Class4() {
-    /*update: [exact=Class4]*/
+    /*update: [exact=Class4|powerset=0]*/
     field = 42;
   }
 }
 
-/*member: exposeThis4:[exact=Class4]*/
+/*member: exposeThis4:[exact=Class4|powerset=0]*/
 exposeThis4() => Class4();
diff --git a/pkg/compiler/test/inference/data/factory.dart b/pkg/compiler/test/inference/data/factory.dart
index da7f9a2..f91b6cd 100644
--- a/pkg/compiler/test/inference/data/factory.dart
+++ b/pkg/compiler/test/inference/data/factory.dart
@@ -3,33 +3,33 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class A {
-  /*member: A.generative:[exact=A]*/
+  /*member: A.generative:[exact=A|powerset=0]*/
   A.generative();
 
   factory A.redirect() = B;
 
-  /*member: A.fact:[exact=C]*/
+  /*member: A.fact:[exact=C|powerset=0]*/
   factory A.fact() => C();
 }
 
-/*member: B.:[exact=B]*/
+/*member: B.:[exact=B|powerset=0]*/
 class B implements A {}
 
-/*member: C.:[exact=C]*/
+/*member: C.:[exact=C|powerset=0]*/
 class C implements A {}
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   createGenerative();
   createRedirecting();
   createFactory();
 }
 
-/*member: createGenerative:[exact=A]*/
+/*member: createGenerative:[exact=A|powerset=0]*/
 createGenerative() => A.generative();
 
-/*member: createRedirecting:[exact=B]*/
+/*member: createRedirecting:[exact=B|powerset=0]*/
 createRedirecting() => A.redirect();
 
-/*member: createFactory:[exact=C]*/
+/*member: createFactory:[exact=C|powerset=0]*/
 createFactory() => A.fact();
diff --git a/pkg/compiler/test/inference/data/field_type.dart b/pkg/compiler/test/inference/data/field_type.dart
index a542ceb..f2417c4 100644
--- a/pkg/compiler/test/inference/data/field_type.dart
+++ b/pkg/compiler/test/inference/data/field_type.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   test1();
   test2();
@@ -36,314 +36,315 @@
   test30();
 }
 
-/*member: A1.:[exact=A1]*/
+/*member: A1.:[exact=A1|powerset=0]*/
 class A1 {
-  /*member: A1.f1:[null]*/
+  /*member: A1.f1:[null|powerset=1]*/
   int? f1;
 }
 
-/*member: test1:[null]*/
+/*member: test1:[null|powerset=1]*/
 test1() {
   A1();
 }
 
-/*member: A2.:[exact=A2]*/
+/*member: A2.:[exact=A2|powerset=0]*/
 class A2 {
-  /*member: A2.f2a:[null]*/
+  /*member: A2.f2a:[null|powerset=1]*/
   int? f2a;
 
-  /*member: A2.f2b:[exact=JSUInt31]*/
+  /*member: A2.f2b:[exact=JSUInt31|powerset=0]*/
   int f2b = 1;
 }
 
-/*member: test2:[null]*/
+/*member: test2:[null|powerset=1]*/
 test2() {
   A2();
 }
 
 class A3 {
-  /*member: A3.f3a:[exact=JSUInt31]*/
+  /*member: A3.f3a:[exact=JSUInt31|powerset=0]*/
   int f3a;
 
-  /*member: A3.f3b:[null|exact=JSUInt31]*/
+  /*member: A3.f3b:[null|exact=JSUInt31|powerset=1]*/
   int? f3b;
 
-  /*member: A3.:[exact=A3]*/
+  /*member: A3.:[exact=A3|powerset=0]*/
   A3() : f3a = 1;
 }
 
-/*member: test3:[null]*/
+/*member: test3:[null|powerset=1]*/
 test3() {
-  A3(). /*update: [exact=A3]*/ f3b = 2;
+  A3(). /*update: [exact=A3|powerset=0]*/ f3b = 2;
 }
 
 class A4 {
-  /*member: A4.f4a:Union([exact=JSString], [exact=JSUInt31])*/
+  /*member: A4.f4a:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
   dynamic f4a;
 
-  /*member: A4.f4b:Value([null|exact=JSString], value: "a")*/
+  /*member: A4.f4b:Value([null|exact=JSString|powerset=1], value: "a", powerset: 1)*/
   dynamic f4b;
 
-  /*member: A4.:[exact=A4]*/
+  /*member: A4.:[exact=A4|powerset=0]*/
   A4() : f4a = 1;
 }
 
-/*member: test4:[null]*/
+/*member: test4:[null|powerset=1]*/
 test4() {
   A4 a = A4();
-  a. /*update: [exact=A4]*/ f4a = "a";
-  a. /*update: [exact=A4]*/ f4b = "a";
+  a. /*update: [exact=A4|powerset=0]*/ f4a = "a";
+  a. /*update: [exact=A4|powerset=0]*/ f4b = "a";
 }
 
 class A5 {
-  /*member: A5.f5a:Union([exact=JSString], [exact=JSUInt31])*/
+  /*member: A5.f5a:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
   dynamic f5a = 1;
 
-  /*member: A5.f5b:Union([exact=JSString], [exact=JSUInt31])*/
+  /*member: A5.f5b:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
   dynamic f5b = 1;
 
-  /*member: A5.:[exact=A5]*/
-  A5(/*[exact=JSBool]*/ x) {
-    /*update: [exact=A5]*/
+  /*member: A5.:[exact=A5|powerset=0]*/
+  A5(/*[exact=JSBool|powerset=0]*/ x) {
+    /*update: [exact=A5|powerset=0]*/
     f5a = "1";
     if (x) {
-      /*update: [exact=A5]*/
+      /*update: [exact=A5|powerset=0]*/
       f5b = "1";
     } else {
-      /*update: [exact=A5]*/
+      /*update: [exact=A5|powerset=0]*/
       f5b = "2";
     }
   }
 }
 
-/*member: test5:[null]*/
+/*member: test5:[null|powerset=1]*/
 test5() {
   A5(true);
   A5(false);
 }
 
 class A6 {
-  /*member: A6.f6a:Union([exact=JSString], [exact=JSUInt31])*/
+  /*member: A6.f6a:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
   dynamic f6a = 1;
 
-  /*member: A6.f6b:Union([exact=JSExtendableArray], [exact=JSString], [exact=JSUInt31])*/
+  /*member: A6.f6b:Union([exact=JSExtendableArray|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
   dynamic f6b = 1;
 
-  /*member: A6.:[exact=A6]*/
-  A6(/*[exact=JSBool]*/ x) {
-    /*update: [exact=A6]*/
+  /*member: A6.:[exact=A6|powerset=0]*/
+  A6(/*[exact=JSBool|powerset=0]*/ x) {
+    /*update: [exact=A6|powerset=0]*/
     f6a = "1";
     if (x) {
-      /*update: [exact=A6]*/
+      /*update: [exact=A6|powerset=0]*/
       f6b = "1";
     } else {
-      /*update: [exact=A6]*/
+      /*update: [exact=A6|powerset=0]*/
       f6b = "2";
     }
     if (x) {
-      /*update: [exact=A6]*/
+      /*update: [exact=A6|powerset=0]*/
       f6b = [];
     } else {
-      /*update: [exact=A6]*/
+      /*update: [exact=A6|powerset=0]*/
       f6b = [];
     }
   }
 }
 
-/*member: test6:[null]*/
+/*member: test6:[null|powerset=1]*/
 test6() {
   A6(true);
   A6(false);
 }
 
 class A7 {
-  /*member: A7.f7a:Union([exact=JSExtendableArray], [exact=JSString], [exact=JSUInt31])*/
+  /*member: A7.f7a:Union([exact=JSExtendableArray|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
   dynamic f7a = 1;
 
-  /*member: A7.f7b:Union([exact=JSExtendableArray], [exact=JSString], [exact=JSUInt31])*/
+  /*member: A7.f7b:Union([exact=JSExtendableArray|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
   dynamic f7b = 1;
 
-  /*member: A7.:[exact=A7]*/
-  A7(/*[exact=JSBool]*/ x) {
-    /*update: [exact=A7]*/
+  /*member: A7.:[exact=A7|powerset=0]*/
+  A7(/*[exact=JSBool|powerset=0]*/ x) {
+    /*update: [exact=A7|powerset=0]*/
     f7a = "1";
     if (x) {
-      /*update: [exact=A7]*/
+      /*update: [exact=A7|powerset=0]*/
       f7b = "1";
     } else {
-      /*update: [exact=A7]*/
+      /*update: [exact=A7|powerset=0]*/
       f7b = "2";
     }
     if (x) {
-      /*update: [exact=A7]*/
+      /*update: [exact=A7|powerset=0]*/
       f7a = [];
-      /*update: [exact=A7]*/
+      /*update: [exact=A7|powerset=0]*/
       f7b = [];
     } else {
-      /*update: [exact=A7]*/
+      /*update: [exact=A7|powerset=0]*/
       f7b = [];
     }
   }
 }
 
-/*member: test7:[null]*/
+/*member: test7:[null|powerset=1]*/
 test7() {
   A7(true);
   A7(false);
 }
 
 class A8 {
-  /*member: A8.f8:Value([null|exact=JSString], value: "1")*/
+  /*member: A8.f8:Value([null|exact=JSString|powerset=1], value: "1", powerset: 1)*/
   dynamic f8;
 
-  /*member: A8.:[exact=A8]*/
-  A8(/*[exact=JSBool]*/ x) {
+  /*member: A8.:[exact=A8|powerset=0]*/
+  A8(/*[exact=JSBool|powerset=0]*/ x) {
     if (x) {
-      /*update: [exact=A8]*/
+      /*update: [exact=A8|powerset=0]*/
       f8 = "1";
     } else {}
   }
 }
 
-/*member: test8:[null]*/
+/*member: test8:[null|powerset=1]*/
 test8() {
   A8(true);
   A8(false);
 }
 
 class A9 {
-  /*member: A9.f9:Value([null|exact=JSString], value: "1")*/
+  /*member: A9.f9:Value([null|exact=JSString|powerset=1], value: "1", powerset: 1)*/
   dynamic f9;
 
-  /*member: A9.:[exact=A9]*/
-  A9(/*[exact=JSBool]*/ x) {
+  /*member: A9.:[exact=A9|powerset=0]*/
+  A9(/*[exact=JSBool|powerset=0]*/ x) {
     if (x) {
     } else {
-      /*update: [exact=A9]*/
+      /*update: [exact=A9|powerset=0]*/
       f9 = "1";
     }
   }
 }
 
-/*member: test9:[null]*/
+/*member: test9:[null|powerset=1]*/
 test9() {
   A9(true);
   A9(false);
 }
 
 class A10 {
-  /*member: A10.f10:[exact=JSUInt31]*/
+  /*member: A10.f10:[exact=JSUInt31|powerset=0]*/
   int? f10;
 
-  /*member: A10.:[exact=A10]*/
+  /*member: A10.:[exact=A10|powerset=0]*/
   A10() {
-    /*update: [exact=A10]*/
+    /*update: [exact=A10|powerset=0]*/
     f10 = 1;
   }
-  /*member: A10.m10:[subclass=JSUInt32]*/
-  m10() => /*[exact=A10]*/ f10! /*invoke: [exact=JSUInt31]*/ + 1;
+  /*member: A10.m10:[subclass=JSUInt32|powerset=0]*/
+  m10() => /*[exact=A10|powerset=0]*/
+      f10! /*invoke: [exact=JSUInt31|powerset=0]*/ + 1;
 }
 
-/*member: f10:[null]*/
-void f10(/*[null]*/ x) {
-  x. /*update: [null]*/ f10 = "2";
+/*member: f10:[null|powerset=1]*/
+void f10(/*[null|powerset=1]*/ x) {
+  x. /*update: [null|powerset=1]*/ f10 = "2";
 }
 
-/*member: test10:[null]*/
+/*member: test10:[null|powerset=1]*/
 test10() {
   A10? a;
   f10(a);
   a = A10();
-  a. /*invoke: [exact=A10]*/ m10();
+  a. /*invoke: [exact=A10|powerset=0]*/ m10();
 }
 
-/*member: S11.:[exact=S11]*/
+/*member: S11.:[exact=S11|powerset=0]*/
 class S11 {
-  /*member: S11.fs11:[exact=JSUInt31]*/
+  /*member: S11.fs11:[exact=JSUInt31|powerset=0]*/
   int fs11 = 1;
 
-  /*member: S11.ms11:[null]*/
+  /*member: S11.ms11:[null|powerset=1]*/
   ms11() {
-    /*update: [exact=A11]*/
+    /*update: [exact=A11|powerset=0]*/
     fs11 = 1;
   }
 }
 
-/*member: A11.:[exact=A11]*/
+/*member: A11.:[exact=A11|powerset=0]*/
 class A11 extends S11 {
-  /*member: A11.m11:[null]*/
+  /*member: A11.m11:[null|powerset=1]*/
   m11() {
-    /*invoke: [exact=A11]*/
+    /*invoke: [exact=A11|powerset=0]*/
     ms11();
   }
 }
 
-/*member: test11:[null]*/
+/*member: test11:[null|powerset=1]*/
 test11() {
   A11 a = A11();
-  a. /*invoke: [exact=A11]*/ m11();
+  a. /*invoke: [exact=A11|powerset=0]*/ m11();
 }
 
 class S12 {
-  /*member: S12.fs12:Union([exact=JSString], [exact=JSUInt31])*/
+  /*member: S12.fs12:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
   dynamic fs12 = 1;
 
-  /*member: S12.:[exact=S12]*/
+  /*member: S12.:[exact=S12|powerset=0]*/
   S12() {
-    /*update: [exact=A12]*/
+    /*update: [exact=A12|powerset=0]*/
     fs12 = "2";
   }
 }
 
-/*member: A12.:[exact=A12]*/
+/*member: A12.:[exact=A12|powerset=0]*/
 class A12 extends S12 {}
 
-/*member: test12:[null]*/
+/*member: test12:[null|powerset=1]*/
 test12() {
   A12();
 }
 
 class S13 {
-  /*member: S13.fs13:[exact=JSUInt31]*/
+  /*member: S13.fs13:[exact=JSUInt31|powerset=0]*/
   int? fs13;
 
-  /*member: S13.:[exact=S13]*/
+  /*member: S13.:[exact=S13|powerset=0]*/
   S13() {
-    /*update: [exact=A13]*/
+    /*update: [exact=A13|powerset=0]*/
     fs13 = 1;
   }
 }
 
 class A13 extends S13 {
-  /*member: A13.:[exact=A13]*/
+  /*member: A13.:[exact=A13|powerset=0]*/
   A13() {
-    /*update: [exact=A13]*/
+    /*update: [exact=A13|powerset=0]*/
     fs13 = 1;
   }
 }
 
-/*member: test13:[null]*/
+/*member: test13:[null|powerset=1]*/
 test13() {
   A13();
 }
 
 class A14 {
-  /*member: A14.f14:[exact=JSUInt31]*/
+  /*member: A14.f14:[exact=JSUInt31|powerset=0]*/
   var f14;
 
-  /*member: A14.:[exact=A14]*/
+  /*member: A14.:[exact=A14|powerset=0]*/
   A14() {
-    /*update: [exact=A14]*/
+    /*update: [exact=A14|powerset=0]*/
     f14 = 1;
   }
-  /*member: A14.other:[exact=A14]*/
+  /*member: A14.other:[exact=A14|powerset=0]*/
   A14.other() {
-    /*update: [exact=A14]*/
+    /*update: [exact=A14|powerset=0]*/
     f14 = 2;
   }
 }
 
-/*member: test14:[null]*/
+/*member: test14:[null|powerset=1]*/
 test14() {
   // ignore: unused_local_variable
   A14 a = A14();
@@ -351,23 +352,23 @@
 }
 
 class A15 {
-  /*member: A15.f15:Union([exact=JSExtendableArray], [exact=JSString])*/
+  /*member: A15.f15:Union([exact=JSExtendableArray|powerset=0], [exact=JSString|powerset=0], powerset: 0)*/
   var f15;
 
-  /*member: A15.:[exact=A15]*/
+  /*member: A15.:[exact=A15|powerset=0]*/
   A15() {
-    /*update: [exact=A15]*/
+    /*update: [exact=A15|powerset=0]*/
     f15 = "1";
   }
 
-  /*member: A15.other:[exact=A15]*/
+  /*member: A15.other:[exact=A15|powerset=0]*/
   A15.other() {
-    /*update: [exact=A15]*/
+    /*update: [exact=A15|powerset=0]*/
     f15 = [];
   }
 }
 
-/*member: test15:[null]*/
+/*member: test15:[null|powerset=1]*/
 test15() {
   // ignore: unused_local_variable
   A15 a = A15();
@@ -378,35 +379,36 @@
   // TODO(johnniwinther): Investigate why these include `null`. The ast version
   // didn't.
 
-  /*member: A16.f16:Union(null, [exact=JSString], [exact=JSUInt31])*/
+  /*member: A16.f16:Union(null, [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
   var f16;
 
-  /*member: A16.:[exact=A16]*/
+  /*member: A16.:[exact=A16|powerset=0]*/
   A16() {
-    /*update: [exact=A16]*/
+    /*update: [exact=A16|powerset=0]*/
     f16 = "1";
   }
 
-  /*member: A16.other:[exact=A16]*/
+  /*member: A16.other:[exact=A16|powerset=0]*/
   A16.other() : f16 = 1 {}
 }
 
-/*member: test16:[null]*/
+/*member: test16:[null|powerset=1]*/
 test16() {
   // ignore: unused_local_variable
   A16 a = A16();
   a = A16.other();
 }
 
-/*member: g17:[exact=JSUInt31]*/
-g17([/*[exact=A17]*/ p]) => p. /*update: [exact=A17]*/ f17 = 1;
+/*member: g17:[exact=JSUInt31|powerset=0]*/
+g17([/*[exact=A17|powerset=0]*/ p]) =>
+    p. /*update: [exact=A17|powerset=0]*/ f17 = 1;
 
 class A17 {
-  /*member: A17.f17:[null|exact=JSUInt31]*/
+  /*member: A17.f17:[null|exact=JSUInt31|powerset=1]*/
   var f17;
 
-  /*member: A17.:[exact=A17]*/
-  A17(/*[exact=JSBool]*/ x) {
+  /*member: A17.:[exact=A17|powerset=0]*/
+  A17(/*[exact=JSBool|powerset=0]*/ x) {
     var a;
     if (x) {
       a = this;
@@ -417,94 +419,94 @@
   }
 }
 
-/*member: test17:[null]*/
+/*member: test17:[null|powerset=1]*/
 test17() {
   A17(true);
   A17(false);
 }
 
 class A18 {
-  /*member: A18.f18a:[exact=JSUInt31]*/
+  /*member: A18.f18a:[exact=JSUInt31|powerset=0]*/
   var f18a;
 
-  /*member: A18.f18b:Value([exact=JSString], value: "1")*/
+  /*member: A18.f18b:Value([exact=JSString|powerset=0], value: "1", powerset: 0)*/
   var f18b;
 
-  /*member: A18.f18c:Union(null, [exact=A18], [exact=JSUInt31])*/
+  /*member: A18.f18c:Union(null, [exact=A18|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
   var f18c;
 
-  /*member: A18.:[exact=A18]*/
-  A18(/*[exact=JSBool]*/ x) {
-    /*update: [exact=A18]*/
+  /*member: A18.:[exact=A18|powerset=0]*/
+  A18(/*[exact=JSBool|powerset=0]*/ x) {
+    /*update: [exact=A18|powerset=0]*/
     f18a = 1;
     var a;
     if (x) {
-      /*update: [exact=A18]*/
+      /*update: [exact=A18|powerset=0]*/
       f18b = "1";
       a = this;
     } else {
       a = 1;
-      /*update: [exact=A18]*/
+      /*update: [exact=A18|powerset=0]*/
       f18b = "1";
     }
-    /*update: [exact=A18]*/
+    /*update: [exact=A18|powerset=0]*/
     f18c = a;
   }
 }
 
-/*member: test18:[null]*/
+/*member: test18:[null|powerset=1]*/
 test18() {
   A18(true);
   A18(false);
 }
 
 class A19 {
-  /*member: A19.f19a:[exact=JSUInt31]*/
+  /*member: A19.f19a:[exact=JSUInt31|powerset=0]*/
   var f19a;
 
-  /*member: A19.f19b:Value([exact=JSString], value: "1")*/
+  /*member: A19.f19b:Value([exact=JSString|powerset=0], value: "1", powerset: 0)*/
   var f19b;
 
-  /*member: A19.f19c:Union(null, [exact=A19], [exact=JSUInt31])*/
+  /*member: A19.f19c:Union(null, [exact=A19|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
   var f19c;
 
-  /*member: A19.:[exact=A19]*/
-  A19(/*[exact=JSBool]*/ x) {
-    /*update: [exact=A19]*/
+  /*member: A19.:[exact=A19|powerset=0]*/
+  A19(/*[exact=JSBool|powerset=0]*/ x) {
+    /*update: [exact=A19|powerset=0]*/
     f19a = 1;
     var a;
     if (x) {
-      /*update: [exact=A19]*/
+      /*update: [exact=A19|powerset=0]*/
       f19b = "1";
       a = this;
     } else {
       a = 1;
-      /*update: [exact=A19]*/
+      /*update: [exact=A19|powerset=0]*/
       f19b = "1";
     }
-    /*update: [exact=A19]*/
+    /*update: [exact=A19|powerset=0]*/
     f19c = a;
     a();
   }
 }
 
-/*member: test19:[null]*/
+/*member: test19:[null|powerset=1]*/
 test19() {
   A19(true);
   A19(false);
 }
 
 class A20 {
-  /*member: A20.f20:[null]*/
+  /*member: A20.f20:[null|powerset=1]*/
   var f20;
 
-  /*member: A20.:[exact=A20]*/
+  /*member: A20.:[exact=A20|powerset=0]*/
   A20() {
     dynamic a = this;
-    /*iterator: [exact=A20]*/
-    /*current: [empty]*/
-    /*moveNext: [empty]*/
-    for ( /*update: [exact=A20]*/ f20 in a) {}
+    /*iterator: [exact=A20|powerset=0]*/
+    /*current: [empty|powerset=0]*/
+    /*moveNext: [empty|powerset=0]*/
+    for ( /*update: [exact=A20|powerset=0]*/ f20 in a) {}
   }
 
   get iterator => this;
@@ -514,296 +516,297 @@
   bool moveNext() => false;
 }
 
-/*member: test20:[null]*/
+/*member: test20:[null|powerset=1]*/
 test20() {
   A20();
 }
 
 class A20b extends Iterable implements Iterator {
-  /*member: A20b.f20b:[null|exact=JSUInt31]*/
+  /*member: A20b.f20b:[null|exact=JSUInt31|powerset=1]*/
   var f20b;
 
-  /*member: A20b.:[exact=A20b]*/
+  /*member: A20b.:[exact=A20b|powerset=0]*/
   A20b() {
     dynamic a = this;
-    /*iterator: [exact=A20b]*/
-    /*current: [exact=A20b]*/
-    /*moveNext: [exact=A20b]*/
-    for ( /*update: [exact=A20b]*/ f20b in a) {}
+    /*iterator: [exact=A20b|powerset=0]*/
+    /*current: [exact=A20b|powerset=0]*/
+    /*moveNext: [exact=A20b|powerset=0]*/
+    for ( /*update: [exact=A20b|powerset=0]*/ f20b in a) {}
   }
 
-  /*member: A20b.iterator:[exact=A20b]*/
+  /*member: A20b.iterator:[exact=A20b|powerset=0]*/
   @override
   get iterator => this;
 
-  /*member: A20b.current:[exact=JSUInt31]*/
+  /*member: A20b.current:[exact=JSUInt31|powerset=0]*/
   @override
   get current => 42;
 
-  /*member: A20b.moveNext:Value([exact=JSBool], value: false)*/
+  /*member: A20b.moveNext:Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/
   @override
   bool moveNext() => false;
 }
 
-/*member: test20b:[null]*/
+/*member: test20b:[null|powerset=1]*/
 test20b() {
   A20b();
 }
 
 class A22 {
-  /*member: A22.f22a:[exact=JSUInt31]*/
+  /*member: A22.f22a:[exact=JSUInt31|powerset=0]*/
   var f22a;
 
-  /*member: A22.f22b:[exact=JSUInt31]*/
+  /*member: A22.f22b:[exact=JSUInt31|powerset=0]*/
   var f22b;
 
-  /*member: A22.f22c:Value([null|exact=JSString], value: "foo")*/
+  /*member: A22.f22c:Value([null|exact=JSString|powerset=1], value: "foo", powerset: 1)*/
   var f22c;
 
-  /*member: A22.:[exact=A22]*/
+  /*member: A22.:[exact=A22|powerset=0]*/
   A22() {
-    /*update: [exact=A22]*/
+    /*update: [exact=A22|powerset=0]*/
     f22a = 42;
-    /*update: [exact=A22]*/
-    f22b = /*[exact=A22]*/
+    /*update: [exact=A22|powerset=0]*/
+    f22b = /*[exact=A22|powerset=0]*/
         f22a == null
             ? 42
-            : /*[exact=A22]*/ f22c == null
+            : /*[exact=A22|powerset=0]*/ f22c == null
             ? 41
             : 43;
-    /*update: [exact=A22]*/
+    /*update: [exact=A22|powerset=0]*/
     f22c = 'foo';
   }
 }
 
-/*member: test22:[null]*/
+/*member: test22:[null|powerset=1]*/
 test22() {
   A22();
 }
 
 class A23 {
-  /*member: A23.f23a:[null|exact=JSUInt31]*/
+  /*member: A23.f23a:[null|exact=JSUInt31|powerset=1]*/
   int? f23a = 42;
 
-  /*member: A23.f23b:[null|exact=JSUInt31]*/
+  /*member: A23.f23b:[null|exact=JSUInt31|powerset=1]*/
   int? f23b = 42;
 
-  /*member: A23.f23c:[null|exact=JSUInt31]*/
+  /*member: A23.f23c:[null|exact=JSUInt31|powerset=1]*/
   int? f23c = 42;
 
-  /*member: A23.f23d:[null|exact=JSUInt31]*/
+  /*member: A23.f23d:[null|exact=JSUInt31|powerset=1]*/
   int? f23d = 42;
 
-  /*member: A23.:[exact=A23]*/
+  /*member: A23.:[exact=A23|powerset=0]*/
   A23() {
     // Test string interpolation.
-    '${ /*update: [exact=A23]*/ f23a = null}';
+    '${ /*update: [exact=A23|powerset=0]*/ f23a = null}';
     // Test string juxtaposition.
     ''
-        '${ /*update: [exact=A23]*/ f23b = null}';
+        '${ /*update: [exact=A23|powerset=0]*/ f23b = null}';
     // Test list literal.
-    [/*update: [exact=A23]*/ f23c = null];
+    [/*update: [exact=A23|powerset=0]*/ f23c = null];
     // Test map literal.
     // ignore: unused_local_variable
-    var c = {'foo': /*update: [exact=A23]*/ f23d = null};
+    var c = {'foo': /*update: [exact=A23|powerset=0]*/ f23d = null};
   }
 }
 
-/*member: test23:[null]*/
+/*member: test23:[null|powerset=1]*/
 test23() {
   A23();
 }
 
 class A24 {
-  /*member: A24.f24a:[subclass=JSPositiveInt]*/
+  /*member: A24.f24a:[subclass=JSPositiveInt|powerset=0]*/
   var f24a = 42;
 
-  /*member: A24.f24b:[subclass=JSPositiveInt]*/
+  /*member: A24.f24b:[subclass=JSPositiveInt|powerset=0]*/
   var f24b = 42;
 
-  /*member: A24.f24c:[exact=JSUInt31]*/
+  /*member: A24.f24c:[exact=JSUInt31|powerset=0]*/
   var f24c = 42;
 
-  /*member: A24.f24d:[exact=JSUInt31]*/
+  /*member: A24.f24d:[exact=JSUInt31|powerset=0]*/
   final f24d;
 
-  /*member: A24.f24e:Union(null, [exact=JSNumNotInt], [exact=JSUInt31])*/
+  /*member: A24.f24e:Union(null, [exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
   var f24e;
 
-  /*member: A24.f24f:Value([null|exact=JSString], value: "foo")*/
+  /*member: A24.f24f:Value([null|exact=JSString|powerset=1], value: "foo", powerset: 1)*/
   var f24f = null;
 
-  /*member: A24.:[exact=A24]*/
+  /*member: A24.:[exact=A24|powerset=0]*/
   A24() : f24d = 42 {
-    /*[subclass=A24]*/ /*update: [subclass=A24]*/
-    f24a /*invoke: [subclass=JSPositiveInt]*/ ++;
-    /*[subclass=A24]*/ /*update: [subclass=A24]*/
-    f24b /*invoke: [subclass=JSPositiveInt]*/ += 42;
+    /*[subclass=A24|powerset=0]*/ /*update: [subclass=A24|powerset=0]*/
+    f24a /*invoke: [subclass=JSPositiveInt|powerset=0]*/ ++;
+    /*[subclass=A24|powerset=0]*/ /*update: [subclass=A24|powerset=0]*/
+    f24b /*invoke: [subclass=JSPositiveInt|powerset=0]*/ += 42;
     var f24f = 'foo';
-    this. /*update: [subclass=A24]*/ f24f = f24f;
+    this. /*update: [subclass=A24|powerset=0]*/ f24f = f24f;
   }
 
-  /*member: A24.foo:[exact=A24]*/
-  A24.foo(/*[subclass=A24]*/ other)
-    : f24c = other. /*[subclass=A24]*/ f24c,
-      f24d = other. /*[subclass=A24]*/ f24d,
-      f24e = other. /*invoke: [subclass=A24]*/ bar24();
+  /*member: A24.foo:[exact=A24|powerset=0]*/
+  A24.foo(/*[subclass=A24|powerset=0]*/ other)
+    : f24c = other. /*[subclass=A24|powerset=0]*/ f24c,
+      f24d = other. /*[subclass=A24|powerset=0]*/ f24d,
+      f24e = other. /*invoke: [subclass=A24|powerset=0]*/ bar24();
 
-  /*member: A24.+:Value([exact=JSString], value: "foo")*/
-  operator +(/*[empty]*/ other) => 'foo';
+  /*member: A24.+:Value([exact=JSString|powerset=0], value: "foo", powerset: 0)*/
+  operator +(/*[empty|powerset=0]*/ other) => 'foo';
 
-  /*member: A24.bar24:[exact=JSNumNotInt]*/
+  /*member: A24.bar24:[exact=JSNumNotInt|powerset=0]*/
   bar24() => 42.5;
 }
 
-/*member: B24.:[exact=B24]*/
+/*member: B24.:[exact=B24|powerset=0]*/
 class B24 extends A24 {
-  /*member: B24.bar24:[exact=JSUInt31]*/
+  /*member: B24.bar24:[exact=JSUInt31|powerset=0]*/
   @override
   bar24() => 42;
 }
 
-/*member: test24:[null]*/
+/*member: test24:[null|powerset=1]*/
 test24() {
   A24();
   A24.foo(new A24());
   A24.foo(new B24());
 }
 
-/*member: A25.:[exact=A25]*/
+/*member: A25.:[exact=A25|powerset=0]*/
 class A25 {
-  /*member: A25.f25:[exact=JSUInt31]*/
+  /*member: A25.f25:[exact=JSUInt31|powerset=0]*/
   var f25 = 42;
 }
 
-/*member: B25.:[exact=B25]*/
+/*member: B25.:[exact=B25|powerset=0]*/
 class B25 {
-  /*member: B25.f25:Value([exact=JSString], value: "42")*/
+  /*member: B25.f25:Value([exact=JSString|powerset=0], value: "42", powerset: 0)*/
   var f25 = '42';
 }
 
-/*member: test25:[null]*/
+/*member: test25:[null|powerset=1]*/
 test25() {
   B25();
-  A25(). /*update: [exact=A25]*/ f25 = A25(). /*[exact=A25]*/ f25;
+  A25(). /*update: [exact=A25|powerset=0]*/ f25 =
+      A25(). /*[exact=A25|powerset=0]*/ f25;
 }
 
-/*member: A26.:[exact=A26]*/
+/*member: A26.:[exact=A26|powerset=0]*/
 class A26 {
-  /*member: A26.f26:[subclass=JSPositiveInt]*/
+  /*member: A26.f26:[subclass=JSPositiveInt|powerset=0]*/
   var f26 = 42;
 }
 
-/*member: B26.:[exact=B26]*/
+/*member: B26.:[exact=B26|powerset=0]*/
 class B26 {
-  /*member: B26.f26:[exact=JSUInt31]*/
+  /*member: B26.f26:[exact=JSUInt31|powerset=0]*/
   var f26 = 54;
 }
 
-/*member: test26:[null]*/
+/*member: test26:[null|powerset=1]*/
 test26() {
-  A26(). /*update: [exact=A26]*/ f26 =
+  A26(). /*update: [exact=A26|powerset=0]*/ f26 =
       <dynamic>[new B26(), A26()]
-      /*Container([exact=JSExtendableArray], element: Union([exact=A26], [exact=B26]), length: 2)*/
-      [0]. /*Union([exact=A26], [exact=B26])*/ f26 /*invoke: [subclass=JSPositiveInt]*/ +
+      /*Container([exact=JSExtendableArray|powerset=0], element: Union([exact=A26|powerset=0], [exact=B26|powerset=0], powerset: 0), length: 2, powerset: 0)*/
+      [0]. /*Union([exact=A26|powerset=0], [exact=B26|powerset=0], powerset: 0)*/ f26 /*invoke: [subclass=JSPositiveInt|powerset=0]*/ +
       42;
 }
 
 class A27 {
-  /*member: A27.f27a:[exact=JSUInt31]*/
+  /*member: A27.f27a:[exact=JSUInt31|powerset=0]*/
   var f27a;
 
-  /*member: A27.f27b:[null|exact=JSUInt31]*/
+  /*member: A27.f27b:[null|exact=JSUInt31|powerset=1]*/
   var f27b;
 
-  /*member: A27.:[exact=A27]*/
+  /*member: A27.:[exact=A27|powerset=0]*/
   A27() {
-    this. /*update: [subclass=A27]*/ f27a = 42;
-    this. /*update: [subclass=A27]*/ f27b = 42;
+    this. /*update: [subclass=A27|powerset=0]*/ f27a = 42;
+    this. /*update: [subclass=A27|powerset=0]*/ f27b = 42;
   }
 }
 
-/*member: B27.:[exact=B27]*/
+/*member: B27.:[exact=B27|powerset=0]*/
 class B27 extends A27 {
   @override
-  set f27b(/*[null|exact=JSUInt31]*/ value) {}
+  set f27b(/*[null|exact=JSUInt31|powerset=1]*/ value) {}
 }
 
-/*member: test27:[null]*/
+/*member: test27:[null|powerset=1]*/
 test27() {
   A27();
   B27();
 }
 
 class A28 {
-  /*member: A28.f28a:[exact=JSUInt31]*/
+  /*member: A28.f28a:[exact=JSUInt31|powerset=0]*/
   var f28a;
 
-  /*member: A28.f28b:[null|exact=JSUInt31]*/
+  /*member: A28.f28b:[null|exact=JSUInt31|powerset=1]*/
   var f28b;
 
-  /*member: A28.:[exact=A28]*/
-  A28(/*[exact=JSUInt31]*/ x) {
-    this. /*update: [exact=A28]*/ f28a = x;
-    if (x /*invoke: [exact=JSUInt31]*/ == 0) return;
-    this. /*update: [exact=A28]*/ f28b = x;
+  /*member: A28.:[exact=A28|powerset=0]*/
+  A28(/*[exact=JSUInt31|powerset=0]*/ x) {
+    this. /*update: [exact=A28|powerset=0]*/ f28a = x;
+    if (x /*invoke: [exact=JSUInt31|powerset=0]*/ == 0) return;
+    this. /*update: [exact=A28|powerset=0]*/ f28b = x;
   }
 }
 
-/*member: test28:[null]*/
+/*member: test28:[null|powerset=1]*/
 test28() {
   A28(0);
   A28(1);
 }
 
 class A29 {
-  /*member: A29.f29a:[exact=JSUInt31]*/
+  /*member: A29.f29a:[exact=JSUInt31|powerset=0]*/
   var f29a;
 
-  /*member: A29.f29b:[null|exact=JSUInt31]*/
+  /*member: A29.f29b:[null|exact=JSUInt31|powerset=1]*/
   var f29b;
 
-  /*member: A29.:[exact=A29]*/
-  A29(/*[exact=JSUInt31]*/ x) {
-    this. /*update: [exact=A29]*/ f29a = x;
-    if (x /*invoke: [exact=JSUInt31]*/ == 0) {
+  /*member: A29.:[exact=A29|powerset=0]*/
+  A29(/*[exact=JSUInt31|powerset=0]*/ x) {
+    this. /*update: [exact=A29|powerset=0]*/ f29a = x;
+    if (x /*invoke: [exact=JSUInt31|powerset=0]*/ == 0) {
     } else {
       return;
     }
-    this. /*update: [exact=A29]*/ f29b = x;
+    this. /*update: [exact=A29|powerset=0]*/ f29b = x;
   }
 }
 
-/*member: test29:[null]*/
+/*member: test29:[null|powerset=1]*/
 test29() {
   A29(0);
   A29(1);
 }
 
 class A30 {
-  /*member: A30.f30a:[exact=JSUInt31]*/
+  /*member: A30.f30a:[exact=JSUInt31|powerset=0]*/
   var f30a;
 
-  /*member: A30.f30b:[exact=JSUInt31]*/
+  /*member: A30.f30b:[exact=JSUInt31|powerset=0]*/
   var f30b;
 
-  /*member: A30.f30c:[null|exact=JSUInt31]*/
+  /*member: A30.f30c:[null|exact=JSUInt31|powerset=1]*/
   var f30c;
 
-  /*member: A30.:[exact=A30]*/
-  A30(/*[exact=JSUInt31]*/ x) {
-    this. /*update: [exact=A30]*/ f30a = x;
-    if (x /*invoke: [exact=JSUInt31]*/ == 0) {
-      this. /*update: [exact=A30]*/ f30b = 1;
+  /*member: A30.:[exact=A30|powerset=0]*/
+  A30(/*[exact=JSUInt31|powerset=0]*/ x) {
+    this. /*update: [exact=A30|powerset=0]*/ f30a = x;
+    if (x /*invoke: [exact=JSUInt31|powerset=0]*/ == 0) {
+      this. /*update: [exact=A30|powerset=0]*/ f30b = 1;
     } else {
-      this. /*update: [exact=A30]*/ f30b = x;
+      this. /*update: [exact=A30|powerset=0]*/ f30b = x;
       return;
     }
-    this. /*update: [exact=A30]*/ f30c = x;
+    this. /*update: [exact=A30|powerset=0]*/ f30c = x;
   }
 }
 
-/*member: test30:[null]*/
+/*member: test30:[null|powerset=1]*/
 test30() {
   A30(0);
   A30(1);
diff --git a/pkg/compiler/test/inference/data/fields.dart b/pkg/compiler/test/inference/data/fields.dart
index bd3c5fa..5741529 100644
--- a/pkg/compiler/test/inference/data/fields.dart
+++ b/pkg/compiler/test/inference/data/fields.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   fieldGetUnset();
   fieldGetUnsetInitialized();
@@ -14,50 +14,50 @@
 /// Get an uninitialized field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
-  var /*member: Class1.field:[null]*/ field;
+  var /*member: Class1.field:[null|powerset=1]*/ field;
 }
 
-/*member: fieldGetUnset:[null]*/
-fieldGetUnset() => Class1(). /*[exact=Class1]*/ field;
+/*member: fieldGetUnset:[null|powerset=1]*/
+fieldGetUnset() => Class1(). /*[exact=Class1|powerset=0]*/ field;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Get a field initialized to `null`.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class4.:[exact=Class4]*/
+/*member: Class4.:[exact=Class4|powerset=0]*/
 class Class4 {
-  var /*member: Class4.field:[null]*/ field = null;
+  var /*member: Class4.field:[null|powerset=1]*/ field = null;
 }
 
-/*member: fieldGetUnsetInitialized:[null]*/
-fieldGetUnsetInitialized() => Class4(). /*[exact=Class4]*/ field;
+/*member: fieldGetUnsetInitialized:[null|powerset=1]*/
+fieldGetUnsetInitialized() => Class4(). /*[exact=Class4|powerset=0]*/ field;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Set an uninitialized field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class2.:[exact=Class2]*/
+/*member: Class2.:[exact=Class2|powerset=0]*/
 class Class2 {
-  var /*member: Class2.field:[null|exact=JSUInt31]*/ field;
+  var /*member: Class2.field:[null|exact=JSUInt31|powerset=1]*/ field;
 }
 
-/*member: fieldSet:[null]*/
+/*member: fieldSet:[null|powerset=1]*/
 fieldSet() {
-  Class2(). /*update: [exact=Class2]*/ field = 0;
+  Class2(). /*update: [exact=Class2|powerset=0]*/ field = 0;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return the setting of an uninitialized field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class3.:[exact=Class3]*/
+/*member: Class3.:[exact=Class3|powerset=0]*/
 class Class3 {
-  var /*member: Class3.field:[null|exact=JSUInt31]*/ field;
+  var /*member: Class3.field:[null|exact=JSUInt31|powerset=1]*/ field;
 }
 
-/*member: fieldSetReturn:[exact=JSUInt31]*/
+/*member: fieldSetReturn:[exact=JSUInt31|powerset=0]*/
 fieldSetReturn() {
-  return Class3(). /*update: [exact=Class3]*/ field = 0;
+  return Class3(). /*update: [exact=Class3|powerset=0]*/ field = 0;
 }
diff --git a/pkg/compiler/test/inference/data/final_field.dart b/pkg/compiler/test/inference/data/final_field.dart
index d2e4767..5570239 100644
--- a/pkg/compiler/test/inference/data/final_field.dart
+++ b/pkg/compiler/test/inference/data/final_field.dart
@@ -3,40 +3,40 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class A {
-  /*member: A.intField:[exact=JSUInt31]*/
+  /*member: A.intField:[exact=JSUInt31|powerset=0]*/
   final intField;
 
-  /*member: A.giveUpField1:Union([exact=JSString], [exact=JSUInt31])*/
+  /*member: A.giveUpField1:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
   final giveUpField1;
 
-  /*member: A.giveUpField2:Union([exact=A], [exact=JSString])*/
+  /*member: A.giveUpField2:Union([exact=A|powerset=0], [exact=JSString|powerset=0], powerset: 0)*/
   final giveUpField2;
 
-  /*member: A.fieldParameter:[exact=JSUInt31]*/
+  /*member: A.fieldParameter:[exact=JSUInt31|powerset=0]*/
   final fieldParameter;
 
-  /*member: A.:[exact=A]*/
+  /*member: A.:[exact=A|powerset=0]*/
   A()
     : intField = 42,
       giveUpField1 = 'foo',
       giveUpField2 = 'foo',
       fieldParameter = 54;
 
-  /*member: A.bar:[exact=A]*/
+  /*member: A.bar:[exact=A|powerset=0]*/
   A.bar()
     : intField = 54,
       giveUpField1 = 42,
       giveUpField2 = A(),
       fieldParameter = 87;
 
-  /*member: A.foo:[exact=A]*/
-  A.foo(this. /*[exact=JSUInt31]*/ fieldParameter)
+  /*member: A.foo:[exact=A|powerset=0]*/
+  A.foo(this. /*[exact=JSUInt31|powerset=0]*/ fieldParameter)
     : intField = 87,
       giveUpField1 = 42,
       giveUpField2 = 'foo';
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   A();
   A.bar();
diff --git a/pkg/compiler/test/inference/data/final_field2.dart b/pkg/compiler/test/inference/data/final_field2.dart
index 288749d..a2326f9 100644
--- a/pkg/compiler/test/inference/data/final_field2.dart
+++ b/pkg/compiler/test/inference/data/final_field2.dart
@@ -6,19 +6,19 @@
 // inferring types for fields.
 
 class A {
-  /*member: A.intField:[exact=JSUInt31]*/
+  /*member: A.intField:[exact=JSUInt31|powerset=0]*/
   final intField;
 
-  /*member: A.stringField:Value([exact=JSString], value: "foo")*/
+  /*member: A.stringField:Value([exact=JSString|powerset=0], value: "foo", powerset: 0)*/
   final stringField;
 
-  /*member: A.:[exact=A]*/
+  /*member: A.:[exact=A|powerset=0]*/
   A() : intField = 42, stringField = 'foo';
 
   A.bar() : intField = 'bar', stringField = 42;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   A();
 }
diff --git a/pkg/compiler/test/inference/data/final_field3.dart b/pkg/compiler/test/inference/data/final_field3.dart
index bd84d33..ee2597e 100644
--- a/pkg/compiler/test/inference/data/final_field3.dart
+++ b/pkg/compiler/test/inference/data/final_field3.dart
@@ -5,17 +5,19 @@
 // Test that we are analyzing field parameters correctly.
 
 class A {
-  /*member: A.dynamicField:Union([exact=JSString], [exact=JSUInt31])*/
+  /*member: A.dynamicField:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
   final dynamicField;
 
-  /*member: A.:[exact=A]*/
+  /*member: A.:[exact=A|powerset=0]*/
   A() : dynamicField = 42;
 
-  /*member: A.bar:[exact=A]*/
-  A.bar(this. /*Value([exact=JSString], value: "foo")*/ dynamicField);
+  /*member: A.bar:[exact=A|powerset=0]*/
+  A.bar(
+    this. /*Value([exact=JSString|powerset=0], value: "foo", powerset: 0)*/ dynamicField,
+  );
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   A();
   A.bar('foo');
diff --git a/pkg/compiler/test/inference/data/finalized_type_variable.dart b/pkg/compiler/test/inference/data/finalized_type_variable.dart
index 3361624..881181e 100644
--- a/pkg/compiler/test/inference/data/finalized_type_variable.dart
+++ b/pkg/compiler/test/inference/data/finalized_type_variable.dart
@@ -2,80 +2,86 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: AppView.:[subclass=AppView]*/
+/*member: AppView.:[subclass=AppView|powerset=0]*/
 abstract class AppView<T> {
-  /*member: AppView.ctx:Union(null, [exact=CardComponent2], [exact=CardComponent])*/
+  /*member: AppView.ctx:Union(null, [exact=CardComponent2|powerset=0], [exact=CardComponent|powerset=0], powerset: 1)*/
   T? ctx;
 }
 
-/*member: CardComponent.:[exact=CardComponent]*/
+/*member: CardComponent.:[exact=CardComponent|powerset=0]*/
 class CardComponent {
-  /*member: CardComponent.title:Value([null|exact=JSString], value: "foo")*/
+  /*member: CardComponent.title:Value([null|exact=JSString|powerset=1], value: "foo", powerset: 1)*/
   String? title;
 }
 
-/*member: ViewCardComponent.:[exact=ViewCardComponent]*/
+/*member: ViewCardComponent.:[exact=ViewCardComponent|powerset=0]*/
 class ViewCardComponent extends AppView<CardComponent> {
-  /*member: ViewCardComponent._title:Value([null|exact=JSString], value: "foo")*/
+  /*member: ViewCardComponent._title:Value([null|exact=JSString|powerset=1], value: "foo", powerset: 1)*/
   var _title;
 
   @pragma('dart2js:noInline')
-  set ng_title(String /*Value([exact=JSString], value: "foo")*/ value) {
-    if ( /*invoke: [exact=ViewCardComponent]*/ checkBinding(
-      /*[exact=ViewCardComponent]*/ _title,
+  set ng_title(
+    String /*Value([exact=JSString|powerset=0], value: "foo", powerset: 0)*/
+    value,
+  ) {
+    if ( /*invoke: [exact=ViewCardComponent|powerset=0]*/ checkBinding(
+      /*[exact=ViewCardComponent|powerset=0]*/ _title,
       value,
     )) {
-      /*[exact=ViewCardComponent]*/
-      ctx!. /*update: [exact=CardComponent]*/ title = value;
-      /*update: [exact=ViewCardComponent]*/
+      /*[exact=ViewCardComponent|powerset=0]*/
+      ctx!. /*update: [exact=CardComponent|powerset=0]*/ title = value;
+      /*update: [exact=ViewCardComponent|powerset=0]*/
       _title = value;
     }
   }
 
-  /*member: ViewCardComponent.checkBinding:Value([exact=JSBool], value: true)*/
+  /*member: ViewCardComponent.checkBinding:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
   checkBinding(
-    /*Value([null|exact=JSString], value: "foo")*/ a,
-    /*Value([exact=JSString], value: "foo")*/ b,
+    /*Value([null|exact=JSString|powerset=1], value: "foo", powerset: 1)*/ a,
+    /*Value([exact=JSString|powerset=0], value: "foo", powerset: 0)*/ b,
   ) => true;
 }
 
-/*member: CardComponent2.:[exact=CardComponent2]*/
+/*member: CardComponent2.:[exact=CardComponent2|powerset=0]*/
 class CardComponent2 {
-  /*member: CardComponent2.title:Value([null|exact=JSString], value: "bar")*/
+  /*member: CardComponent2.title:Value([null|exact=JSString|powerset=1], value: "bar", powerset: 1)*/
   String? title;
 }
 
-/*member: ViewCardComponent2.:[exact=ViewCardComponent2]*/
+/*member: ViewCardComponent2.:[exact=ViewCardComponent2|powerset=0]*/
 class ViewCardComponent2 extends AppView<CardComponent2> {
-  /*member: ViewCardComponent2._title:Value([null|exact=JSString], value: "bar")*/
+  /*member: ViewCardComponent2._title:Value([null|exact=JSString|powerset=1], value: "bar", powerset: 1)*/
   var _title;
 
   @pragma('dart2js:noInline')
-  set ng_title(String /*Value([exact=JSString], value: "bar")*/ value) {
-    if ( /*invoke: [exact=ViewCardComponent2]*/ checkBinding(
-      /*[exact=ViewCardComponent2]*/ _title,
+  set ng_title(
+    String /*Value([exact=JSString|powerset=0], value: "bar", powerset: 0)*/
+    value,
+  ) {
+    if ( /*invoke: [exact=ViewCardComponent2|powerset=0]*/ checkBinding(
+      /*[exact=ViewCardComponent2|powerset=0]*/ _title,
       value,
     )) {
-      /*[exact=ViewCardComponent2]*/
-      ctx!. /*update: [exact=CardComponent2]*/ title = value;
-      /*update: [exact=ViewCardComponent2]*/
+      /*[exact=ViewCardComponent2|powerset=0]*/
+      ctx!. /*update: [exact=CardComponent2|powerset=0]*/ title = value;
+      /*update: [exact=ViewCardComponent2|powerset=0]*/
       _title = value;
     }
   }
 
-  /*member: ViewCardComponent2.checkBinding:Value([exact=JSBool], value: true)*/
+  /*member: ViewCardComponent2.checkBinding:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
   checkBinding(
-    /*Value([null|exact=JSString], value: "bar")*/ a,
-    /*Value([exact=JSString], value: "bar")*/ b,
+    /*Value([null|exact=JSString|powerset=1], value: "bar", powerset: 1)*/ a,
+    /*Value([exact=JSString|powerset=0], value: "bar", powerset: 0)*/ b,
   ) => true;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   var c1 = ViewCardComponent();
-  c1. /*update: [exact=ViewCardComponent]*/ ctx = CardComponent();
-  c1. /*update: [exact=ViewCardComponent]*/ ng_title = 'foo';
+  c1. /*update: [exact=ViewCardComponent|powerset=0]*/ ctx = CardComponent();
+  c1. /*update: [exact=ViewCardComponent|powerset=0]*/ ng_title = 'foo';
   var c2 = ViewCardComponent2();
-  c2. /*update: [exact=ViewCardComponent2]*/ ctx = CardComponent2();
-  c2. /*update: [exact=ViewCardComponent2]*/ ng_title = 'bar';
+  c2. /*update: [exact=ViewCardComponent2|powerset=0]*/ ctx = CardComponent2();
+  c2. /*update: [exact=ViewCardComponent2|powerset=0]*/ ng_title = 'bar';
 }
diff --git a/pkg/compiler/test/inference/data/for.dart b/pkg/compiler/test/inference/data/for.dart
index 7cbbe36..6340b08 100644
--- a/pkg/compiler/test/inference/data/for.dart
+++ b/pkg/compiler/test/inference/data/for.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   simpleFor();
   forNull();
@@ -18,14 +18,14 @@
 /// Simple int based for loop.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: simpleFor:[null]*/
+/*member: simpleFor:[null|powerset=1]*/
 simpleFor() {
   for (
     var i = 0;
-    i /*invoke: [subclass=JSPositiveInt]*/ < 10;
-    i = i /*invoke: [subclass=JSPositiveInt]*/ + 1
+    i /*invoke: [subclass=JSPositiveInt|powerset=0]*/ < 10;
+    i = i /*invoke: [subclass=JSPositiveInt|powerset=0]*/ + 1
   ) {
-    i. /*invoke: [subclass=JSPositiveInt]*/ abs();
+    i. /*invoke: [subclass=JSPositiveInt|powerset=0]*/ abs();
   }
 }
 
@@ -33,10 +33,10 @@
 /// For loop with null test.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: forNull:[null]*/
+/*member: forNull:[null|powerset=1]*/
 forNull() {
   var local;
-  for (var o; o == null; o = o. /*invoke: [null]*/ toString()) {
+  for (var o; o == null; o = o. /*invoke: [null|powerset=1]*/ toString()) {
     local = o;
   }
   return local;
@@ -46,13 +46,13 @@
 /// For loop with not-null test.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: forNotNull:[null|exact=JSString]*/
+/*member: forNotNull:[null|exact=JSString|powerset=1]*/
 forNotNull() {
   var local;
   for (
     var o = '';
-    o /*invoke: [exact=JSString]*/ != null;
-    o = o. /*invoke: [exact=JSString]*/ toString()
+    o /*invoke: [exact=JSString|powerset=0]*/ != null;
+    o = o. /*invoke: [exact=JSString|powerset=0]*/ toString()
   ) {
     local = o;
   }
@@ -63,13 +63,13 @@
 /// For loop with null test known to be false.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: forNullFalse:[null]*/
+/*member: forNullFalse:[null|powerset=1]*/
 forNullFalse() {
   var local;
   for (
     var o = '';
-    o /*invoke: [exact=JSString]*/ == null;
-    o = o. /*invoke: [empty]*/ toString()
+    o /*invoke: [exact=JSString|powerset=0]*/ == null;
+    o = o. /*invoke: [empty|powerset=0]*/ toString()
   ) {
     local = o;
   }
@@ -80,10 +80,14 @@
 /// For loop with not-null test known to be true.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: forNotNullTrue:[null]*/
+/*member: forNotNullTrue:[null|powerset=1]*/
 forNotNullTrue() {
   var local;
-  for (var o = null; o != null; o = o. /*invoke: [empty]*/ toString()) {
+  for (
+    var o = null;
+    o != null;
+    o = o. /*invoke: [empty|powerset=0]*/ toString()
+  ) {
     local = o;
   }
   return local;
@@ -93,34 +97,34 @@
 /// For loop with not-null test that mixes field accesses.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
-  /*member: Class1.field:[null|exact=Class2]*/
+  /*member: Class1.field:[null|exact=Class2|powerset=1]*/
   var field;
 }
 
-/*member: Class2.:[exact=Class2]*/
+/*member: Class2.:[exact=Class2|powerset=0]*/
 class Class2 {
-  /*member: Class2.field:[null|exact=Class1]*/
+  /*member: Class2.field:[null|exact=Class1|powerset=1]*/
   var field;
 }
 
-/*member: _forUnion:Union(null, [exact=Class1], [exact=Class2])*/
-_forUnion(/*[exact=Class1]*/ o) {
+/*member: _forUnion:Union(null, [exact=Class1|powerset=0], [exact=Class2|powerset=0], powerset: 1)*/
+_forUnion(/*[exact=Class1|powerset=0]*/ o) {
   for (
     ;
-    o = o. /*Union(null, [exact=Class1], [exact=Class2])*/ field;
+    o = o. /*Union(null, [exact=Class1|powerset=0], [exact=Class2|powerset=0], powerset: 1)*/ field;
     o != null
   ) {}
   return o;
 }
 
-/*member: forUnion:[null]*/
+/*member: forUnion:[null|powerset=1]*/
 forUnion() {
   var c1 = Class1();
   var c2 = Class2();
-  c1. /*update: [exact=Class1]*/ field = c2;
-  c2. /*update: [exact=Class2]*/ field = c1;
+  c1. /*update: [exact=Class1|powerset=0]*/ field = c2;
+  c2. /*update: [exact=Class2|powerset=0]*/ field = c1;
   _forUnion(c1);
 }
 
@@ -128,30 +132,30 @@
 /// For loop with is test that mixes field accesses.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class3.:[exact=Class3]*/
+/*member: Class3.:[exact=Class3|powerset=0]*/
 class Class3 {
-  /*member: Class3.field:[null|exact=Class4]*/
+  /*member: Class3.field:[null|exact=Class4|powerset=1]*/
   var field;
 }
 
-/*member: Class4.:[exact=Class4]*/
+/*member: Class4.:[exact=Class4|powerset=0]*/
 class Class4 {
-  /*member: Class4.field:[null|exact=Class3]*/
+  /*member: Class4.field:[null|exact=Class3|powerset=1]*/
   var field;
 }
 
-/*member: _forIs:Union(null, [exact=Class3], [exact=Class4])*/
-_forIs(/*[exact=Class3]*/ o) {
-  for (; o is Class3; o = o. /*[exact=Class3]*/ field) {}
+/*member: _forIs:Union(null, [exact=Class3|powerset=0], [exact=Class4|powerset=0], powerset: 1)*/
+_forIs(/*[exact=Class3|powerset=0]*/ o) {
+  for (; o is Class3; o = o. /*[exact=Class3|powerset=0]*/ field) {}
   return o;
 }
 
-/*member: forIs:[null]*/
+/*member: forIs:[null|powerset=1]*/
 forIs() {
   var c1 = Class3();
   var c2 = Class4();
-  c1. /*update: [exact=Class3]*/ field = c2;
-  c2. /*update: [exact=Class4]*/ field = c1;
+  c1. /*update: [exact=Class3|powerset=0]*/ field = c2;
+  c2. /*update: [exact=Class4|powerset=0]*/ field = c1;
   _forIs(c1);
 }
 
@@ -159,33 +163,33 @@
 /// For loop with is-not test that mixes field accesses.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class5.:[exact=Class5]*/
+/*member: Class5.:[exact=Class5|powerset=0]*/
 class Class5 {
-  /*member: Class5.field:[null|exact=Class6]*/
+  /*member: Class5.field:[null|exact=Class6|powerset=1]*/
   var field;
 }
 
-/*member: Class6.:[exact=Class6]*/
+/*member: Class6.:[exact=Class6|powerset=0]*/
 class Class6 {
-  /*member: Class6.field:[null|exact=Class5]*/
+  /*member: Class6.field:[null|exact=Class5|powerset=1]*/
   var field;
 }
 
-/*member: _forIsNot:Union(null, [exact=Class5], [exact=Class6])*/
-_forIsNot(/*[exact=Class5]*/ o) {
+/*member: _forIsNot:Union(null, [exact=Class5|powerset=0], [exact=Class6|powerset=0], powerset: 1)*/
+_forIsNot(/*[exact=Class5|powerset=0]*/ o) {
   for (
     ;
     o is! Class6;
-    o = o. /*Union(null, [exact=Class5], [exact=Class6])*/ field
+    o = o. /*Union(null, [exact=Class5|powerset=0], [exact=Class6|powerset=0], powerset: 1)*/ field
   ) {}
   return o;
 }
 
-/*member: forIsNot:[null]*/
+/*member: forIsNot:[null|powerset=1]*/
 forIsNot() {
   var c1 = Class5();
   var c2 = Class6();
-  c1. /*update: [exact=Class5]*/ field = c2;
-  c2. /*update: [exact=Class6]*/ field = c1;
+  c1. /*update: [exact=Class5|powerset=0]*/ field = c2;
+  c2. /*update: [exact=Class6|powerset=0]*/ field = c1;
   _forIsNot(c1);
 }
diff --git a/pkg/compiler/test/inference/data/for_in.dart b/pkg/compiler/test/inference/data/for_in.dart
index 4a902c0..faebc1a 100644
--- a/pkg/compiler/test/inference/data/for_in.dart
+++ b/pkg/compiler/test/inference/data/for_in.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   forInDirect();
   forInReturn();
@@ -14,11 +14,11 @@
 // For-in loop directly on a list literal.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: forInDirect:[null]*/
+/*member: forInDirect:[null|powerset=1]*/
 forInDirect() {
-  /*iterator: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 3)*/
-  /*current: [exact=ArrayIterator]*/
-  /*moveNext: [exact=ArrayIterator]*/
+  /*iterator: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 3, powerset: 0)*/
+  /*current: [exact=ArrayIterator|powerset=0]*/
+  /*moveNext: [exact=ArrayIterator|powerset=0]*/
   for (var a in [1, 2, 3]) {
     print(a);
   }
@@ -28,11 +28,11 @@
 // Return element from a for-in loop on a list literal.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: forInReturn:[null|subclass=JSInt]*/
+/*member: forInReturn:[null|subclass=JSInt|powerset=1]*/
 forInReturn() {
-  /*iterator: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 3)*/
-  /*current: [exact=ArrayIterator]*/
-  /*moveNext: [exact=ArrayIterator]*/
+  /*iterator: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 3, powerset: 0)*/
+  /*current: [exact=ArrayIterator|powerset=0]*/
+  /*moveNext: [exact=ArrayIterator|powerset=0]*/
   for (var a in [1, 2, 3]) {
     // TODO(johnniwinther): We should know the type of [a] here.
     return a;
@@ -43,20 +43,20 @@
 // Return element from a for-in loop on known list type.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _forInReturn:[null|subclass=Object]*/
+/*member: _forInReturn:[null|subclass=Object|powerset=1]*/
 _forInReturn(
-  /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: null)*/ list,
+  /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: null, powerset: 0)*/ list,
 ) {
-  /*iterator: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: null)*/
-  /*current: [exact=ArrayIterator]*/
-  /*moveNext: [exact=ArrayIterator]*/
+  /*iterator: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: null, powerset: 0)*/
+  /*current: [exact=ArrayIterator|powerset=0]*/
+  /*moveNext: [exact=ArrayIterator|powerset=0]*/
   for (var a in list) {
     // TODO(johnniwinther): We should know the type of [a] here.
     return a;
   }
 }
 
-/*member: forInReturnMulti:[null]*/
+/*member: forInReturnMulti:[null|powerset=1]*/
 forInReturnMulti() {
   _forInReturn([1, 2]);
   _forInReturn([1, 2, 3]);
@@ -67,16 +67,16 @@
 // loop on known list type.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: forInReturnNonNull:[subclass=JSInt]*/
+/*member: forInReturnNonNull:[subclass=JSInt|powerset=0]*/
 forInReturnNonNull() {
-  /*iterator: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 3)*/
-  /*current: [exact=ArrayIterator]*/
-  /*moveNext: [exact=ArrayIterator]*/
+  /*iterator: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 3, powerset: 0)*/
+  /*current: [exact=ArrayIterator|powerset=0]*/
+  /*moveNext: [exact=ArrayIterator|powerset=0]*/
   for (var a in [1, 2, 3]) {
     // TODO(johnniwinther): We should know the type of [a] here. Even if [a] has
     // type `dynamic`.
-    a. /*[subclass=JSInt]*/ isEven;
-    a. /*[subclass=JSInt]*/ isEven;
+    a. /*[subclass=JSInt|powerset=0]*/ isEven;
+    a. /*[subclass=JSInt|powerset=0]*/ isEven;
     return a;
   }
   return 0;
diff --git a/pkg/compiler/test/inference/data/foreign.dart b/pkg/compiler/test/inference/data/foreign.dart
index c01baa9..9cd5add 100644
--- a/pkg/compiler/test/inference/data/foreign.dart
+++ b/pkg/compiler/test/inference/data/foreign.dart
@@ -8,7 +8,7 @@
 /// ignore: IMPORT_INTERNAL_LIBRARY, UNUSED_IMPORT
 import 'dart:_interceptors';
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   jsCallInt();
   jsCallEmpty();
@@ -18,17 +18,17 @@
   jsStringConcat();
 }
 
-/*member: jsCallEmpty:[null|subclass=Object]*/
+/*member: jsCallEmpty:[null|subclass=Object|powerset=1]*/
 jsCallEmpty() => JS('', '#', 0);
 
-/*member: jsCallInt:[subclass=JSInt]*/
+/*member: jsCallInt:[subclass=JSInt|powerset=0]*/
 jsCallInt() => JS('int', '#', 0);
 
-/*member: jsCallVoid:[null|subclass=Object]*/
+/*member: jsCallVoid:[null|subclass=Object|powerset=1]*/
 jsCallVoid() => JS('void', '#', 0);
 
-/*member: jsCallUnion:Union([exact=JSString], [subclass=JSInt])*/
+/*member: jsCallUnion:Union([exact=JSString|powerset=0], [subclass=JSInt|powerset=0], powerset: 0)*/
 jsCallUnion() => JS('int|String', '#', 0);
 
-/*member: jsStringConcat:[exact=JSString]*/
+/*member: jsStringConcat:[exact=JSString|powerset=0]*/
 jsStringConcat() => JS_STRING_CONCAT('a', 'b');
diff --git a/pkg/compiler/test/inference/data/general.dart b/pkg/compiler/test/inference/data/general.dart
index 2bf826e..10b4d4b 100644
--- a/pkg/compiler/test/inference/data/general.dart
+++ b/pkg/compiler/test/inference/data/general.dart
@@ -2,107 +2,109 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: returnNum1:Union([exact=JSNumNotInt], [exact=JSUInt31])*/
-returnNum1(/*Value([exact=JSBool], value: true)*/ a) {
+/*member: returnNum1:Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+returnNum1(/*Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/ a) {
   if (a)
     return 1;
   else
     return 2.5;
 }
 
-/*member: returnNum2:Union([exact=JSNumNotInt], [exact=JSUInt31])*/
-returnNum2(/*Value([exact=JSBool], value: true)*/ a) {
+/*member: returnNum2:Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+returnNum2(/*Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/ a) {
   if (a)
     return 1.4;
   else
     return 2;
 }
 
-/*member: returnInt1:[exact=JSUInt31]*/
-returnInt1(/*Value([exact=JSBool], value: true)*/ a) {
+/*member: returnInt1:[exact=JSUInt31|powerset=0]*/
+returnInt1(/*Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/ a) {
   if (a)
     return 1;
   else
     return 2;
 }
 
-/*member: returnDouble:[exact=JSNumNotInt]*/
-returnDouble(/*Value([exact=JSBool], value: true)*/ a) {
+/*member: returnDouble:[exact=JSNumNotInt|powerset=0]*/
+returnDouble(/*Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/ a) {
   if (a)
     return 1.5;
   else
     return 2.5;
 }
 
-/*member: returnGiveUp:Union([exact=JSString], [exact=JSUInt31])*/
-returnGiveUp(/*Value([exact=JSBool], value: true)*/ a) {
+/*member: returnGiveUp:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+returnGiveUp(/*Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/ a) {
   if (a)
     return 1;
   else
     return 'foo';
 }
 
-/*member: returnInt2:[exact=JSUInt31]*/
+/*member: returnInt2:[exact=JSUInt31|powerset=0]*/
 returnInt2() {
   var a = 42;
-  return a /*invoke: [exact=JSUInt31]*/ ++;
+  return a /*invoke: [exact=JSUInt31|powerset=0]*/ ++;
 }
 
-/*member: returnInt5:[subclass=JSUInt32]*/
+/*member: returnInt5:[subclass=JSUInt32|powerset=0]*/
 returnInt5() {
   var a = 42;
-  return /*invoke: [exact=JSUInt31]*/ ++a;
+  return /*invoke: [exact=JSUInt31|powerset=0]*/ ++a;
 }
 
-/*member: returnInt6:[subclass=JSUInt32]*/
+/*member: returnInt6:[subclass=JSUInt32|powerset=0]*/
 returnInt6() {
   var a = 42;
-  a /*invoke: [exact=JSUInt31]*/ ++;
+  a /*invoke: [exact=JSUInt31|powerset=0]*/ ++;
   return a;
 }
 
-/*member: returnIntOrNull:[null|exact=JSUInt31]*/
-returnIntOrNull(/*Value([exact=JSBool], value: true)*/ a) {
+/*member: returnIntOrNull:[null|exact=JSUInt31|powerset=1]*/
+returnIntOrNull(
+  /*Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/ a,
+) {
   if (a) return 42;
 }
 
-/*member: returnInt3:[exact=JSUInt31]*/
-returnInt3(/*Value([exact=JSBool], value: true)*/ a) {
+/*member: returnInt3:[exact=JSUInt31|powerset=0]*/
+returnInt3(/*Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/ a) {
   if (a) return 42;
   throw 42;
 }
 
-/*member: returnInt4:[exact=JSUInt31]*/
+/*member: returnInt4:[exact=JSUInt31|powerset=0]*/
 returnInt4() {
   return (42);
 }
 
-/*member: returnInt7:[subclass=JSPositiveInt]*/
+/*member: returnInt7:[subclass=JSPositiveInt|powerset=0]*/
 returnInt7() {
-  return 42. /*invoke: [exact=JSUInt31]*/ abs();
+  return 42. /*invoke: [exact=JSUInt31|powerset=0]*/ abs();
 }
 
-/*member: returnInt8:[subclass=JSPositiveInt]*/
+/*member: returnInt8:[subclass=JSPositiveInt|powerset=0]*/
 returnInt8() {
-  return 42. /*invoke: [exact=JSUInt31]*/ remainder(54);
+  return 42. /*invoke: [exact=JSUInt31|powerset=0]*/ remainder(54);
 }
 
-/*member: returnEmpty1:[empty]*/
+/*member: returnEmpty1:[empty|powerset=0]*/
 returnEmpty1() {
   // Ensure that we don't intrinsify a wrong call to [int.remainder].
   dynamic a = 42;
-  return a. /*invoke: [exact=JSUInt31]*/ remainder();
+  return a. /*invoke: [exact=JSUInt31|powerset=0]*/ remainder();
 }
 
-/*member: returnEmpty2:[empty]*/
+/*member: returnEmpty2:[empty|powerset=0]*/
 returnEmpty2() {
   // Ensure that we don't intrinsify a wrong call to [int.abs].
   dynamic a = 42;
-  return a. /*invoke: [exact=JSUInt31]*/ abs(42);
+  return a. /*invoke: [exact=JSUInt31|powerset=0]*/ abs(42);
 }
 
-/*member: testIsCheck1:[subclass=JSInt]*/
-testIsCheck1(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck1:[subclass=JSInt|powerset=0]*/
+testIsCheck1(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a is int) {
     return a;
   } else {
@@ -110,8 +112,8 @@
   }
 }
 
-/*member: testIsCheck2:[subclass=JSInt]*/
-testIsCheck2(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck2:[subclass=JSInt|powerset=0]*/
+testIsCheck2(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a is! int) {
     return 0;
   } else {
@@ -119,8 +121,8 @@
   }
 }
 
-/*member: testIsCheck3:[null|subclass=JSInt]*/
-testIsCheck3(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck3:[null|subclass=JSInt|powerset=1]*/
+testIsCheck3(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a is! int) {
     print('hello');
   } else {
@@ -128,8 +130,8 @@
   }
 }
 
-/*member: testIsCheck4:[subclass=JSInt]*/
-testIsCheck4(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck4:[subclass=JSInt|powerset=0]*/
+testIsCheck4(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a is int) {
     return a;
   } else {
@@ -137,8 +139,8 @@
   }
 }
 
-/*member: testIsCheck5:[subclass=JSInt]*/
-testIsCheck5(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck5:[subclass=JSInt|powerset=0]*/
+testIsCheck5(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a is! int) {
     return 42;
   } else {
@@ -146,8 +148,8 @@
   }
 }
 
-/*member: testIsCheck6:[null|subclass=Object]*/
-testIsCheck6(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck6:[null|subclass=Object|powerset=1]*/
+testIsCheck6(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a is! int) {
     return a;
   } else {
@@ -155,8 +157,8 @@
   }
 }
 
-/*member: testIsCheck7:[subclass=JSInt]*/
-testIsCheck7(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck7:[subclass=JSInt|powerset=0]*/
+testIsCheck7(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a == 'foo' && a is int) {
     return a;
   } else {
@@ -164,8 +166,8 @@
   }
 }
 
-/*member: testIsCheck8:[null|subclass=Object]*/
-testIsCheck8(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck8:[null|subclass=Object|powerset=1]*/
+testIsCheck8(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a == 'foo' || a is int) {
     return a;
   } else {
@@ -173,36 +175,36 @@
   }
 }
 
-/*member: testIsCheck9:[subclass=JSInt]*/
-testIsCheck9(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck9:[subclass=JSInt|powerset=0]*/
+testIsCheck9(/*[null|subclass=Object|powerset=1]*/ a) {
   return a is int ? a : 42;
 }
 
-/*member: testIsCheck10:[null|subclass=Object]*/
-testIsCheck10(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck10:[null|subclass=Object|powerset=1]*/
+testIsCheck10(/*[null|subclass=Object|powerset=1]*/ a) {
   return a is! int ? a : 42;
 }
 
-/*member: testIsCheck11:[subclass=JSInt]*/
-testIsCheck11(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck11:[subclass=JSInt|powerset=0]*/
+testIsCheck11(/*[null|subclass=Object|powerset=1]*/ a) {
   return a is! int ? 42 : a;
 }
 
-/*member: testIsCheck12:[null|subclass=Object]*/
-testIsCheck12(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck12:[null|subclass=Object|powerset=1]*/
+testIsCheck12(/*[null|subclass=Object|powerset=1]*/ a) {
   return a is int ? 42 : a;
 }
 
-/*member: testIsCheck13:[subclass=JSInt]*/
-testIsCheck13(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck13:[subclass=JSInt|powerset=0]*/
+testIsCheck13(/*[null|subclass=Object|powerset=1]*/ a) {
   while (a is int) {
     return a;
   }
   return 42;
 }
 
-/*member: testIsCheck14:[null|subclass=Object]*/
-testIsCheck14(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck14:[null|subclass=Object|powerset=1]*/
+testIsCheck14(/*[null|subclass=Object|powerset=1]*/ a) {
   while (a is! int) {
     return 42;
   }
@@ -210,8 +212,8 @@
 }
 
 // TODO(29309): Change to [subclass=JSInt] when 29309 is fixed.
-/*member: testIsCheck15:[null|subclass=Object]*/
-testIsCheck15(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck15:[null|subclass=Object|powerset=1]*/
+testIsCheck15(/*[null|subclass=Object|powerset=1]*/ a) {
   dynamic c = 42;
   do {
     if (a) return c;
@@ -220,8 +222,8 @@
   return 42;
 }
 
-/*member: testIsCheck16:[null|subclass=Object]*/
-testIsCheck16(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck16:[null|subclass=Object|powerset=1]*/
+testIsCheck16(/*[null|subclass=Object|powerset=1]*/ a) {
   dynamic c = 42;
   do {
     if (a) return c;
@@ -230,8 +232,8 @@
   return 42;
 }
 
-/*member: testIsCheck17:[subclass=JSInt]*/
-testIsCheck17(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck17:[subclass=JSInt|powerset=0]*/
+testIsCheck17(/*[null|subclass=Object|powerset=1]*/ a) {
   dynamic c = 42;
   for (; c is int;) {
     if (a) return c;
@@ -240,8 +242,8 @@
   return 42;
 }
 
-/*member: testIsCheck18:[null|subclass=Object]*/
-testIsCheck18(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck18:[null|subclass=Object|powerset=1]*/
+testIsCheck18(/*[null|subclass=Object|powerset=1]*/ a) {
   dynamic c = 42;
   for (; c is int;) {
     if (a) return c;
@@ -250,8 +252,8 @@
   return c;
 }
 
-/*member: testIsCheck19:[null|subclass=Object]*/
-testIsCheck19(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck19:[null|subclass=Object|powerset=1]*/
+testIsCheck19(/*[null|subclass=Object|powerset=1]*/ a) {
   dynamic c = 42;
   for (; c is! int;) {
     if (a) return c;
@@ -260,7 +262,7 @@
   return 42;
 }
 
-/*member: testIsCheck20:[exact=JSUInt31]*/
+/*member: testIsCheck20:[exact=JSUInt31|powerset=0]*/
 testIsCheck20() {
   var c = topLevelGetter();
   if (c != null && c is! bool && c is! int) {
@@ -272,8 +274,8 @@
   }
 }
 
-/*member: testIsCheck21:Union([subclass=JSArray], [subclass=JSInt])*/
-testIsCheck21(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck21:Union([subclass=JSArray|powerset=0], [subclass=JSInt|powerset=0], powerset: 0)*/
+testIsCheck21(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a is int || a is List) {
     return a;
   } else {
@@ -281,31 +283,31 @@
   }
 }
 
-/*member: testIsCheck22:Union([subclass=JSArray], [subclass=JSInt])*/
-testIsCheck22(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck22:Union([subclass=JSArray|powerset=0], [subclass=JSInt|powerset=0], powerset: 0)*/
+testIsCheck22(/*[null|subclass=Object|powerset=1]*/ a) {
   return (a is int || a is List) ? a : 42;
 }
 
-/*member: testIsCheck23:[subclass=JSInt]*/
-testIsCheck23(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck23:[subclass=JSInt|powerset=0]*/
+testIsCheck23(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a is! int) throw 'foo';
   return a;
 }
 
-/*member: testIsCheck24:[subclass=JSInt]*/
-testIsCheck24(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck24:[subclass=JSInt|powerset=0]*/
+testIsCheck24(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a is! int) return 42;
   return a;
 }
 
-/*member: testIsCheck25:[null|subclass=Object]*/
-testIsCheck25(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck25:[null|subclass=Object|powerset=1]*/
+testIsCheck25(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a is int) throw 'foo';
   return a;
 }
 
-/*member: testIsCheck26:[subclass=JSInt]*/
-testIsCheck26(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck26:[subclass=JSInt|powerset=0]*/
+testIsCheck26(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a is int) {
   } else {
     throw 42;
@@ -313,8 +315,8 @@
   return a;
 }
 
-/*member: testIsCheck27:[subclass=JSInt]*/
-testIsCheck27(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck27:[subclass=JSInt|powerset=0]*/
+testIsCheck27(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a is int) {
   } else {
     return 42;
@@ -322,21 +324,21 @@
   return a;
 }
 
-/*member: testIsCheck28:[null|subclass=Object]*/
-testIsCheck28(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck28:[null|subclass=Object|powerset=1]*/
+testIsCheck28(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a is int) {
   } else {}
   return a;
 }
 
-/*member: testIsCheck29:[null|subclass=Object]*/
-testIsCheck29(/*[null|subclass=Object]*/ a) {
+/*member: testIsCheck29:[null|subclass=Object|powerset=1]*/
+testIsCheck29(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a is int) {}
   return a;
 }
 
-/*member: testIf1:[null|exact=JSUInt31]*/
-testIf1(/*[null|subclass=Object]*/ a) {
+/*member: testIf1:[null|exact=JSUInt31|powerset=1]*/
+testIf1(/*[null|subclass=Object|powerset=1]*/ a) {
   var c = null;
   if (a) {
     c = 10;
@@ -344,8 +346,8 @@
   return c;
 }
 
-/*member: testIf2:[null|exact=JSUInt31]*/
-testIf2(/*[null|subclass=Object]*/ a) {
+/*member: testIf2:[null|exact=JSUInt31|powerset=1]*/
+testIf2(/*[null|subclass=Object|powerset=1]*/ a) {
   var c = null;
   if (a) {
   } else {
@@ -354,12 +356,12 @@
   return c;
 }
 
-/*member: returnAsString:[exact=JSString]*/
+/*member: returnAsString:[exact=JSString|powerset=0]*/
 returnAsString() {
   return topLevelGetter() as String;
 }
 
-/*member: returnIntAsNum:[exact=JSUInt31]*/
+/*member: returnIntAsNum:[exact=JSUInt31|powerset=0]*/
 returnIntAsNum() {
   dynamic a = 0;
   return a as num;
@@ -367,24 +369,28 @@
 
 typedef int Foo();
 
-/*member: returnAsTypedef:[subclass=Closure]*/
+/*member: returnAsTypedef:[subclass=Closure|powerset=0]*/
 returnAsTypedef() {
   return topLevelGetter() as Foo;
 }
 
-/*member: testDeadCode:[exact=JSUInt31]*/
+/*member: testDeadCode:[exact=JSUInt31|powerset=0]*/
 testDeadCode() {
   return 42;
   // ignore: dead_code
   return 'foo';
 }
 
-/*member: testLabeledIf:[null|exact=JSUInt31]*/
-testLabeledIf(/*Value([exact=JSBool], value: true)*/ a) {
+/*member: testLabeledIf:[null|exact=JSUInt31|powerset=1]*/
+testLabeledIf(
+  /*Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/ a,
+) {
   var c;
   L1:
-  if (a /*invoke: Value([exact=JSBool], value: true)*/ > 1) {
-    if (a /*invoke: Value([exact=JSBool], value: true)*/ == 2) {
+  if (a /*invoke: Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/ >
+      1) {
+    if (a /*invoke: Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/ ==
+        2) {
       break L1;
     }
     c = 42;
@@ -394,7 +400,7 @@
   return c;
 }
 
-/*member: testSwitch1:Union(null, [exact=JSNumNotInt], [exact=JSUInt31])*/
+/*member: testSwitch1:Union(null, [exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
 testSwitch1() {
   var a = null;
   switch (topLevelGetter) {
@@ -408,7 +414,7 @@
   return a;
 }
 
-/*member: testSwitch2:[exact=JSUInt31]*/
+/*member: testSwitch2:[exact=JSUInt31|powerset=0]*/
 testSwitch2() {
   var a = null;
   switch (topLevelGetter) {
@@ -424,14 +430,16 @@
   return a;
 }
 
-/*member: testSwitch3:Union(null, [exact=JSString], [subclass=JSNumber])*/
+/*member: testSwitch3:Union(null, [exact=JSString|powerset=0], [subclass=JSNumber|powerset=0], powerset: 1)*/
 testSwitch3() {
   dynamic a = 42;
   var b;
   switch (topLevelGetter) {
     L1:
     case 1:
-      b = a /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ + 42;
+      b =
+          a /*invoke: Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ +
+          42;
       break;
     case 2:
       a = 'foo';
@@ -440,7 +448,7 @@
   return b;
 }
 
-/*member: testSwitch4:[exact=JSUInt31]*/
+/*member: testSwitch4:[exact=JSUInt31|powerset=0]*/
 testSwitch4() {
   switch (topLevelGetter) {
     case 1:
@@ -451,7 +459,7 @@
   return 42;
 }
 
-/*member: testSwitch5:[exact=JSUInt31]*/
+/*member: testSwitch5:[exact=JSUInt31|powerset=0]*/
 testSwitch5() {
   switch (topLevelGetter) {
     case 1:
@@ -461,13 +469,16 @@
   }
 }
 
-/*member: testContinue1:Union(null, [exact=JSString], [subclass=JSNumber])*/
+/*member: testContinue1:Union(null, [exact=JSString|powerset=0], [subclass=JSNumber|powerset=0], powerset: 1)*/
 testContinue1() {
   dynamic a = 42;
   var b;
   while (true) {
-    b = a /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ + 54;
-    if (b /*invoke: Union([exact=JSString], [subclass=JSNumber])*/ == 42)
+    b =
+        a /*invoke: Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ +
+        54;
+    if (b /*invoke: Union([exact=JSString|powerset=0], [subclass=JSNumber|powerset=0], powerset: 0)*/ ==
+        42)
       continue;
     a = 'foo';
   }
@@ -475,25 +486,25 @@
   return b;
 }
 
-/*member: testBreak1:Union(null, [exact=JSString], [subclass=JSUInt32])*/
+/*member: testBreak1:Union(null, [exact=JSString|powerset=0], [subclass=JSUInt32|powerset=0], powerset: 1)*/
 testBreak1() {
   var a = 42;
   var b;
   while (true) {
-    b = a /*invoke: [exact=JSUInt31]*/ + 54;
-    if (b /*invoke: [subclass=JSUInt32]*/ == 42) break;
+    b = a /*invoke: [exact=JSUInt31|powerset=0]*/ + 54;
+    if (b /*invoke: [subclass=JSUInt32|powerset=0]*/ == 42) break;
     b = 'foo';
   }
   return b;
 }
 
-/*member: testContinue2:Union(null, [exact=JSString], [subclass=JSUInt32])*/
+/*member: testContinue2:Union(null, [exact=JSString|powerset=0], [subclass=JSUInt32|powerset=0], powerset: 1)*/
 testContinue2() {
   var a = 42;
   var b;
   while (true) {
-    b = a /*invoke: [exact=JSUInt31]*/ + 54;
-    if (b /*invoke: [subclass=JSUInt32]*/ == 42) {
+    b = a /*invoke: [exact=JSUInt31|powerset=0]*/ + 54;
+    if (b /*invoke: [subclass=JSUInt32|powerset=0]*/ == 42) {
       b = 'foo';
       continue;
     }
@@ -502,13 +513,13 @@
   return b;
 }
 
-/*member: testBreak2:[null|subclass=JSUInt32]*/
+/*member: testBreak2:[null|subclass=JSUInt32|powerset=1]*/
 testBreak2() {
   dynamic a = 42;
   var b;
   while (true) {
-    b = a /*invoke: [exact=JSUInt31]*/ + 54;
-    if (b /*invoke: [subclass=JSUInt32]*/ == 42) {
+    b = a /*invoke: [exact=JSUInt31|powerset=0]*/ + 54;
+    if (b /*invoke: [subclass=JSUInt32|powerset=0]*/ == 42) {
       a = 'foo';
       break;
     }
@@ -516,25 +527,25 @@
   return b;
 }
 
-/*member: testReturnElementOfConstList1:[exact=JSUInt31]*/
+/*member: testReturnElementOfConstList1:[exact=JSUInt31|powerset=0]*/
 testReturnElementOfConstList1() {
   return const [
     42,
-  ] /*Container([exact=JSUnmodifiableArray], element: [exact=JSUInt31], length: 1)*/ [0];
+  ] /*Container([exact=JSUnmodifiableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/ [0];
 }
 
-/*member: testReturnElementOfConstList2:[exact=JSUInt31]*/
+/*member: testReturnElementOfConstList2:[exact=JSUInt31|powerset=0]*/
 testReturnElementOfConstList2() {
-  return topLevelConstList /*Container([exact=JSUnmodifiableArray], element: [exact=JSUInt31], length: 1)*/ [0];
+  return topLevelConstList /*Container([exact=JSUnmodifiableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/ [0];
 }
 
-/*member: testReturnItselfOrInt:[exact=JSUInt31]*/
-testReturnItselfOrInt(/*[null|subclass=Object]*/ a) {
+/*member: testReturnItselfOrInt:[exact=JSUInt31|powerset=0]*/
+testReturnItselfOrInt(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a) return 42;
   return testReturnItselfOrInt(a);
 }
 
-/*member: testDoWhile1:Value([exact=JSString], value: "foo")*/
+/*member: testDoWhile1:Value([exact=JSString|powerset=0], value: "foo", powerset: 0)*/
 testDoWhile1() {
   dynamic a = 42;
   do {
@@ -544,7 +555,7 @@
   return a;
 }
 
-/*member: testDoWhile2:[null]*/
+/*member: testDoWhile2:[null|powerset=1]*/
 testDoWhile2() {
   dynamic a = 42;
   do {
@@ -556,10 +567,11 @@
   return a;
 }
 
-/*member: _#flag:[exact=_Cell]*/
-late bool /*Value([exact=JSBool], value: true)*/ /*update: [exact=_Cell]*/ flag;
+/*member: _#flag:[exact=_Cell|powerset=0]*/
+late bool /*Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/ /*update: [exact=_Cell|powerset=0]*/
+flag;
 
-/*member: testDoWhile3:Value([exact=JSBool], value: false)*/
+/*member: testDoWhile3:Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/
 testDoWhile3() {
   dynamic a = 42;
   do {
@@ -571,7 +583,7 @@
   return a;
 }
 
-/*member: testDoWhile4:Union([exact=JSNumNotInt], [exact=JSUInt31])*/
+/*member: testDoWhile4:Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 testDoWhile4() {
   dynamic a = 'foo';
   do {
@@ -582,261 +594,269 @@
   return a;
 }
 
-/*member: testSpecialization1:[subclass=Object]*/
+/*member: testSpecialization1:[subclass=Object|powerset=0]*/
 testSpecialization1() {
   var a = topLevelGetter();
   a - 42;
   return a;
 }
 
-/*member: testSpecialization2:[null|subclass=Object]*/
+/*member: testSpecialization2:[null|subclass=Object|powerset=1]*/
 testSpecialization2() {
   var a = topLevelGetter();
   // Make [a] a captured variable. This should disable receiver
   // specialization on [a].
   (
-  /*[exact=JSString]*/
+  /*[exact=JSString|powerset=0]*/
   () => a.toString())();
   a - 42;
   return a;
 }
 
-/*member: testSpecialization3:[null|exact=JSUInt31]*/
+/*member: testSpecialization3:[null|exact=JSUInt31|powerset=1]*/
 testSpecialization3() {
   var a = returnDynamic() ? null : 42;
-  a. /*invoke: [null|exact=JSUInt31]*/ toString();
+  a. /*invoke: [null|exact=JSUInt31|powerset=1]*/ toString();
   // Test that calling an [Object] method on [a] will not lead to
   // infer that [a] is not null;
   return a;
 }
 
-/*member: testReturnNull1:[null]*/
-testReturnNull1(/*[null|subclass=Object]*/ a) {
+/*member: testReturnNull1:[null|powerset=1]*/
+testReturnNull1(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a == null) return a;
   return null;
 }
 
-/*member: testReturnNull2:[null]*/
-testReturnNull2(/*[null|subclass=Object]*/ a) {
+/*member: testReturnNull2:[null|powerset=1]*/
+testReturnNull2(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a != null) return null;
   return a;
 }
 
-/*member: testReturnNull3:[subclass=Object]*/
-testReturnNull3(/*[null|subclass=Object]*/ a) {
+/*member: testReturnNull3:[subclass=Object|powerset=0]*/
+testReturnNull3(/*[null|subclass=Object|powerset=1]*/ a) {
   if (a == null) return 42;
   return a;
 }
 
-/*member: testReturnNull4:[null]*/
+/*member: testReturnNull4:[null|powerset=1]*/
 testReturnNull4() {
   var a = topLevelGetter();
   if (a == null) return a;
   return null;
 }
 
-/*member: testReturnNull5:[null]*/
+/*member: testReturnNull5:[null|powerset=1]*/
 testReturnNull5() {
   var a = topLevelGetter();
   if (a != null) return null;
   return a;
 }
 
-/*member: testReturnNull6:[subclass=Object]*/
+/*member: testReturnNull6:[subclass=Object|powerset=0]*/
 testReturnNull6() {
   var a = topLevelGetter();
   if (a == null) return 42;
   return a;
 }
 
-/*member: testReturnNotEquals:[exact=JSBool]*/
+/*member: testReturnNotEquals:[exact=JSBool|powerset=0]*/
 testReturnNotEquals() {
-  return A() /*invoke: [exact=A]*/ != 54;
+  return A() /*invoke: [exact=A|powerset=0]*/ != 54;
 }
 
-/*member: testReturnInvokeDynamicGetter:[null|subclass=Object]*/
-testReturnInvokeDynamicGetter() => A().myFactory /*invoke: [exact=A]*/ ();
+/*member: testReturnInvokeDynamicGetter:[null|subclass=Object|powerset=1]*/
+testReturnInvokeDynamicGetter() =>
+    A().myFactory /*invoke: [exact=A|powerset=0]*/ ();
 
-/*member: topLevelConstList:Container([exact=JSUnmodifiableArray], element: [exact=JSUInt31], length: 1)*/
+/*member: topLevelConstList:Container([exact=JSUnmodifiableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
 var topLevelConstList = const [42];
 
-/*member: topLevelGetter:[exact=JSUInt31]*/
+/*member: topLevelGetter:[exact=JSUInt31|powerset=0]*/
 get topLevelGetter => 42;
 
-/*member: returnDynamic:[null|subclass=Object]*/
+/*member: returnDynamic:[null|subclass=Object|powerset=1]*/
 returnDynamic() => topLevelGetter(42);
 
-/*member: returnTopLevelGetter:[exact=JSUInt31]*/
+/*member: returnTopLevelGetter:[exact=JSUInt31|powerset=0]*/
 returnTopLevelGetter() => topLevelGetter;
 
 class A {
   factory A() = A.generative;
 
-  /*member: A.generative:[exact=A]*/
+  /*member: A.generative:[exact=A|powerset=0]*/
   A.generative();
 
-  /*member: A.==:[exact=JSBool]*/
-  operator ==(/*Union([exact=JSString], [exact=JSUInt31])*/ other) =>
-      42 as dynamic;
+  /*member: A.==:[exact=JSBool|powerset=0]*/
+  operator ==(
+    /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ other,
+  ) => 42 as dynamic;
 
-  /*member: A.myField:[exact=JSUInt31]*/
+  /*member: A.myField:[exact=JSUInt31|powerset=0]*/
   get myField => 42;
 
-  set myField(/*[subclass=JSUInt32]*/ a) {}
+  set myField(/*[subclass=JSUInt32|powerset=0]*/ a) {}
 
-  /*member: A.returnInt1:[subclass=JSUInt32]*/
-  returnInt1() => /*invoke: [exact=JSUInt31]*/
-      ++ /*[subclass=A]*/ /*update: [subclass=A]*/ myField;
+  /*member: A.returnInt1:[subclass=JSUInt32|powerset=0]*/
+  returnInt1() => /*invoke: [exact=JSUInt31|powerset=0]*/
+      ++ /*[subclass=A|powerset=0]*/ /*update: [subclass=A|powerset=0]*/ myField;
 
-  /*member: A.returnInt2:[subclass=JSUInt32]*/
-  returnInt2() => /*invoke: [exact=JSUInt31]*/
-      ++this. /*[subclass=A]*/ /*update: [subclass=A]*/ myField;
+  /*member: A.returnInt2:[subclass=JSUInt32|powerset=0]*/
+  returnInt2() => /*invoke: [exact=JSUInt31|powerset=0]*/
+      ++this
+          . /*[subclass=A|powerset=0]*/ /*update: [subclass=A|powerset=0]*/ myField;
 
-  /*member: A.returnInt3:[subclass=JSUInt32]*/
+  /*member: A.returnInt3:[subclass=JSUInt32|powerset=0]*/
   returnInt3() =>
-      this. /*[subclass=A]*/ /*update: [subclass=A]*/ myField /*invoke: [exact=JSUInt31]*/ +=
+      this. /*[subclass=A|powerset=0]*/ /*update: [subclass=A|powerset=0]*/ myField /*invoke: [exact=JSUInt31|powerset=0]*/ +=
           42;
 
-  /*member: A.returnInt4:[subclass=JSUInt32]*/
-  returnInt4() => /*[subclass=A]*/ /*update: [subclass=A]*/
-      myField /*invoke: [exact=JSUInt31]*/ += 42;
+  /*member: A.returnInt4:[subclass=JSUInt32|powerset=0]*/
+  returnInt4() => /*[subclass=A|powerset=0]*/ /*update: [subclass=A|powerset=0]*/
+      myField /*invoke: [exact=JSUInt31|powerset=0]*/ += 42;
 
-  /*member: A.[]:[exact=JSUInt31]*/
-  operator [](/*[exact=JSUInt31]*/ index) => 42;
+  /*member: A.[]:[exact=JSUInt31|powerset=0]*/
+  operator [](/*[exact=JSUInt31|powerset=0]*/ index) => 42;
 
-  /*member: A.[]=:[null]*/
-  operator []=(/*[exact=JSUInt31]*/ index, /*[subclass=JSUInt32]*/ value) {}
+  /*member: A.[]=:[null|powerset=1]*/
+  operator []=(
+    /*[exact=JSUInt31|powerset=0]*/ index,
+    /*[subclass=JSUInt32|powerset=0]*/ value,
+  ) {}
 
-  /*member: A.returnInt5:[subclass=JSUInt32]*/
-  returnInt5() => /*invoke: [exact=JSUInt31]*/
-      ++this /*[subclass=A]*/ /*update: [subclass=A]*/ [0];
+  /*member: A.returnInt5:[subclass=JSUInt32|powerset=0]*/
+  returnInt5() => /*invoke: [exact=JSUInt31|powerset=0]*/
+      ++this /*[subclass=A|powerset=0]*/ /*update: [subclass=A|powerset=0]*/ [0];
 
-  /*member: A.returnInt6:[subclass=JSUInt32]*/
+  /*member: A.returnInt6:[subclass=JSUInt32|powerset=0]*/
   returnInt6() =>
-      this /*[subclass=A]*/ /*update: [subclass=A]*/ [0] /*invoke: [exact=JSUInt31]*/ +=
+      this /*[subclass=A|powerset=0]*/ /*update: [subclass=A|powerset=0]*/ [0] /*invoke: [exact=JSUInt31|powerset=0]*/ +=
           1;
 
-  /*member: A.myFactory:[subclass=Closure]*/
-  get myFactory => /*[exact=JSUInt31]*/ () => 42;
+  /*member: A.myFactory:[subclass=Closure|powerset=0]*/
+  get myFactory => /*[exact=JSUInt31|powerset=0]*/ () => 42;
 }
 
 class B extends A {
-  /*member: B.:[exact=B]*/
+  /*member: B.:[exact=B|powerset=0]*/
   B() : super.generative();
 
-  /*member: B.returnInt1:[subclass=JSUInt32]*/
-  returnInt1() => /*invoke: [exact=JSUInt31]*/
-      ++new A(). /*[exact=A]*/ /*update: [exact=A]*/ myField;
+  /*member: B.returnInt1:[subclass=JSUInt32|powerset=0]*/
+  returnInt1() => /*invoke: [exact=JSUInt31|powerset=0]*/
+      ++new A()
+          . /*[exact=A|powerset=0]*/ /*update: [exact=A|powerset=0]*/ myField;
 
-  /*member: B.returnInt2:[subclass=JSUInt32]*/
+  /*member: B.returnInt2:[subclass=JSUInt32|powerset=0]*/
   returnInt2() =>
-      A(). /*[exact=A]*/ /*update: [exact=A]*/ myField /*invoke: [exact=JSUInt31]*/ +=
+      A(). /*[exact=A|powerset=0]*/ /*update: [exact=A|powerset=0]*/ myField /*invoke: [exact=JSUInt31|powerset=0]*/ +=
           4;
 
-  /*member: B.returnInt3:[subclass=JSUInt32]*/
-  returnInt3() => /*invoke: [exact=JSUInt31]*/
-      ++new A() /*[exact=A]*/ /*update: [exact=A]*/ [0];
+  /*member: B.returnInt3:[subclass=JSUInt32|powerset=0]*/
+  returnInt3() => /*invoke: [exact=JSUInt31|powerset=0]*/
+      ++new A() /*[exact=A|powerset=0]*/ /*update: [exact=A|powerset=0]*/ [0];
 
-  /*member: B.returnInt4:[subclass=JSUInt32]*/
+  /*member: B.returnInt4:[subclass=JSUInt32|powerset=0]*/
   returnInt4() =>
-      A() /*[exact=A]*/ /*update: [exact=A]*/ [0] /*invoke: [exact=JSUInt31]*/ +=
+      A() /*[exact=A|powerset=0]*/ /*update: [exact=A|powerset=0]*/ [0] /*invoke: [exact=JSUInt31|powerset=0]*/ +=
           42;
 
-  /*member: B.returnInt5:[subclass=JSUInt32]*/
-  returnInt5() => /*invoke: [exact=JSUInt31]*/ ++super.myField;
+  /*member: B.returnInt5:[subclass=JSUInt32|powerset=0]*/
+  returnInt5() => /*invoke: [exact=JSUInt31|powerset=0]*/ ++super.myField;
 
-  /*member: B.returnInt6:[subclass=JSUInt32]*/
-  returnInt6() => super.myField /*invoke: [exact=JSUInt31]*/ += 4;
+  /*member: B.returnInt6:[subclass=JSUInt32|powerset=0]*/
+  returnInt6() => super.myField /*invoke: [exact=JSUInt31|powerset=0]*/ += 4;
 
-  /*member: B.returnInt7:[subclass=JSUInt32]*/
-  returnInt7() => /*invoke: [exact=JSUInt31]*/ ++super[0];
+  /*member: B.returnInt7:[subclass=JSUInt32|powerset=0]*/
+  returnInt7() => /*invoke: [exact=JSUInt31|powerset=0]*/ ++super[0];
 
-  /*member: B.returnInt8:[subclass=JSUInt32]*/
-  returnInt8() => super[0] /*invoke: [exact=JSUInt31]*/ += 54;
+  /*member: B.returnInt8:[subclass=JSUInt32|powerset=0]*/
+  returnInt8() => super[0] /*invoke: [exact=JSUInt31|powerset=0]*/ += 54;
 
-  /*member: B.returnInt9:[exact=JSUInt31]*/
+  /*member: B.returnInt9:[exact=JSUInt31|powerset=0]*/
   returnInt9() => super.myField;
 }
 
 class C {
-  /*member: C.myField:[subclass=JSPositiveInt]*/
+  /*member: C.myField:[subclass=JSPositiveInt|powerset=0]*/
   var myField = 42;
 
-  /*member: C.:[exact=C]*/
+  /*member: C.:[exact=C|powerset=0]*/
   C();
 
-  /*member: C.returnInt1:[subclass=JSPositiveInt]*/
-  returnInt1() => /*invoke: [subclass=JSPositiveInt]*/
-      ++ /*update: [exact=C]*/ /*[exact=C]*/ myField;
+  /*member: C.returnInt1:[subclass=JSPositiveInt|powerset=0]*/
+  returnInt1() => /*invoke: [subclass=JSPositiveInt|powerset=0]*/
+      ++ /*update: [exact=C|powerset=0]*/ /*[exact=C|powerset=0]*/ myField;
 
-  /*member: C.returnInt2:[subclass=JSPositiveInt]*/
-  returnInt2() => /*invoke: [subclass=JSPositiveInt]*/
-      ++this. /*[exact=C]*/ /*update: [exact=C]*/ myField;
+  /*member: C.returnInt2:[subclass=JSPositiveInt|powerset=0]*/
+  returnInt2() => /*invoke: [subclass=JSPositiveInt|powerset=0]*/
+      ++this. /*[exact=C|powerset=0]*/ /*update: [exact=C|powerset=0]*/ myField;
 
-  /*member: C.returnInt3:[subclass=JSPositiveInt]*/
+  /*member: C.returnInt3:[subclass=JSPositiveInt|powerset=0]*/
   returnInt3() =>
-      this. /*[exact=C]*/ /*update: [exact=C]*/ myField /*invoke: [subclass=JSPositiveInt]*/ +=
+      this. /*[exact=C|powerset=0]*/ /*update: [exact=C|powerset=0]*/ myField /*invoke: [subclass=JSPositiveInt|powerset=0]*/ +=
           42;
 
-  /*member: C.returnInt4:[subclass=JSPositiveInt]*/
-  returnInt4() => /*[exact=C]*/ /*update: [exact=C]*/
-      myField /*invoke: [subclass=JSPositiveInt]*/ += 42;
+  /*member: C.returnInt4:[subclass=JSPositiveInt|powerset=0]*/
+  returnInt4() => /*[exact=C|powerset=0]*/ /*update: [exact=C|powerset=0]*/
+      myField /*invoke: [subclass=JSPositiveInt|powerset=0]*/ += 42;
 
-  /*member: C.[]:[subclass=JSPositiveInt]*/
-  operator [](/*[exact=JSUInt31]*/ index) => /*[exact=C]*/ myField;
+  /*member: C.[]:[subclass=JSPositiveInt|powerset=0]*/
+  operator [](/*[exact=JSUInt31|powerset=0]*/ index) => /*[exact=C|powerset=0]*/
+      myField;
 
-  /*member: C.[]=:[null]*/
+  /*member: C.[]=:[null|powerset=1]*/
   operator []=(
-    /*[exact=JSUInt31]*/ index,
-    /*[subclass=JSPositiveInt]*/ value,
+    /*[exact=JSUInt31|powerset=0]*/ index,
+    /*[subclass=JSPositiveInt|powerset=0]*/ value,
   ) {}
 
-  /*member: C.returnInt5:[subclass=JSPositiveInt]*/
-  returnInt5() => /*invoke: [subclass=JSPositiveInt]*/
-      ++this /*[exact=C]*/ /*update: [exact=C]*/ [0];
+  /*member: C.returnInt5:[subclass=JSPositiveInt|powerset=0]*/
+  returnInt5() => /*invoke: [subclass=JSPositiveInt|powerset=0]*/
+      ++this /*[exact=C|powerset=0]*/ /*update: [exact=C|powerset=0]*/ [0];
 
-  /*member: C.returnInt6:[subclass=JSPositiveInt]*/
+  /*member: C.returnInt6:[subclass=JSPositiveInt|powerset=0]*/
   returnInt6() =>
-      this /*[exact=C]*/ /*update: [exact=C]*/ [0] /*invoke: [subclass=JSPositiveInt]*/ +=
+      this /*[exact=C|powerset=0]*/ /*update: [exact=C|powerset=0]*/ [0] /*invoke: [subclass=JSPositiveInt|powerset=0]*/ +=
           1;
 }
 
-/*member: testCascade1:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: null)*/
+/*member: testCascade1:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: null, powerset: 0)*/
 testCascade1() {
   return [1, 2, 3]
-    .. /*invoke: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: null)*/ add(
+    .. /*invoke: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: null, powerset: 0)*/ add(
       4,
     )
-    .. /*invoke: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: null)*/ add(
+    .. /*invoke: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: null, powerset: 0)*/ add(
       5,
     );
 }
 
-/*member: testCascade2:[exact=CascadeHelper]*/
+/*member: testCascade2:[exact=CascadeHelper|powerset=0]*/
 testCascade2() {
   return CascadeHelper()
-    .. /*update: [exact=CascadeHelper]*/ a = "hello"
-    .. /*update: [exact=CascadeHelper]*/ b = 42
-    .. /*[exact=CascadeHelper]*/ i /*invoke: [subclass=JSPositiveInt]*/ /*update: [exact=CascadeHelper]*/ +=
+    .. /*update: [exact=CascadeHelper|powerset=0]*/ a = "hello"
+    .. /*update: [exact=CascadeHelper|powerset=0]*/ b = 42
+    .. /*[exact=CascadeHelper|powerset=0]*/ i /*invoke: [subclass=JSPositiveInt|powerset=0]*/ /*update: [exact=CascadeHelper|powerset=0]*/ +=
         1;
 }
 
-/*member: CascadeHelper.:[exact=CascadeHelper]*/
+/*member: CascadeHelper.:[exact=CascadeHelper|powerset=0]*/
 class CascadeHelper {
-  /*member: CascadeHelper.a:Value([null|exact=JSString], value: "hello")*/
+  /*member: CascadeHelper.a:Value([null|exact=JSString|powerset=1], value: "hello", powerset: 1)*/
   var a;
 
-  /*member: CascadeHelper.b:[null|exact=JSUInt31]*/
+  /*member: CascadeHelper.b:[null|exact=JSUInt31|powerset=1]*/
   var b;
 
-  /*member: CascadeHelper.i:[subclass=JSPositiveInt]*/
+  /*member: CascadeHelper.i:[subclass=JSPositiveInt|powerset=0]*/
   var i = 0;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   // Ensure a function class is being instantiated.
-  /*[exact=JSUInt31]*/
+  /*[exact=JSUInt31|powerset=0]*/
   () => 42;
   returnNum1(true);
   returnNum2(true);
@@ -904,33 +924,33 @@
   testDoWhile2();
   testDoWhile3();
   testDoWhile4();
-  A() /*invoke: [subclass=A]*/ == null;
+  A() /*invoke: [subclass=A|powerset=0]*/ == null;
   A()
-    .. /*invoke: [exact=A]*/ returnInt1()
-    .. /*invoke: [exact=A]*/ returnInt2()
-    .. /*invoke: [exact=A]*/ returnInt3()
-    .. /*invoke: [exact=A]*/ returnInt4()
-    .. /*invoke: [exact=A]*/ returnInt5()
-    .. /*invoke: [exact=A]*/ returnInt6();
+    .. /*invoke: [exact=A|powerset=0]*/ returnInt1()
+    .. /*invoke: [exact=A|powerset=0]*/ returnInt2()
+    .. /*invoke: [exact=A|powerset=0]*/ returnInt3()
+    .. /*invoke: [exact=A|powerset=0]*/ returnInt4()
+    .. /*invoke: [exact=A|powerset=0]*/ returnInt5()
+    .. /*invoke: [exact=A|powerset=0]*/ returnInt6();
 
   B()
-    .. /*invoke: [exact=B]*/ returnInt1()
-    .. /*invoke: [exact=B]*/ returnInt2()
-    .. /*invoke: [exact=B]*/ returnInt3()
-    .. /*invoke: [exact=B]*/ returnInt4()
-    .. /*invoke: [exact=B]*/ returnInt5()
-    .. /*invoke: [exact=B]*/ returnInt6()
-    .. /*invoke: [exact=B]*/ returnInt7()
-    .. /*invoke: [exact=B]*/ returnInt8()
-    .. /*invoke: [exact=B]*/ returnInt9();
+    .. /*invoke: [exact=B|powerset=0]*/ returnInt1()
+    .. /*invoke: [exact=B|powerset=0]*/ returnInt2()
+    .. /*invoke: [exact=B|powerset=0]*/ returnInt3()
+    .. /*invoke: [exact=B|powerset=0]*/ returnInt4()
+    .. /*invoke: [exact=B|powerset=0]*/ returnInt5()
+    .. /*invoke: [exact=B|powerset=0]*/ returnInt6()
+    .. /*invoke: [exact=B|powerset=0]*/ returnInt7()
+    .. /*invoke: [exact=B|powerset=0]*/ returnInt8()
+    .. /*invoke: [exact=B|powerset=0]*/ returnInt9();
 
   C()
-    .. /*invoke: [exact=C]*/ returnInt1()
-    .. /*invoke: [exact=C]*/ returnInt2()
-    .. /*invoke: [exact=C]*/ returnInt3()
-    .. /*invoke: [exact=C]*/ returnInt4()
-    .. /*invoke: [exact=C]*/ returnInt5()
-    .. /*invoke: [exact=C]*/ returnInt6();
+    .. /*invoke: [exact=C|powerset=0]*/ returnInt1()
+    .. /*invoke: [exact=C|powerset=0]*/ returnInt2()
+    .. /*invoke: [exact=C|powerset=0]*/ returnInt3()
+    .. /*invoke: [exact=C|powerset=0]*/ returnInt4()
+    .. /*invoke: [exact=C|powerset=0]*/ returnInt5()
+    .. /*invoke: [exact=C|powerset=0]*/ returnInt6();
   testReturnElementOfConstList1();
   testReturnElementOfConstList2();
   testReturnItselfOrInt(topLevelGetter());
diff --git a/pkg/compiler/test/inference/data/general6.dart b/pkg/compiler/test/inference/data/general6.dart
index 7fc90d9..3e726d1 100644
--- a/pkg/compiler/test/inference/data/general6.dart
+++ b/pkg/compiler/test/inference/data/general6.dart
@@ -2,14 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: foo:[exact=JSUInt31]*/
+/*member: foo:[exact=JSUInt31|powerset=0]*/
 foo() {
   var a = [1, 2, 3];
   return a
-      . /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 3)*/ first;
+      . /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 3, powerset: 0)*/ first;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   foo();
 }
diff --git a/pkg/compiler/test/inference/data/general7.dart b/pkg/compiler/test/inference/data/general7.dart
index bd8da3f3..a805b9d 100644
--- a/pkg/compiler/test/inference/data/general7.dart
+++ b/pkg/compiler/test/inference/data/general7.dart
@@ -6,10 +6,10 @@
 /// file 'general7_ea.dart' contains similar tests for when assertions are
 /// _enabled_.
 
-/*member: foo:[null]*/
-foo(/*[exact=JSUInt31]*/ x, [/*[null]*/ y]) => y;
+/*member: foo:[null|powerset=1]*/
+foo(/*[exact=JSUInt31|powerset=0]*/ x, [/*[null|powerset=1]*/ y]) => y;
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   assert(foo('Hi', true), foo(true));
   foo(1);
diff --git a/pkg/compiler/test/inference/data/general7_ea.dart b/pkg/compiler/test/inference/data/general7_ea.dart
index f23f8ee..0617d45 100644
--- a/pkg/compiler/test/inference/data/general7_ea.dart
+++ b/pkg/compiler/test/inference/data/general7_ea.dart
@@ -6,13 +6,13 @@
 /// file 'general7.dart' contains similar tests for when assertions are
 /// _disabled_.
 
-/*member: foo:Value([null|exact=JSBool], value: true)*/
+/*member: foo:Value([null|exact=JSBool|powerset=1], value: true, powerset: 1)*/
 foo(
-  /*Union([exact=JSBool], [exact=JSString], [exact=JSUInt31])*/ x, [
-  /*Value([null|exact=JSBool], value: true)*/ y,
+  /*Union([exact=JSBool|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ x, [
+  /*Value([null|exact=JSBool|powerset=1], value: true, powerset: 1)*/ y,
 ]) => y;
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   assert(foo('Hi', true), foo(true));
   foo(1);
diff --git a/pkg/compiler/test/inference/data/general8a.dart b/pkg/compiler/test/inference/data/general8a.dart
index 8f3815a..e215eba 100644
--- a/pkg/compiler/test/inference/data/general8a.dart
+++ b/pkg/compiler/test/inference/data/general8a.dart
@@ -2,13 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: foo:Value([exact=JSBool], value: false)*/
-foo(/*Value([exact=JSBool], value: false)*/ x) {
+/*member: foo:Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/
+foo(/*Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/ x) {
   return x;
 }
 
-/*member: bar:[null]*/
-bar(/*Value([exact=JSBool], value: false)*/ x) {
+/*member: bar:[null|powerset=1]*/
+bar(/*Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/ x) {
   if (x) {
     print("aaa");
   } else {
@@ -16,7 +16,7 @@
   }
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   bar(foo(false));
   bar(foo(foo(false)));
diff --git a/pkg/compiler/test/inference/data/general8b.dart b/pkg/compiler/test/inference/data/general8b.dart
index b3d447e..710dd80 100644
--- a/pkg/compiler/test/inference/data/general8b.dart
+++ b/pkg/compiler/test/inference/data/general8b.dart
@@ -2,14 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: foo:[exact=JSBool]*/
-foo(/*[exact=JSUInt31]*/ x) {
-  if (x /*invoke: [exact=JSUInt31]*/ > 3) return true;
+/*member: foo:[exact=JSBool|powerset=0]*/
+foo(/*[exact=JSUInt31|powerset=0]*/ x) {
+  if (x /*invoke: [exact=JSUInt31|powerset=0]*/ > 3) return true;
   return false;
 }
 
-/*member: bar:[null]*/
-bar(/*[exact=JSBool]*/ x) {
+/*member: bar:[null|powerset=1]*/
+bar(/*[exact=JSBool|powerset=0]*/ x) {
   if (x) {
     print("aaa");
   } else {
@@ -17,7 +17,7 @@
   }
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   bar(foo(5));
   bar(foo(6));
diff --git a/pkg/compiler/test/inference/data/global_field_closure.dart b/pkg/compiler/test/inference/data/global_field_closure.dart
index 616c6f1..71f0dfc 100644
--- a/pkg/compiler/test/inference/data/global_field_closure.dart
+++ b/pkg/compiler/test/inference/data/global_field_closure.dart
@@ -2,34 +2,34 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: method1:[exact=JSUInt31]*/
+/*member: method1:[exact=JSUInt31|powerset=0]*/
 method1() {
   return 42;
 }
 
-/*member: method2:[exact=JSUInt31]*/
+/*member: method2:[exact=JSUInt31|powerset=0]*/
 // Called only via [foo2] with a small integer.
-method2(/*[exact=JSUInt31]*/ a) {
+method2(/*[exact=JSUInt31|powerset=0]*/ a) {
   return a;
 }
 
-/*member: foo1:[subclass=Closure]*/
+/*member: foo1:[subclass=Closure|powerset=0]*/
 var foo1 = method1;
 
-/*member: foo2:[subclass=Closure]*/
+/*member: foo2:[subclass=Closure|powerset=0]*/
 var foo2 = method2;
 
-/*member: returnInt1:[null|subclass=Object]*/
+/*member: returnInt1:[null|subclass=Object|powerset=1]*/
 returnInt1() {
   return foo1();
 }
 
-/*member: returnInt2:[null|subclass=Object]*/
+/*member: returnInt2:[null|subclass=Object|powerset=1]*/
 returnInt2() {
   return foo2(54);
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   returnInt1();
   returnInt2();
diff --git a/pkg/compiler/test/inference/data/global_field_closure2.dart b/pkg/compiler/test/inference/data/global_field_closure2.dart
index 42991dc..68c802a 100644
--- a/pkg/compiler/test/inference/data/global_field_closure2.dart
+++ b/pkg/compiler/test/inference/data/global_field_closure2.dart
@@ -2,21 +2,21 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: method:[exact=JSUInt31]*/
+/*member: method:[exact=JSUInt31|powerset=0]*/
 // Called only via [foo] with a small integer.
-method(/*[exact=JSUInt31]*/ a) {
+method(/*[exact=JSUInt31|powerset=0]*/ a) {
   return a;
 }
 
-/*member: foo:[subclass=Closure]*/
+/*member: foo:[subclass=Closure|powerset=0]*/
 var foo = method;
 
-/*member: returnInt:[null|subclass=Object]*/
+/*member: returnInt:[null|subclass=Object|powerset=1]*/
 returnInt() {
   return foo(54);
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   returnInt();
 }
diff --git a/pkg/compiler/test/inference/data/if.dart b/pkg/compiler/test/inference/data/if.dart
index ecb1a6f..b488749 100644
--- a/pkg/compiler/test/inference/data/if.dart
+++ b/pkg/compiler/test/inference/data/if.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   simpleIfThen();
   simpleIfThenElse();
@@ -12,13 +12,13 @@
 // Test if-then statement
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _simpleIfThen:[null|exact=JSUInt31]*/
-_simpleIfThen(/*[exact=JSBool]*/ c) {
+/*member: _simpleIfThen:[null|exact=JSUInt31|powerset=1]*/
+_simpleIfThen(/*[exact=JSBool|powerset=0]*/ c) {
   if (c) return 1;
   return null;
 }
 
-/*member: simpleIfThen:[null]*/
+/*member: simpleIfThen:[null|powerset=1]*/
 simpleIfThen() {
   _simpleIfThen(true);
   _simpleIfThen(false);
@@ -28,15 +28,15 @@
 // Test if-then-else statement
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _simpleIfThenElse:[null|exact=JSUInt31]*/
-_simpleIfThenElse(/*[exact=JSBool]*/ c) {
+/*member: _simpleIfThenElse:[null|exact=JSUInt31|powerset=1]*/
+_simpleIfThenElse(/*[exact=JSBool|powerset=0]*/ c) {
   if (c)
     return 1;
   else
     return null;
 }
 
-/*member: simpleIfThenElse:[null]*/
+/*member: simpleIfThenElse:[null|powerset=1]*/
 simpleIfThenElse() {
   _simpleIfThenElse(true);
   _simpleIfThenElse(false);
diff --git a/pkg/compiler/test/inference/data/if_null.dart b/pkg/compiler/test/inference/data/if_null.dart
index ecd22f5..8d95daa 100644
--- a/pkg/compiler/test/inference/data/if_null.dart
+++ b/pkg/compiler/test/inference/data/if_null.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   ifNull();
   ifNotNullInvoke();
@@ -13,10 +13,10 @@
 // If-null on parameter.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _ifNull:[exact=JSUInt31]*/
-_ifNull(/*[null|exact=JSUInt31]*/ o) => o ?? 0;
+/*member: _ifNull:[exact=JSUInt31|powerset=0]*/
+_ifNull(/*[null|exact=JSUInt31|powerset=1]*/ o) => o ?? 0;
 
-/*member: ifNull:[null]*/
+/*member: ifNull:[null|powerset=1]*/
 ifNull() {
   _ifNull(null);
   _ifNull(0);
@@ -26,15 +26,15 @@
 // If-not-null access on parameter.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _ifNotNullInvoke:[null|exact=JSBool]*/
-_ifNotNullInvoke(/*[null|exact=JSUInt31]*/ o) {
+/*member: _ifNotNullInvoke:[null|exact=JSBool|powerset=1]*/
+_ifNotNullInvoke(/*[null|exact=JSUInt31|powerset=1]*/ o) {
   return o
       ?.
-      /*[exact=JSUInt31]*/
+      /*[exact=JSUInt31|powerset=0]*/
       isEven;
 }
 
-/*member: ifNotNullInvoke:[null]*/
+/*member: ifNotNullInvoke:[null|powerset=1]*/
 ifNotNullInvoke() {
   _ifNotNullInvoke(null);
   _ifNotNullInvoke(0);
@@ -44,12 +44,12 @@
 // As above but unconditional access.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _notIfNotNullInvoke:[exact=JSBool]*/
-_notIfNotNullInvoke(/*[null|exact=JSUInt31]*/ o) {
-  return o. /*[null|exact=JSUInt31]*/ isEven;
+/*member: _notIfNotNullInvoke:[exact=JSBool|powerset=0]*/
+_notIfNotNullInvoke(/*[null|exact=JSUInt31|powerset=1]*/ o) {
+  return o. /*[null|exact=JSUInt31|powerset=1]*/ isEven;
 }
 
-/*member: notIfNotNullInvoke:[null]*/
+/*member: notIfNotNullInvoke:[null|powerset=1]*/
 notIfNotNullInvoke() {
   _notIfNotNullInvoke(null);
   _notIfNotNullInvoke(0);
diff --git a/pkg/compiler/test/inference/data/index.dart b/pkg/compiler/test/inference/data/index.dart
index ff1d39e..c0c0b14 100644
--- a/pkg/compiler/test/inference/data/index.dart
+++ b/pkg/compiler/test/inference/data/index.dart
@@ -6,11 +6,11 @@
 // Lookup into a singleton list.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: listIndexSingle:[exact=JSUInt31]*/
+/*member: listIndexSingle:[exact=JSUInt31|powerset=0]*/
 listIndexSingle() {
   var list = [0];
   return list
-  /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+  /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
   [0];
 }
 
@@ -18,11 +18,11 @@
 // Lookup into a list with multiple elements.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: listIndexMultiple:[exact=JSUInt31]*/
+/*member: listIndexMultiple:[exact=JSUInt31|powerset=0]*/
 listIndexMultiple() {
   var list = [0, 1, 2, 3];
   return list
-  /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 4)*/
+  /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 4, powerset: 0)*/
   [2];
 }
 
@@ -30,11 +30,11 @@
 // Lookup into a list with an out-of-range index.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: listIndexBad:[exact=JSUInt31]*/
+/*member: listIndexBad:[exact=JSUInt31|powerset=0]*/
 listIndexBad() {
   var list = [0, 1];
   return list
-  /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 2)*/
+  /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 2, powerset: 0)*/
   [3];
 }
 
@@ -42,11 +42,11 @@
 // Lookup into a list with mixed element types.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: listIndexMixed:Union([exact=JSString], [exact=JSUInt31])*/
+/*member: listIndexMixed:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 listIndexMixed() {
   var list = [0, ''];
   return list
-  /*Container([exact=JSExtendableArray], element: Union([exact=JSString], [exact=JSUInt31]), length: 2)*/
+  /*Container([exact=JSExtendableArray|powerset=0], element: Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0), length: 2, powerset: 0)*/
   [0];
 }
 
@@ -54,11 +54,11 @@
 // Lookup into a singleton map.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: mapLookupSingle:[null|exact=JSUInt31]*/
+/*member: mapLookupSingle:[null|exact=JSUInt31|powerset=1]*/
 mapLookupSingle() {
   var map = {0: 1};
   return map
-  /*Map([exact=JsLinkedHashMap], key: [exact=JSUInt31], value: [null|exact=JSUInt31])*/
+  /*Map([exact=JsLinkedHashMap|powerset=0], key: [exact=JSUInt31|powerset=0], value: [null|exact=JSUInt31|powerset=1], powerset: 0)*/
   [0];
 }
 
@@ -66,11 +66,11 @@
 // Lookup into a map with multiple entries.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: mapLookupMultiple:[null|exact=JSUInt31]*/
+/*member: mapLookupMultiple:[null|exact=JSUInt31|powerset=1]*/
 mapLookupMultiple() {
   var map = {0: 1, 2: 3, 4: 5};
   return map
-  /*Map([exact=JsLinkedHashMap], key: [exact=JSUInt31], value: [null|exact=JSUInt31])*/
+  /*Map([exact=JsLinkedHashMap|powerset=0], key: [exact=JSUInt31|powerset=0], value: [null|exact=JSUInt31|powerset=1], powerset: 0)*/
   [2];
 }
 
@@ -78,11 +78,11 @@
 // Lookup into a map with a missing key.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: mapLookupMissing:[null|exact=JSUInt31]*/
+/*member: mapLookupMissing:[null|exact=JSUInt31|powerset=1]*/
 mapLookupMissing() {
   var map = {0: 1};
   return map
-  /*Map([exact=JsLinkedHashMap], key: [exact=JSUInt31], value: [null|exact=JSUInt31])*/
+  /*Map([exact=JsLinkedHashMap|powerset=0], key: [exact=JSUInt31|powerset=0], value: [null|exact=JSUInt31|powerset=1], powerset: 0)*/
   [2];
 }
 
@@ -90,11 +90,11 @@
 // Lookup into a map with mixed key types.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: mapLookupMixedKeys:[null|exact=JSUInt31]*/
+/*member: mapLookupMixedKeys:[null|exact=JSUInt31|powerset=1]*/
 mapLookupMixedKeys() {
   var map = {0: 1, '': 2};
   return map
-  /*Map([exact=JsLinkedHashMap], key: Union([exact=JSString], [exact=JSUInt31]), value: [null|exact=JSUInt31])*/
+  /*Map([exact=JsLinkedHashMap|powerset=0], key: Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0), value: [null|exact=JSUInt31|powerset=1], powerset: 0)*/
   [''];
 }
 
@@ -102,11 +102,11 @@
 // Lookup into a map with mixed value types.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: mapLookupMixedValues:Union(null, [exact=JSString], [exact=JSUInt31])*/
+/*member: mapLookupMixedValues:Union(null, [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
 mapLookupMixedValues() {
   var map = {0: 1, 2: ''};
   return map
-  /*Map([exact=JsLinkedHashMap], key: [exact=JSUInt31], value: Union(null, [exact=JSString], [exact=JSUInt31]))*/
+  /*Map([exact=JsLinkedHashMap|powerset=0], key: [exact=JSUInt31|powerset=0], value: Union(null, [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1), powerset: 0)*/
   [2];
 }
 
@@ -114,11 +114,11 @@
 // Lookup into a singleton map with String keys.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: dictionaryLookupSingle:Value([exact=JSString], value: "bar")*/
+/*member: dictionaryLookupSingle:Value([exact=JSString|powerset=0], value: "bar", powerset: 0)*/
 dictionaryLookupSingle() {
   var map = {'foo': 'bar'};
   return map
-  /*Dictionary([exact=JsLinkedHashMap], key: Value([exact=JSString], value: "foo"), value: Value([null|exact=JSString], value: "bar"), map: {foo: Value([exact=JSString], value: "bar")})*/
+  /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: Value([exact=JSString|powerset=0], value: "foo", powerset: 0), value: Value([null|exact=JSString|powerset=1], value: "bar", powerset: 1), map: {foo: Value([exact=JSString|powerset=0], value: "bar", powerset: 0)}, powerset: 0)*/
   ['foo'];
 }
 
@@ -126,11 +126,11 @@
 // Lookup into a map with String keys.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: dictionaryLookupMultiple:Value([exact=JSString], value: "boz")*/
+/*member: dictionaryLookupMultiple:Value([exact=JSString|powerset=0], value: "boz", powerset: 0)*/
 dictionaryLookupMultiple() {
   var map = {'foo': 'bar', 'baz': 'boz'};
   return map
-  /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSString], map: {foo: Value([exact=JSString], value: "bar"), baz: Value([exact=JSString], value: "boz")})*/
+  /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: [null|exact=JSString|powerset=1], map: {foo: Value([exact=JSString|powerset=0], value: "bar", powerset: 0), baz: Value([exact=JSString|powerset=0], value: "boz", powerset: 0)}, powerset: 0)*/
   ['baz'];
 }
 
@@ -138,11 +138,11 @@
 // Lookup into a map with String keys with a missing key.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: dictionaryLookupMissing:[null]*/
+/*member: dictionaryLookupMissing:[null|powerset=1]*/
 dictionaryLookupMissing() {
   var map = {'foo': 'bar', 'baz': 'boz'};
   return map
-  /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSString], map: {foo: Value([exact=JSString], value: "bar"), baz: Value([exact=JSString], value: "boz")})*/
+  /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: [null|exact=JSString|powerset=1], map: {foo: Value([exact=JSString|powerset=0], value: "bar", powerset: 0), baz: Value([exact=JSString|powerset=0], value: "boz", powerset: 0)}, powerset: 0)*/
   ['unknown'];
 }
 
@@ -150,11 +150,11 @@
 // Lookup into a string-to-int map.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: intDictionaryLookupSingle:[exact=JSUInt31]*/
+/*member: intDictionaryLookupSingle:[exact=JSUInt31|powerset=0]*/
 intDictionaryLookupSingle() {
   var map = {'foo': 0};
   return map
-  /*Dictionary([exact=JsLinkedHashMap], key: Value([exact=JSString], value: "foo"), value: [null|exact=JSUInt31], map: {foo: [exact=JSUInt31]})*/
+  /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: Value([exact=JSString|powerset=0], value: "foo", powerset: 0), value: [null|exact=JSUInt31|powerset=1], map: {foo: [exact=JSUInt31|powerset=0]}, powerset: 0)*/
   ['foo'];
 }
 
@@ -162,32 +162,32 @@
 // Index access on custom class.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
-  /*member: Class1.[]:[exact=JSUInt31]*/
-  operator [](/*[exact=JSUInt31]*/ index) => index;
+  /*member: Class1.[]:[exact=JSUInt31|powerset=0]*/
+  operator [](/*[exact=JSUInt31|powerset=0]*/ index) => index;
 }
 
-/*member: customIndex:[exact=JSUInt31]*/
-customIndex() => Class1() /*[exact=Class1]*/ [42];
+/*member: customIndex:[exact=JSUInt31|powerset=0]*/
+customIndex() => Class1() /*[exact=Class1|powerset=0]*/ [42];
 
 ////////////////////////////////////////////////////////////////////////////////
 // Index access on custom class through `this`.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class2.:[exact=Class2]*/
+/*member: Class2.:[exact=Class2|powerset=0]*/
 class Class2 {
-  /*member: Class2.[]:[exact=JSUInt31]*/
-  operator [](/*[exact=JSUInt31]*/ index) => index;
+  /*member: Class2.[]:[exact=JSUInt31|powerset=0]*/
+  operator [](/*[exact=JSUInt31|powerset=0]*/ index) => index;
 
-  /*member: Class2.method:[exact=JSUInt31]*/
-  method() => this /*[exact=Class2]*/ [42];
+  /*member: Class2.method:[exact=JSUInt31|powerset=0]*/
+  method() => this /*[exact=Class2|powerset=0]*/ [42];
 }
 
-/*member: customIndexThis:[exact=JSUInt31]*/
-customIndexThis() => Class2(). /*invoke: [exact=Class2]*/ method();
+/*member: customIndexThis:[exact=JSUInt31|powerset=0]*/
+customIndexThis() => Class2(). /*invoke: [exact=Class2|powerset=0]*/ method();
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   listIndexSingle();
   listIndexMultiple();
diff --git a/pkg/compiler/test/inference/data/index_call.dart b/pkg/compiler/test/inference/data/index_call.dart
index 3f4c53a..09d201e 100644
--- a/pkg/compiler/test/inference/data/index_call.dart
+++ b/pkg/compiler/test/inference/data/index_call.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   listIndexCall();
   listIndexExplicitCall();
@@ -13,78 +13,83 @@
   multiMapListIndexCall();
 }
 
-/*member: listIndexCall:[null|subclass=Object]*/
+/*member: listIndexCall:[null|subclass=Object|powerset=1]*/
 listIndexCall() {
-  var closure = /*[exact=JSUInt31]*/ ({/*[exact=JSUInt31]*/ a}) => a;
+  var closure = /*[exact=JSUInt31|powerset=0]*/
+      ({/*[exact=JSUInt31|powerset=0]*/ a}) => a;
   var a = [closure];
-  return a /*Container([exact=JSExtendableArray], element: [subclass=Closure], length: 1)*/ [0](
+  return a /*Container([exact=JSExtendableArray|powerset=0], element: [subclass=Closure|powerset=0], length: 1, powerset: 0)*/ [0](
     a: 0,
   );
 }
 
-/*member: listIndexExplicitCall:[null|subclass=Object]*/
+/*member: listIndexExplicitCall:[null|subclass=Object|powerset=1]*/
 listIndexExplicitCall() {
-  var closure = /*[exact=JSUInt31]*/ ({/*[exact=JSUInt31]*/ b}) => b;
+  var closure = /*[exact=JSUInt31|powerset=0]*/
+      ({/*[exact=JSUInt31|powerset=0]*/ b}) => b;
   var a = [closure];
-  return a /*Container([exact=JSExtendableArray], element: [subclass=Closure], length: 1)*/ [0]
+  return a /*Container([exact=JSExtendableArray|powerset=0], element: [subclass=Closure|powerset=0], length: 1, powerset: 0)*/ [0]
       .call(b: 0);
 }
 
-/*member: multiListIndex:[subclass=JSPositiveInt]*/
+/*member: multiListIndex:[subclass=JSPositiveInt|powerset=0]*/
 multiListIndex() {
   var a = [
     [0],
   ];
   return a
-      /*Container([exact=JSExtendableArray], element: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1), length: 1)*/
+      /*Container([exact=JSExtendableArray|powerset=0], element: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0), length: 1, powerset: 0)*/
       [0]
-      /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+      /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
       [0]
-      . /*invoke: [exact=JSUInt31]*/ abs();
+      . /*invoke: [exact=JSUInt31|powerset=0]*/ abs();
 }
 
-/*member: multiListIndexCall:[null|subclass=Object]*/
+/*member: multiListIndexCall:[null|subclass=Object|powerset=1]*/
 multiListIndexCall() {
-  var closure = /*[exact=JSUInt31]*/ ({/*[exact=JSUInt31]*/ c}) => c;
+  var closure = /*[exact=JSUInt31|powerset=0]*/
+      ({/*[exact=JSUInt31|powerset=0]*/ c}) => c;
   var a = [
     [closure],
   ];
   return a
-  /*Container([exact=JSExtendableArray], element: Container([exact=JSExtendableArray], element: [subclass=Closure], length: 1), length: 1)*/
+  /*Container([exact=JSExtendableArray|powerset=0], element: Container([exact=JSExtendableArray|powerset=0], element: [subclass=Closure|powerset=0], length: 1, powerset: 0), length: 1, powerset: 0)*/
   [0]
-  /*Container([exact=JSExtendableArray], element: [subclass=Closure], length: 1)*/
+  /*Container([exact=JSExtendableArray|powerset=0], element: [subclass=Closure|powerset=0], length: 1, powerset: 0)*/
   [0](c: 0);
 }
 
-/*member: multiMapIndex:[subclass=JSPositiveInt]*/
+/*member: multiMapIndex:[subclass=JSPositiveInt|powerset=0]*/
 multiMapIndex() {
   var a = {
     'a': {'b': 0},
   };
-  return a /*Dictionary([exact=JsLinkedHashMap], key: Value([exact=JSString], value: "a"), value: Dictionary([null|exact=JsLinkedHashMap], key: Value([exact=JSString], value: "b"), value: [null|exact=JSUInt31], map: {b: [exact=JSUInt31]}), map: {a: Dictionary([exact=JsLinkedHashMap], key: Value([exact=JSString], value: "b"), value: [null|exact=JSUInt31], map: {b: [exact=JSUInt31]})})*/ ['a']!
-      /*Dictionary([exact=JsLinkedHashMap], key: Value([exact=JSString], value: "b"), value: [null|exact=JSUInt31], map: {b: [exact=JSUInt31]})*/
+  return a /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: Value([exact=JSString|powerset=0], value: "a", powerset: 0), value: Dictionary([null|exact=JsLinkedHashMap|powerset=1], key: Value([exact=JSString|powerset=0], value: "b", powerset: 0), value: [null|exact=JSUInt31|powerset=1], map: {b: [exact=JSUInt31|powerset=0]}, powerset: 1), map: {a: Dictionary([exact=JsLinkedHashMap|powerset=0], key: Value([exact=JSString|powerset=0], value: "b", powerset: 0), value: [null|exact=JSUInt31|powerset=1], map: {b: [exact=JSUInt31|powerset=0]}, powerset: 0)}, powerset: 0)*/ ['a']!
+      /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: Value([exact=JSString|powerset=0], value: "b", powerset: 0), value: [null|exact=JSUInt31|powerset=1], map: {b: [exact=JSUInt31|powerset=0]}, powerset: 0)*/
       ['b']!
-      . /*invoke: [exact=JSUInt31]*/ abs();
+      . /*invoke: [exact=JSUInt31|powerset=0]*/ abs();
 }
 
-/*member: multiMapIndexCall:[null|subclass=Object]*/
+/*member: multiMapIndexCall:[null|subclass=Object|powerset=1]*/
 multiMapIndexCall() {
-  var closure = /*[exact=JSUInt31]*/ ({/*[exact=JSUInt31]*/ d}) => d;
+  var closure = /*[exact=JSUInt31|powerset=0]*/
+      ({/*[exact=JSUInt31|powerset=0]*/ d}) => d;
   var a = {
     'a': {'b': closure},
   };
-  return a /*Dictionary([exact=JsLinkedHashMap], key: Value([exact=JSString], value: "a"), value: Dictionary([null|exact=JsLinkedHashMap], key: Value([exact=JSString], value: "b"), value: [null|subclass=Closure], map: {b: [subclass=Closure]}), map: {a: Dictionary([exact=JsLinkedHashMap], key: Value([exact=JSString], value: "b"), value: [null|subclass=Closure], map: {b: [subclass=Closure]})})*/ ['a']!
-  /*Dictionary([exact=JsLinkedHashMap], key: Value([exact=JSString], value: "b"), value: [null|subclass=Closure], map: {b: [subclass=Closure]})*/
+  return a /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: Value([exact=JSString|powerset=0], value: "a", powerset: 0), value: Dictionary([null|exact=JsLinkedHashMap|powerset=1], key: Value([exact=JSString|powerset=0], value: "b", powerset: 0), value: [null|subclass=Closure|powerset=1], map: {b: [subclass=Closure|powerset=0]}, powerset: 1), map: {a: Dictionary([exact=JsLinkedHashMap|powerset=0], key: Value([exact=JSString|powerset=0], value: "b", powerset: 0), value: [null|subclass=Closure|powerset=1], map: {b: [subclass=Closure|powerset=0]}, powerset: 0)}, powerset: 0)*/ ['a']!
+  /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: Value([exact=JSString|powerset=0], value: "b", powerset: 0), value: [null|subclass=Closure|powerset=1], map: {b: [subclass=Closure|powerset=0]}, powerset: 0)*/
   ['b']!(d: 0);
 }
 
-/*member: multiMapListIndexCall:[null|subclass=Object]*/
+/*member: multiMapListIndexCall:[null|subclass=Object|powerset=1]*/
 multiMapListIndexCall() {
-  var closure = /*[exact=JSUInt31]*/ ({/*[exact=JSUInt31]*/ d}) => d;
+  var closure = /*[exact=JSUInt31|powerset=0]*/
+      ({/*[exact=JSUInt31|powerset=0]*/ d}) => d;
   var a = {
     'a': [closure],
   };
-  return a /*Dictionary([exact=JsLinkedHashMap], key: Value([exact=JSString], value: "a"), value: Container([null|exact=JSExtendableArray], element: [subclass=Closure], length: 1), map: {a: Container([exact=JSExtendableArray], element: [subclass=Closure], length: 1)})*/ ['a']!
-  /*Container([exact=JSExtendableArray], element: [subclass=Closure], length: 1)*/
+  return a /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: Value([exact=JSString|powerset=0], value: "a", powerset: 0), value: Container([null|exact=JSExtendableArray|powerset=1], element: [subclass=Closure|powerset=0], length: 1, powerset: 1), map: {a: Container([exact=JSExtendableArray|powerset=0], element: [subclass=Closure|powerset=0], length: 1, powerset: 0)}, powerset: 0)*/ ['a']!
+  /*Container([exact=JSExtendableArray|powerset=0], element: [subclass=Closure|powerset=0], length: 1, powerset: 0)*/
   [0](d: 0);
 }
diff --git a/pkg/compiler/test/inference/data/index_postfix.dart b/pkg/compiler/test/inference/data/index_postfix.dart
index 4c91c51..3202eee 100644
--- a/pkg/compiler/test/inference/data/index_postfix.dart
+++ b/pkg/compiler/test/inference/data/index_postfix.dart
@@ -2,47 +2,50 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   listIndexPostfixIncrement();
   listIndexPostfixDecrement();
   superIndexPostfixIncrement();
 }
 
-/*member: listIndexPostfixIncrement:[subclass=JSPositiveInt]*/
+/*member: listIndexPostfixIncrement:[subclass=JSPositiveInt|powerset=0]*/
 listIndexPostfixIncrement() {
   var list = [0];
   return list
-  /*Container([exact=JSExtendableArray], element: [subclass=JSPositiveInt], length: 1)*/
-  /*update: Container([exact=JSExtendableArray], element: [subclass=JSPositiveInt], length: 1)*/
-  [0] /*invoke: [subclass=JSPositiveInt]*/ ++;
+  /*Container([exact=JSExtendableArray|powerset=0], element: [subclass=JSPositiveInt|powerset=0], length: 1, powerset: 0)*/
+  /*update: Container([exact=JSExtendableArray|powerset=0], element: [subclass=JSPositiveInt|powerset=0], length: 1, powerset: 0)*/
+  [0] /*invoke: [subclass=JSPositiveInt|powerset=0]*/ ++;
 }
 
-/*member: listIndexPostfixDecrement:[subclass=JSInt]*/
+/*member: listIndexPostfixDecrement:[subclass=JSInt|powerset=0]*/
 listIndexPostfixDecrement() {
   var list = [0];
   return list
-  /*Container([exact=JSExtendableArray], element: [subclass=JSInt], length: 1)*/
-  /*update: Container([exact=JSExtendableArray], element: [subclass=JSInt], length: 1)*/
-  [0] /*invoke: [subclass=JSInt]*/ --;
+  /*Container([exact=JSExtendableArray|powerset=0], element: [subclass=JSInt|powerset=0], length: 1, powerset: 0)*/
+  /*update: Container([exact=JSExtendableArray|powerset=0], element: [subclass=JSInt|powerset=0], length: 1, powerset: 0)*/
+  [0] /*invoke: [subclass=JSInt|powerset=0]*/ --;
 }
 
-/*member: Super1.:[exact=Super1]*/
+/*member: Super1.:[exact=Super1|powerset=0]*/
 class Super1 {
-  /*member: Super1.[]:[exact=JSUInt31]*/
-  operator [](/*[exact=JSUInt31]*/ index) => 42;
+  /*member: Super1.[]:[exact=JSUInt31|powerset=0]*/
+  operator [](/*[exact=JSUInt31|powerset=0]*/ index) => 42;
 
-  /*member: Super1.[]=:[null]*/
-  operator []=(/*[exact=JSUInt31]*/ index, /*[subclass=JSUInt32]*/ value) {}
+  /*member: Super1.[]=:[null|powerset=1]*/
+  operator []=(
+    /*[exact=JSUInt31|powerset=0]*/ index,
+    /*[subclass=JSUInt32|powerset=0]*/ value,
+  ) {}
 }
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 extends Super1 {
-  /*member: Class1.method:[exact=JSUInt31]*/
-  method() => super[0] /*invoke: [exact=JSUInt31]*/ ++;
+  /*member: Class1.method:[exact=JSUInt31|powerset=0]*/
+  method() => super[0] /*invoke: [exact=JSUInt31|powerset=0]*/ ++;
 }
 
-/*member: superIndexPostfixIncrement:[null]*/
+/*member: superIndexPostfixIncrement:[null|powerset=1]*/
 superIndexPostfixIncrement() {
-  Class1(). /*invoke: [exact=Class1]*/ method();
+  Class1(). /*invoke: [exact=Class1|powerset=0]*/ method();
 }
diff --git a/pkg/compiler/test/inference/data/index_set.dart b/pkg/compiler/test/inference/data/index_set.dart
index b0427a6..312a6da 100644
--- a/pkg/compiler/test/inference/data/index_set.dart
+++ b/pkg/compiler/test/inference/data/index_set.dart
@@ -6,11 +6,11 @@
 // Update to a singleton list.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: listIndexSetSingle:[exact=JSUInt31]*/
+/*member: listIndexSetSingle:[exact=JSUInt31|powerset=0]*/
 listIndexSetSingle() {
   var list = [0];
   return list
-      /*update: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+      /*update: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
       [0] =
       42;
 }
@@ -19,11 +19,11 @@
 // Update to a list with multiple elements.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: listIndexSetMultiple:[exact=JSUInt31]*/
+/*member: listIndexSetMultiple:[exact=JSUInt31|powerset=0]*/
 listIndexSetMultiple() {
   var list = [0, 1, 2, 3];
   return list
-      /*update: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 4)*/
+      /*update: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 4, powerset: 0)*/
       [2] =
       42;
 }
@@ -32,11 +32,11 @@
 // Update to a list with an out-of-range index.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: listIndexSetBad:[exact=JSUInt31]*/
+/*member: listIndexSetBad:[exact=JSUInt31|powerset=0]*/
 listIndexSetBad() {
   var list = [0, 1];
   return list
-      /*update: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 2)*/
+      /*update: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 2, powerset: 0)*/
       [3] =
       42;
 }
@@ -45,11 +45,11 @@
 // Update to a list with mixed element types.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: listIndexSetMixed:[exact=JSUInt31]*/
+/*member: listIndexSetMixed:[exact=JSUInt31|powerset=0]*/
 listIndexSetMixed() {
   dynamic list = [''];
   return list
-      /*update: Container([exact=JSExtendableArray], element: Union([exact=JSString], [exact=JSUInt31]), length: 1)*/
+      /*update: Container([exact=JSExtendableArray|powerset=0], element: Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0), length: 1, powerset: 0)*/
       [0] =
       42;
 }
@@ -58,11 +58,11 @@
 // Update to a empty map.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: mapUpdateEmpty:[exact=JSUInt31]*/
+/*member: mapUpdateEmpty:[exact=JSUInt31|powerset=0]*/
 mapUpdateEmpty() {
   var map = {};
   return map
-      /*update: Map([exact=JsLinkedHashMap], key: [exact=JSUInt31], value: [null|exact=JSUInt31])*/
+      /*update: Map([exact=JsLinkedHashMap|powerset=0], key: [exact=JSUInt31|powerset=0], value: [null|exact=JSUInt31|powerset=1], powerset: 0)*/
       [0] =
       42;
 }
@@ -71,11 +71,11 @@
 // Update to a singleton map.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: mapUpdateSingle:[exact=JSUInt31]*/
+/*member: mapUpdateSingle:[exact=JSUInt31|powerset=0]*/
 mapUpdateSingle() {
   var map = {0: 1};
   return map
-      /*update: Map([exact=JsLinkedHashMap], key: [exact=JSUInt31], value: [null|exact=JSUInt31])*/
+      /*update: Map([exact=JsLinkedHashMap|powerset=0], key: [exact=JSUInt31|powerset=0], value: [null|exact=JSUInt31|powerset=1], powerset: 0)*/
       [0] =
       42;
 }
@@ -84,11 +84,11 @@
 // Update to a map with multiple entries.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: mapUpdateMultiple:[exact=JSUInt31]*/
+/*member: mapUpdateMultiple:[exact=JSUInt31|powerset=0]*/
 mapUpdateMultiple() {
   var map = {0: 1, 2: 3, 4: 5};
   return map
-      /*update: Map([exact=JsLinkedHashMap], key: [exact=JSUInt31], value: [null|exact=JSUInt31])*/
+      /*update: Map([exact=JsLinkedHashMap|powerset=0], key: [exact=JSUInt31|powerset=0], value: [null|exact=JSUInt31|powerset=1], powerset: 0)*/
       [2] =
       42;
 }
@@ -97,11 +97,11 @@
 // Update to a map with a missing key.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: mapUpdateMissing:[exact=JSUInt31]*/
+/*member: mapUpdateMissing:[exact=JSUInt31|powerset=0]*/
 mapUpdateMissing() {
   var map = {0: 1};
   return map
-      /*update: Map([exact=JsLinkedHashMap], key: [exact=JSUInt31], value: [null|exact=JSUInt31])*/
+      /*update: Map([exact=JsLinkedHashMap|powerset=0], key: [exact=JSUInt31|powerset=0], value: [null|exact=JSUInt31|powerset=1], powerset: 0)*/
       [2] =
       42;
 }
@@ -110,11 +110,11 @@
 // Update to a map with mixed key types.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: mapUpdateMixedKeys:[exact=JSUInt31]*/
+/*member: mapUpdateMixedKeys:[exact=JSUInt31|powerset=0]*/
 mapUpdateMixedKeys() {
   dynamic map = {'': 2};
   return map
-      /*update: Map([exact=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSUInt31])*/
+      /*update: Map([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: [null|exact=JSUInt31|powerset=1], powerset: 0)*/
       [0] =
       42;
 }
@@ -123,11 +123,11 @@
 // Update to a map with mixed value types.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: mapUpdateMixedValues:[exact=JSUInt31]*/
+/*member: mapUpdateMixedValues:[exact=JSUInt31|powerset=0]*/
 mapUpdateMixedValues() {
   dynamic map = {2: ''};
   return map
-      /*update: Map([exact=JsLinkedHashMap], key: [exact=JSUInt31], value: [null|exact=JSString])*/
+      /*update: Map([exact=JsLinkedHashMap|powerset=0], key: [exact=JSUInt31|powerset=0], value: [null|exact=JSString|powerset=1], powerset: 0)*/
       [2] =
       42;
 }
@@ -136,11 +136,11 @@
 // Update to an empty map with String keys.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: dictionaryUpdateEmpty:Value([exact=JSString], value: "bar")*/
+/*member: dictionaryUpdateEmpty:Value([exact=JSString|powerset=0], value: "bar", powerset: 0)*/
 dictionaryUpdateEmpty() {
   var map = {};
   return map
-      /*update: Dictionary([exact=JsLinkedHashMap], key: Value([exact=JSString], value: "foo"), value: Value([null|exact=JSString], value: "bar"), map: {foo: Value([null|exact=JSString], value: "bar")})*/
+      /*update: Dictionary([exact=JsLinkedHashMap|powerset=0], key: Value([exact=JSString|powerset=0], value: "foo", powerset: 0), value: Value([null|exact=JSString|powerset=1], value: "bar", powerset: 1), map: {foo: Value([null|exact=JSString|powerset=1], value: "bar", powerset: 1)}, powerset: 0)*/
       ['foo'] =
       'bar';
 }
@@ -149,11 +149,11 @@
 // Update to a singleton map with String keys with a new value.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: dictionaryUpdateSingle:Value([exact=JSString], value: "boz")*/
+/*member: dictionaryUpdateSingle:Value([exact=JSString|powerset=0], value: "boz", powerset: 0)*/
 dictionaryUpdateSingle() {
   var map = {'foo': 'bar'};
   return map
-      /*update: Dictionary([exact=JsLinkedHashMap], key: Value([exact=JSString], value: "foo"), value: [null|exact=JSString], map: {foo: [exact=JSString]})*/
+      /*update: Dictionary([exact=JsLinkedHashMap|powerset=0], key: Value([exact=JSString|powerset=0], value: "foo", powerset: 0), value: [null|exact=JSString|powerset=1], map: {foo: [exact=JSString|powerset=0]}, powerset: 0)*/
       ['foo'] =
       'boz';
 }
@@ -162,11 +162,11 @@
 // Update to a singleton map with String keys with the same value.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: dictionaryReUpdateSingle:Value([exact=JSString], value: "bar")*/
+/*member: dictionaryReUpdateSingle:Value([exact=JSString|powerset=0], value: "bar", powerset: 0)*/
 dictionaryReUpdateSingle() {
   var map = {'foo': 'bar'};
   return map
-      /*update: Dictionary([exact=JsLinkedHashMap], key: Value([exact=JSString], value: "foo"), value: Value([null|exact=JSString], value: "bar"), map: {foo: Value([exact=JSString], value: "bar")})*/
+      /*update: Dictionary([exact=JsLinkedHashMap|powerset=0], key: Value([exact=JSString|powerset=0], value: "foo", powerset: 0), value: Value([null|exact=JSString|powerset=1], value: "bar", powerset: 1), map: {foo: Value([exact=JSString|powerset=0], value: "bar", powerset: 0)}, powerset: 0)*/
       ['foo'] =
       'bar';
 }
@@ -175,11 +175,11 @@
 // Update to a map with String keys.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: dictionaryUpdateMultiple:Value([exact=JSString], value: "boz")*/
+/*member: dictionaryUpdateMultiple:Value([exact=JSString|powerset=0], value: "boz", powerset: 0)*/
 dictionaryUpdateMultiple() {
   var map = {'foo': 'bar'};
   return map
-      /*update: Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSString], map: {foo: Value([exact=JSString], value: "bar"), baz: Value([null|exact=JSString], value: "boz")})*/
+      /*update: Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: [null|exact=JSString|powerset=1], map: {foo: Value([exact=JSString|powerset=0], value: "bar", powerset: 0), baz: Value([null|exact=JSString|powerset=1], value: "boz", powerset: 1)}, powerset: 0)*/
       ['baz'] =
       'boz';
 }
@@ -188,16 +188,16 @@
 // Update to a string-to-int map.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: intDictionaryUpdateSingle:[exact=JSUInt31]*/
+/*member: intDictionaryUpdateSingle:[exact=JSUInt31|powerset=0]*/
 intDictionaryUpdateSingle() {
   var map = {};
   return map
-      /*update: Dictionary([exact=JsLinkedHashMap], key: Value([exact=JSString], value: "foo"), value: [null|exact=JSUInt31], map: {foo: [null|exact=JSUInt31]})*/
+      /*update: Dictionary([exact=JsLinkedHashMap|powerset=0], key: Value([exact=JSString|powerset=0], value: "foo", powerset: 0), value: [null|exact=JSUInt31|powerset=1], map: {foo: [null|exact=JSUInt31|powerset=1]}, powerset: 0)*/
       ['foo'] =
       0;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   listIndexSetSingle();
   listIndexSetMultiple();
diff --git a/pkg/compiler/test/inference/data/init_get.dart b/pkg/compiler/test/inference/data/init_get.dart
index adae6e3..d9c2926 100644
--- a/pkg/compiler/test/inference/data/init_get.dart
+++ b/pkg/compiler/test/inference/data/init_get.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: getter:[exact=JSUInt31]*/
+/*member: getter:[exact=JSUInt31|powerset=0]*/
 get getter => 42;
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   getGetter();
   getGetterInFinalField();
@@ -20,53 +20,53 @@
 // Access a top level getter directly.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: getGetter:[exact=JSUInt31]*/
+/*member: getGetter:[exact=JSUInt31|powerset=0]*/
 getGetter() => getter;
 
 ////////////////////////////////////////////////////////////////////////////////
 // Access a top level getter in a final instance field initializer.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
-  /*member: Class1.field:[exact=JSUInt31]*/
+  /*member: Class1.field:[exact=JSUInt31|powerset=0]*/
   final field = getter;
 }
 
-/*member: getGetterInFinalField:[exact=JSUInt31]*/
-getGetterInFinalField() => Class1(). /*[exact=Class1]*/ field;
+/*member: getGetterInFinalField:[exact=JSUInt31|powerset=0]*/
+getGetterInFinalField() => Class1(). /*[exact=Class1|powerset=0]*/ field;
 
 ////////////////////////////////////////////////////////////////////////////////
 // Access a top level getter in a non-final instance field initializer.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class2.:[exact=Class2]*/
+/*member: Class2.:[exact=Class2|powerset=0]*/
 class Class2 {
-  /*member: Class2.field:[exact=JSUInt31]*/
+  /*member: Class2.field:[exact=JSUInt31|powerset=0]*/
   var field = getter;
 }
 
-/*member: getGetterInField:[exact=JSUInt31]*/
-getGetterInField() => Class2(). /*[exact=Class2]*/ field;
+/*member: getGetterInField:[exact=JSUInt31|powerset=0]*/
+getGetterInField() => Class2(). /*[exact=Class2|powerset=0]*/ field;
 
 ////////////////////////////////////////////////////////////////////////////////
 // Access a top level getter in a final top level field initializer.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _field1:[null|exact=JSUInt31]*/
+/*member: _field1:[null|exact=JSUInt31|powerset=1]*/
 final _field1 = getter;
 
-/*member: getGetterInFinalTopLevelField:[null|exact=JSUInt31]*/
+/*member: getGetterInFinalTopLevelField:[null|exact=JSUInt31|powerset=1]*/
 getGetterInFinalTopLevelField() => _field1;
 
 ////////////////////////////////////////////////////////////////////////////////
 // Access a top level getter in a non-final top level field initializer.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _field2:[null|exact=JSUInt31]*/
+/*member: _field2:[null|exact=JSUInt31|powerset=1]*/
 var _field2 = getter;
 
-/*member: getGetterInTopLevelField:[null|exact=JSUInt31]*/
+/*member: getGetterInTopLevelField:[null|exact=JSUInt31|powerset=1]*/
 getGetterInTopLevelField() => _field2;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -74,11 +74,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 abstract class Class3 {
-  /*member: Class3.field:[null|exact=JSUInt31]*/
+  /*member: Class3.field:[null|exact=JSUInt31|powerset=1]*/
   static final field = getter;
 }
 
-/*member: getGetterInFinalStaticField:[null|exact=JSUInt31]*/
+/*member: getGetterInFinalStaticField:[null|exact=JSUInt31|powerset=1]*/
 getGetterInFinalStaticField() => Class3.field;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -86,9 +86,9 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 abstract class Class4 {
-  /*member: Class4.field:[null|exact=JSUInt31]*/
+  /*member: Class4.field:[null|exact=JSUInt31|powerset=1]*/
   static var field = getter;
 }
 
-/*member: getGetterInStaticField:[null|exact=JSUInt31]*/
+/*member: getGetterInStaticField:[null|exact=JSUInt31|powerset=1]*/
 getGetterInStaticField() => Class4.field;
diff --git a/pkg/compiler/test/inference/data/initializer.dart b/pkg/compiler/test/inference/data/initializer.dart
index 8fab986..af17e41 100644
--- a/pkg/compiler/test/inference/data/initializer.dart
+++ b/pkg/compiler/test/inference/data/initializer.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   initializingFormal();
   fieldInitializer();
@@ -15,14 +15,14 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class1 {
-  /*member: Class1.field:[exact=JSUInt31]*/
+  /*member: Class1.field:[exact=JSUInt31|powerset=0]*/
   var field;
 
-  /*member: Class1.:[exact=Class1]*/
-  Class1(this. /*[exact=JSUInt31]*/ field);
+  /*member: Class1.:[exact=Class1|powerset=0]*/
+  Class1(this. /*[exact=JSUInt31|powerset=0]*/ field);
 }
 
-/*member: initializingFormal:[exact=Class1]*/
+/*member: initializingFormal:[exact=Class1|powerset=0]*/
 initializingFormal() => Class1(0);
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -30,14 +30,14 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class2 {
-  /*member: Class2.field:[exact=JSUInt31]*/
+  /*member: Class2.field:[exact=JSUInt31|powerset=0]*/
   var field;
 
-  /*member: Class2.:[exact=Class2]*/
-  Class2(/*[exact=JSUInt31]*/ field) : this.field = field;
+  /*member: Class2.:[exact=Class2|powerset=0]*/
+  Class2(/*[exact=JSUInt31|powerset=0]*/ field) : this.field = field;
 }
 
-/*member: fieldInitializer:[exact=Class2]*/
+/*member: fieldInitializer:[exact=Class2|powerset=0]*/
 fieldInitializer() => Class2(0);
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -45,17 +45,17 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class3 {
-  /*member: Class3.field:[exact=JSUInt31]*/
+  /*member: Class3.field:[exact=JSUInt31|powerset=0]*/
   var field;
 
-  /*member: Class3._:[exact=Class3]*/
-  Class3._(this. /*[exact=JSUInt31]*/ field);
+  /*member: Class3._:[exact=Class3|powerset=0]*/
+  Class3._(this. /*[exact=JSUInt31|powerset=0]*/ field);
 
-  /*member: Class3.:[exact=Class3]*/
-  Class3(/*[exact=JSUInt31]*/ field) : this._(field);
+  /*member: Class3.:[exact=Class3|powerset=0]*/
+  Class3(/*[exact=JSUInt31|powerset=0]*/ field) : this._(field);
 }
 
-/*member: thisInitializer:[exact=Class3]*/
+/*member: thisInitializer:[exact=Class3|powerset=0]*/
 thisInitializer() => Class3(0);
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -63,17 +63,17 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 abstract class SuperClass4 {
-  /*member: SuperClass4.field:[exact=JSUInt31]*/
+  /*member: SuperClass4.field:[exact=JSUInt31|powerset=0]*/
   var field;
 
-  /*member: SuperClass4.:[exact=Class4]*/
-  SuperClass4(this. /*[exact=JSUInt31]*/ field);
+  /*member: SuperClass4.:[exact=Class4|powerset=0]*/
+  SuperClass4(this. /*[exact=JSUInt31|powerset=0]*/ field);
 }
 
 class Class4 extends SuperClass4 {
-  /*member: Class4.:[exact=Class4]*/
-  Class4(/*[exact=JSUInt31]*/ field) : super(field);
+  /*member: Class4.:[exact=Class4|powerset=0]*/
+  Class4(/*[exact=JSUInt31|powerset=0]*/ field) : super(field);
 }
 
-/*member: superInitializer:[exact=Class4]*/
+/*member: superInitializer:[exact=Class4|powerset=0]*/
 superInitializer() => Class4(0);
diff --git a/pkg/compiler/test/inference/data/instance.dart b/pkg/compiler/test/inference/data/instance.dart
index a305aca..13a4cd3 100644
--- a/pkg/compiler/test/inference/data/instance.dart
+++ b/pkg/compiler/test/inference/data/instance.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   thisExact();
   thisSubclass();
@@ -17,104 +17,104 @@
 /// Return `this` of a class with no subclasses.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
-  /*member: Class1.method:[exact=Class1]*/
+  /*member: Class1.method:[exact=Class1|powerset=0]*/
   method() => this;
 }
 
-/*member: thisExact:[exact=Class1]*/
-thisExact() => Class1(). /*invoke: [exact=Class1]*/ method();
+/*member: thisExact:[exact=Class1|powerset=0]*/
+thisExact() => Class1(). /*invoke: [exact=Class1|powerset=0]*/ method();
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return `this` of a class with an instantiated subclass.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class2a.:[exact=Class2a]*/
+/*member: Class2a.:[exact=Class2a|powerset=0]*/
 class Class2a {
-  /*member: Class2a.method:[subclass=Class2a]*/
+  /*member: Class2a.method:[subclass=Class2a|powerset=0]*/
   method() => this;
 }
 
-/*member: Class2b.:[exact=Class2b]*/
+/*member: Class2b.:[exact=Class2b|powerset=0]*/
 class Class2b extends Class2a {}
 
-/*member: thisSubclass:[subclass=Class2a]*/
+/*member: thisSubclass:[subclass=Class2a|powerset=0]*/
 thisSubclass() {
   Class2b();
-  return Class2a(). /*invoke: [exact=Class2a]*/ method();
+  return Class2a(). /*invoke: [exact=Class2a|powerset=0]*/ method();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return `this` of a class with no instantiated subclasses.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class3a.:[exact=Class3a]*/
+/*member: Class3a.:[exact=Class3a|powerset=0]*/
 class Class3a {
-  /*member: Class3a.method:[exact=Class3a]*/
+  /*member: Class3a.method:[exact=Class3a|powerset=0]*/
   method() => this;
 }
 
 class Class3b extends Class3a {}
 
-/*member: thisSubclassExact:[exact=Class3a]*/
+/*member: thisSubclassExact:[exact=Class3a|powerset=0]*/
 thisSubclassExact() {
-  return Class3a(). /*invoke: [exact=Class3a]*/ method();
+  return Class3a(). /*invoke: [exact=Class3a|powerset=0]*/ method();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return `this` of a class that is mixed into an instantiated class.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class4a.:[exact=Class4a]*/
+/*member: Class4a.:[exact=Class4a|powerset=0]*/
 mixin class Class4a {
-  /*member: Class4a.method:[subtype=Class4a]*/
+  /*member: Class4a.method:[subtype=Class4a|powerset=0]*/
   method() => this;
 }
 
-/*member: Class4b.:[exact=Class4b]*/
+/*member: Class4b.:[exact=Class4b|powerset=0]*/
 class Class4b extends Object with Class4a {}
 
-/*member: thisSubtype:[subtype=Class4a]*/
+/*member: thisSubtype:[subtype=Class4a|powerset=0]*/
 thisSubtype() {
   Class4b();
-  return Class4a(). /*invoke: [exact=Class4a]*/ method();
+  return Class4a(). /*invoke: [exact=Class4a|powerset=0]*/ method();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return `this` of a class that is mixed into an uninstantiated class.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class5a.:[exact=Class5a]*/
+/*member: Class5a.:[exact=Class5a|powerset=0]*/
 mixin class Class5a {
-  /*member: Class5a.method:[exact=Class5a]*/
+  /*member: Class5a.method:[exact=Class5a|powerset=0]*/
   method() => this;
 }
 
 class Class5b extends Object with Class5a {}
 
-/*member: thisSubtypeExact:[exact=Class5a]*/
+/*member: thisSubtypeExact:[exact=Class5a|powerset=0]*/
 thisSubtypeExact() {
-  return Class5a(). /*invoke: [exact=Class5a]*/ method();
+  return Class5a(). /*invoke: [exact=Class5a|powerset=0]*/ method();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return `this` of a mixed in class that is itself instantiated.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class6a.:[exact=Class6a]*/
+/*member: Class6a.:[exact=Class6a|powerset=0]*/
 mixin class Class6a {
-  /*member: Class6a.method:[subtype=Class6a]*/
+  /*member: Class6a.method:[subtype=Class6a|powerset=0]*/
   method() => this;
 }
 
-/*member: Class6b.:[exact=Class6b]*/
+/*member: Class6b.:[exact=Class6b|powerset=0]*/
 class Class6b extends Object with Class6a {}
 
-/*member: thisSubtypeMixedIn:[subtype=Class6a]*/
+/*member: thisSubtypeMixedIn:[subtype=Class6a|powerset=0]*/
 thisSubtypeMixedIn() {
   Class6a();
-  return Class6b(). /*invoke: [exact=Class6b]*/ method();
+  return Class6b(). /*invoke: [exact=Class6b|powerset=0]*/ method();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -122,14 +122,14 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 mixin Class7a {
-  /*member: Class7a.method:[exact=Class7b]*/
+  /*member: Class7a.method:[exact=Class7b|powerset=0]*/
   method() => this;
 }
 
-/*member: Class7b.:[exact=Class7b]*/
+/*member: Class7b.:[exact=Class7b|powerset=0]*/
 class Class7b extends Object with Class7a {}
 
-/*member: thisSubtypeExactMixedIn:[exact=Class7b]*/
+/*member: thisSubtypeExactMixedIn:[exact=Class7b|powerset=0]*/
 thisSubtypeExactMixedIn() {
-  return Class7b(). /*invoke: [exact=Class7b]*/ method();
+  return Class7b(). /*invoke: [exact=Class7b|powerset=0]*/ method();
 }
diff --git a/pkg/compiler/test/inference/data/issue13354.dart b/pkg/compiler/test/inference/data/issue13354.dart
index 5a9049a..3c07a25 100644
--- a/pkg/compiler/test/inference/data/issue13354.dart
+++ b/pkg/compiler/test/inference/data/issue13354.dart
@@ -4,26 +4,26 @@
 
 // Regression test for issue 13354.
 
-/*member: bar:[exact=JSUInt31]*/
+/*member: bar:[exact=JSUInt31|powerset=0]*/
 bar() => 42;
 
-/*member: baz:[subclass=Closure]*/
+/*member: baz:[subclass=Closure|powerset=0]*/
 baz() => bar;
 
-/*member: A.:[exact=A]*/
+/*member: A.:[exact=A|powerset=0]*/
 class A {
-  /*member: A.foo:[exact=JSUInt31]*/
+  /*member: A.foo:[exact=JSUInt31|powerset=0]*/
   foo() => 42;
 }
 
-/*member: B.:[exact=B]*/
+/*member: B.:[exact=B|powerset=0]*/
 class B extends A {
-  /*member: B.foo:[subclass=Closure]*/
+  /*member: B.foo:[subclass=Closure|powerset=0]*/
   foo() => super.foo;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   baz();
-  B(). /*invoke: [exact=B]*/ foo();
+  B(). /*invoke: [exact=B|powerset=0]*/ foo();
 }
diff --git a/pkg/compiler/test/inference/data/issue48304.dart b/pkg/compiler/test/inference/data/issue48304.dart
index dc77fc3..376725d 100644
--- a/pkg/compiler/test/inference/data/issue48304.dart
+++ b/pkg/compiler/test/inference/data/issue48304.dart
@@ -6,29 +6,37 @@
   call<T>();
 }
 
-/*member: C.:[exact=C]*/
+/*member: C.:[exact=C|powerset=0]*/
 class C implements B {
-  /*member: C.call:[null]*/
+  /*member: C.call:[null|powerset=1]*/
   call<T>() => print(T);
 }
 
 abstract class A {}
 
 class Wrapper {
-  /*member: Wrapper.:[exact=Wrapper]*/
-  Wrapper(this. /*[exact=C]*/ b, this. /*[exact=C]*/ call);
-  /*member: Wrapper.b:[exact=C]*/
+  /*member: Wrapper.:[exact=Wrapper|powerset=0]*/
+  Wrapper(
+    this. /*[exact=C|powerset=0]*/ b,
+    this. /*[exact=C|powerset=0]*/ call,
+  );
+  /*member: Wrapper.b:[exact=C|powerset=0]*/
   final B b;
-  /*member: Wrapper.call:[exact=C]*/
+  /*member: Wrapper.call:[exact=C|powerset=0]*/
   final B call;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 void main() {
   B b = C();
-  b/*invoke: [exact=C]*/ <A>();
-  Wrapper(b, b).b<A> /*invoke: [exact=Wrapper]*/ ();
-  (Wrapper(b, b). /*[exact=Wrapper]*/ b)<A> /*invoke: [exact=C]*/ ();
-  Wrapper(b, b).call<A> /*invoke: [exact=Wrapper]*/ ();
-  (Wrapper(b, b). /*[exact=Wrapper]*/ call)<A> /*invoke: [exact=C]*/ ();
+  b/*invoke: [exact=C|powerset=0]*/ <A>();
+  Wrapper(b, b).b<A> /*invoke: [exact=Wrapper|powerset=0]*/ ();
+  (Wrapper(
+    b,
+    b,
+  ). /*[exact=Wrapper|powerset=0]*/ b)<A> /*invoke: [exact=C|powerset=0]*/ ();
+  Wrapper(b, b).call<A> /*invoke: [exact=Wrapper|powerset=0]*/ ();
+  (Wrapper(b, b). /*[exact=Wrapper|powerset=0]*/ call)<
+    A
+  > /*invoke: [exact=C|powerset=0]*/ ();
 }
diff --git a/pkg/compiler/test/inference/data/issue_46770.dart b/pkg/compiler/test/inference/data/issue_46770.dart
index 739bd53..deedd96 100644
--- a/pkg/compiler/test/inference/data/issue_46770.dart
+++ b/pkg/compiler/test/inference/data/issue_46770.dart
@@ -6,37 +6,39 @@
   void m1();
 }
 
-/*member: L1.:[exact=L1]*/
+/*member: L1.:[exact=L1|powerset=0]*/
 class L1 implements L {
   @pragma('dart2js:noInline')
-  /*member: L1.m1:[null]*/
+  /*member: L1.m1:[null|powerset=1]*/
   void m1() => print("L1");
 }
 
-/*member: L2.:[exact=L2]*/
+/*member: L2.:[exact=L2|powerset=0]*/
 class L2 implements L {
   @pragma('dart2js:noInline')
-  /*member: L2.m1:[null]*/
+  /*member: L2.m1:[null|powerset=1]*/
   void m1() => print("L2");
 }
 
-/*member: L3.:[exact=L3]*/
+/*member: L3.:[exact=L3|powerset=0]*/
 class L3 implements L {
   @pragma('dart2js:noInline')
-  /*member: L3.m1:[null]*/
+  /*member: L3.m1:[null|powerset=1]*/
   void m1() => print("L3");
 }
 
-/*member: cTrue:[exact=JSBool]*/
+/*member: cTrue:[exact=JSBool|powerset=0]*/
 bool cTrue = confuse(true);
-/*member: value:[exact=JSUInt31]*/
+/*member: value:[exact=JSUInt31|powerset=0]*/
 int value = confuse(1);
 
 @pragma('dart2js:noInline')
-/*member: confuse:Union([exact=JSBool], [exact=JSUInt31])*/
-confuse(/*Union([exact=JSBool], [exact=JSUInt31])*/ x) => x;
+/*member: confuse:Union([exact=JSBool|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+confuse(
+  /*Union([exact=JSBool|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ x,
+) => x;
 
-/*member: test1:Union(null, [exact=L2], [exact=L3])*/
+/*member: test1:Union(null, [exact=L2|powerset=0], [exact=L3|powerset=0], powerset: 1)*/
 test1() {
   L? sourceInfo = L1();
   switch (value) {
@@ -51,11 +53,12 @@
       return null;
   }
 
-  sourceInfo. /*invoke: Union([exact=L2], [exact=L3])*/ m1();
+  sourceInfo
+      . /*invoke: Union([exact=L2|powerset=0], [exact=L3|powerset=0], powerset: 0)*/ m1();
   return sourceInfo;
 }
 
-/*member: test2:Union([exact=L1], [exact=L2], [exact=L3])*/
+/*member: test2:Union([exact=L1|powerset=0], [exact=L2|powerset=0], [exact=L3|powerset=0], powerset: 0)*/
 test2() {
   L? sourceInfo = L1();
   switch (value) {
@@ -70,11 +73,12 @@
     // Do nothing
   }
 
-  sourceInfo. /*invoke: Union([exact=L1], [exact=L2], [exact=L3])*/ m1();
+  sourceInfo
+      . /*invoke: Union([exact=L1|powerset=0], [exact=L2|powerset=0], [exact=L3|powerset=0], powerset: 0)*/ m1();
   return sourceInfo;
 }
 
-/*member: test3:Union(null, [exact=L2], [exact=L3])*/
+/*member: test3:Union(null, [exact=L2|powerset=0], [exact=L3|powerset=0], powerset: 1)*/
 test3() {
   L? sourceInfo = L1();
   switchTarget:
@@ -90,11 +94,12 @@
       return null;
   }
 
-  sourceInfo. /*invoke: Union([exact=L2], [exact=L3])*/ m1();
+  sourceInfo
+      . /*invoke: Union([exact=L2|powerset=0], [exact=L3|powerset=0], powerset: 0)*/ m1();
   return sourceInfo;
 }
 
-/*member: test4:Union(null, [exact=L1], [exact=L3])*/
+/*member: test4:Union(null, [exact=L1|powerset=0], [exact=L3|powerset=0], powerset: 1)*/
 test4() {
   L sourceInfo = L1();
   switch (value) {
@@ -107,18 +112,20 @@
       break;
     otherCase:
     case 2:
-      sourceInfo. /*invoke: Union([exact=L1], [exact=L2])*/ m1();
+      sourceInfo
+          . /*invoke: Union([exact=L1|powerset=0], [exact=L2|powerset=0], powerset: 0)*/ m1();
       sourceInfo = L1();
       break;
     default:
       return null;
   }
 
-  sourceInfo. /*invoke: Union([exact=L1], [exact=L3])*/ m1();
+  sourceInfo
+      . /*invoke: Union([exact=L1|powerset=0], [exact=L3|powerset=0], powerset: 0)*/ m1();
   return sourceInfo;
 }
 
-/*member: test5:Union(null, [exact=L1], [exact=L2], [exact=L3])*/
+/*member: test5:Union(null, [exact=L1|powerset=0], [exact=L2|powerset=0], [exact=L3|powerset=0], powerset: 1)*/
 test5() {
   L sourceInfo = L1();
   switch (value) {
@@ -136,11 +143,12 @@
       return null;
   }
 
-  sourceInfo. /*invoke: Union([exact=L1], [exact=L2], [exact=L3])*/ m1();
+  sourceInfo
+      . /*invoke: Union([exact=L1|powerset=0], [exact=L2|powerset=0], [exact=L3|powerset=0], powerset: 0)*/ m1();
   return sourceInfo;
 }
 
-/*member: test6:Union(null, [exact=L2], [exact=L3])*/
+/*member: test6:Union(null, [exact=L2|powerset=0], [exact=L3|powerset=0], powerset: 1)*/
 test6() {
   L sourceInfo = L1();
   switch (value) {
@@ -159,11 +167,12 @@
       return null;
   }
 
-  sourceInfo. /*invoke: Union([exact=L2], [exact=L3])*/ m1();
+  sourceInfo
+      . /*invoke: Union([exact=L2|powerset=0], [exact=L3|powerset=0], powerset: 0)*/ m1();
   return sourceInfo;
 }
 
-/*member: test7:[null|exact=L3]*/
+/*member: test7:[null|exact=L3|powerset=1]*/
 test7() {
   L? sourceInfo = L1();
   switch (value) {
@@ -178,11 +187,11 @@
       return null;
   }
 
-  sourceInfo. /*invoke: [exact=L3]*/ m1();
+  sourceInfo. /*invoke: [exact=L3|powerset=0]*/ m1();
   return sourceInfo;
 }
 
-/*member: test8:[null|exact=L3]*/
+/*member: test8:[null|exact=L3|powerset=1]*/
 test8() {
   L? sourceInfo = L1();
   switch (value) {
@@ -197,11 +206,11 @@
       return null;
   }
 
-  sourceInfo. /*invoke: [exact=L3]*/ m1();
+  sourceInfo. /*invoke: [exact=L3|powerset=0]*/ m1();
   return sourceInfo;
 }
 
-/*member: test9:[null|exact=L3]*/
+/*member: test9:[null|exact=L3|powerset=1]*/
 test9() {
   L? sourceInfo = L1();
   switch (value) {
@@ -216,11 +225,11 @@
       return null;
   }
 
-  sourceInfo. /*invoke: [exact=L3]*/ m1();
+  sourceInfo. /*invoke: [exact=L3|powerset=0]*/ m1();
   return sourceInfo;
 }
 
-/*member: test10:Union(null, [exact=L1], [exact=L2], [exact=L3])*/
+/*member: test10:Union(null, [exact=L1|powerset=0], [exact=L2|powerset=0], [exact=L3|powerset=0], powerset: 1)*/
 test10() {
   L sourceInfo = L1();
   try {
@@ -239,11 +248,12 @@
     // Do nothing
   }
 
-  sourceInfo. /*invoke: Union([exact=L1], [exact=L2], [exact=L3])*/ m1();
+  sourceInfo
+      . /*invoke: Union([exact=L1|powerset=0], [exact=L2|powerset=0], [exact=L3|powerset=0], powerset: 0)*/ m1();
   return sourceInfo;
 }
 
-/*member: test11:[null|exact=L3]*/
+/*member: test11:[null|exact=L3|powerset=1]*/
 test11() {
   L sourceInfo = L1();
   switch (value) {
@@ -257,11 +267,11 @@
     default:
       return null;
   }
-  sourceInfo. /*invoke: [exact=L3]*/ m1();
+  sourceInfo. /*invoke: [exact=L3|powerset=0]*/ m1();
   return sourceInfo;
 }
 
-/*member: test12:Union(null, [exact=L1], [exact=L3])*/
+/*member: test12:Union(null, [exact=L1|powerset=0], [exact=L3|powerset=0], powerset: 1)*/
 test12() {
   L? sourceInfo = L1();
   switch (value) {
@@ -276,11 +286,12 @@
     // Do nothing
   }
 
-  sourceInfo. /*invoke: Union([exact=L1], [exact=L3])*/ m1();
+  sourceInfo
+      . /*invoke: Union([exact=L1|powerset=0], [exact=L3|powerset=0], powerset: 0)*/ m1();
   return sourceInfo;
 }
 
-/*member: test13:Union(null, [exact=L2], [exact=L3])*/
+/*member: test13:Union(null, [exact=L2|powerset=0], [exact=L3|powerset=0], powerset: 1)*/
 test13() {
   L? sourceInfo = L1();
   switch (value) {
@@ -295,11 +306,12 @@
       sourceInfo = L2();
   }
 
-  sourceInfo. /*invoke: Union([exact=L2], [exact=L3])*/ m1();
+  sourceInfo
+      . /*invoke: Union([exact=L2|powerset=0], [exact=L3|powerset=0], powerset: 0)*/ m1();
   return sourceInfo;
 }
 
-/*member: test14:Union(null, [exact=L1], [exact=L2], [exact=L3])*/
+/*member: test14:Union(null, [exact=L1|powerset=0], [exact=L2|powerset=0], [exact=L3|powerset=0], powerset: 1)*/
 test14() {
   L sourceInfo = L1();
   whileLabel:
@@ -315,14 +327,15 @@
       default:
         return null;
     }
-    sourceInfo. /*invoke: [exact=L3]*/ m1();
+    sourceInfo. /*invoke: [exact=L3|powerset=0]*/ m1();
     break;
   }
-  sourceInfo. /*invoke: Union([exact=L1], [exact=L2], [exact=L3])*/ m1();
+  sourceInfo
+      . /*invoke: Union([exact=L1|powerset=0], [exact=L2|powerset=0], [exact=L3|powerset=0], powerset: 0)*/ m1();
   return sourceInfo;
 }
 
-/*member: test15:[null|exact=L3]*/
+/*member: test15:[null|exact=L3|powerset=1]*/
 test15() {
   L sourceInfo = L1();
   switch (value) {
@@ -340,11 +353,11 @@
       return null;
   }
 
-  sourceInfo. /*invoke: [exact=L3]*/ m1();
+  sourceInfo. /*invoke: [exact=L3|powerset=0]*/ m1();
   return sourceInfo;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   test1();
   test2();
diff --git a/pkg/compiler/test/inference/data/issue_48571.dart b/pkg/compiler/test/inference/data/issue_48571.dart
index 4acccc8..0204637 100644
--- a/pkg/compiler/test/inference/data/issue_48571.dart
+++ b/pkg/compiler/test/inference/data/issue_48571.dart
@@ -2,77 +2,77 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: Base.:[subclass=Base]*/
+/*member: Base.:[subclass=Base|powerset=0]*/
 abstract class Base {}
 
-/*member: Child1.:[exact=Child1]*/
+/*member: Child1.:[exact=Child1|powerset=0]*/
 class Child1 extends Base {}
 
-/*member: Child2.:[exact=Child2]*/
+/*member: Child2.:[exact=Child2|powerset=0]*/
 class Child2 extends Base {}
 
-/*member: trivial:Value([exact=JSBool], value: true)*/
-bool trivial(/*[exact=JSBool]*/ x) => true;
+/*member: trivial:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
+bool trivial(/*[exact=JSBool|powerset=0]*/ x) => true;
 
-/*member: either:Union([exact=Child1], [exact=Child2])*/
+/*member: either:Union([exact=Child1|powerset=0], [exact=Child2|powerset=0], powerset: 0)*/
 Base either =
     DateTime.now()
-                . /*[exact=DateTime]*/ millisecondsSinceEpoch /*invoke: [subclass=JSInt]*/ >
+                . /*[exact=DateTime|powerset=0]*/ millisecondsSinceEpoch /*invoke: [subclass=JSInt|powerset=0]*/ >
             0
         ? Child2()
         : Child1();
 
-/*member: test1:Union(null, [exact=Child1], [exact=Child2])*/
+/*member: test1:Union(null, [exact=Child1|powerset=0], [exact=Child2|powerset=0], powerset: 1)*/
 test1() {
   Base child = either;
   if (trivial(child is Child1 && true)) return child;
   return null;
 }
 
-/*member: test2:Union(null, [exact=Child1], [exact=Child2])*/
+/*member: test2:Union(null, [exact=Child1|powerset=0], [exact=Child2|powerset=0], powerset: 1)*/
 test2() {
   Base child = either;
   if (child is Child1 || trivial(child is Child1 && true)) return child;
   return null;
 }
 
-/*member: test3:[null|exact=Child2]*/
+/*member: test3:[null|exact=Child2|powerset=1]*/
 test3() {
   Base child = either;
   if (trivial(child is Child1 && true) && child is Child2) return child;
   return null;
 }
 
-/*member: test4:[null|exact=Child2]*/
+/*member: test4:[null|exact=Child2|powerset=1]*/
 test4() {
   Base child = either;
   if (child is Child2 && trivial(child is Child1 && true)) return child;
   return null;
 }
 
-/*member: test5:Union(null, [exact=Child1], [exact=Child2])*/
+/*member: test5:Union(null, [exact=Child1|powerset=0], [exact=Child2|powerset=0], powerset: 1)*/
 test5() {
   Base child = either;
-  if ((child is Child1 && true) /*invoke: [exact=JSBool]*/ == false)
+  if ((child is Child1 && true) /*invoke: [exact=JSBool|powerset=0]*/ == false)
     return child;
   return null;
 }
 
-/*member: test6:Union(null, [exact=Child1], [exact=Child2])*/
+/*member: test6:Union(null, [exact=Child1|powerset=0], [exact=Child2|powerset=0], powerset: 1)*/
 test6() {
   Base child = either;
   if (trivial(child is Child1 ? false : true)) return child;
   return null;
 }
 
-/*member: test7:Union(null, [exact=Child1], [exact=Child2])*/
+/*member: test7:Union(null, [exact=Child1|powerset=0], [exact=Child2|powerset=0], powerset: 1)*/
 test7() {
   Base child = either;
   if (trivial(trivial(child is Child1 && true))) return child;
   return null;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   test1();
   test2();
diff --git a/pkg/compiler/test/inference/data/issue_52170.dart b/pkg/compiler/test/inference/data/issue_52170.dart
index de3870c..8303588 100644
--- a/pkg/compiler/test/inference/data/issue_52170.dart
+++ b/pkg/compiler/test/inference/data/issue_52170.dart
@@ -2,16 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: getInt:[exact=JSUInt31]*/
+/*member: getInt:[exact=JSUInt31|powerset=0]*/
 int get getInt => 42;
 
-/*member: foo:Union(null, [exact=JSString], [exact=JSUInt31])*/
+/*member: foo:Union(null, [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
 foo() {
   dynamic local = 3;
   for (
     int i = 0;
-    i /*invoke: [subclass=JSPositiveInt]*/ < 10;
-    i /*invoke: [subclass=JSPositiveInt]*/ ++
+    i /*invoke: [subclass=JSPositiveInt|powerset=0]*/ < 10;
+    i /*invoke: [subclass=JSPositiveInt|powerset=0]*/ ++
   ) {
     switch (getInt) {
       case 42:
@@ -19,14 +19,14 @@
       default:
         local = 'hello';
     }
-    if (i /*invoke: [subclass=JSPositiveInt]*/ > 5) {
+    if (i /*invoke: [subclass=JSPositiveInt|powerset=0]*/ > 5) {
       return local;
     }
   }
   return null;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 void main() {
   foo();
 }
diff --git a/pkg/compiler/test/inference/data/issue_53944.dart b/pkg/compiler/test/inference/data/issue_53944.dart
index ec66229..034787a 100644
--- a/pkg/compiler/test/inference/data/issue_53944.dart
+++ b/pkg/compiler/test/inference/data/issue_53944.dart
@@ -4,51 +4,55 @@
 
 // Make sure first and last selectors properly update types.
 
-/*member: testUnchangedFirst:[null]*/
-void testUnchangedFirst(/*Value([exact=JSBool], value: true)*/ x) {}
+/*member: testUnchangedFirst:[null|powerset=1]*/
+void testUnchangedFirst(
+  /*Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/ x,
+) {}
 
-/*member: testFirst1:[null]*/
-void testFirst1(/*[exact=JSBool]*/ x) {}
+/*member: testFirst1:[null|powerset=1]*/
+void testFirst1(/*[exact=JSBool|powerset=0]*/ x) {}
 
-/*member: testFirst2:[null]*/
-void testFirst2(/*[exact=JSBool]*/ x) {}
+/*member: testFirst2:[null|powerset=1]*/
+void testFirst2(/*[exact=JSBool|powerset=0]*/ x) {}
 
-/*member: testUnchangedLast:[null]*/
-void testUnchangedLast(/*Value([exact=JSBool], value: true)*/ x) {}
+/*member: testUnchangedLast:[null|powerset=1]*/
+void testUnchangedLast(
+  /*Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/ x,
+) {}
 
-/*member: testLast1:[null]*/
-void testLast1(/*[exact=JSBool]*/ x) {}
+/*member: testLast1:[null|powerset=1]*/
+void testLast1(/*[exact=JSBool|powerset=0]*/ x) {}
 
-/*member: testLast2:[null]*/
-void testLast2(/*[exact=JSBool]*/ x) {}
+/*member: testLast2:[null|powerset=1]*/
+void testLast2(/*[exact=JSBool|powerset=0]*/ x) {}
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   final List<Object> x = [true, true];
   testFirst1(
-    x. /*Container([exact=JSExtendableArray], element: [exact=JSBool], length: 2)*/ first,
+    x. /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSBool|powerset=0], length: 2, powerset: 0)*/ first,
   );
-  x. /*update: Container([exact=JSExtendableArray], element: [exact=JSBool], length: 2)*/ first =
+  x. /*update: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSBool|powerset=0], length: 2, powerset: 0)*/ first =
       false;
   testFirst2(
-    x. /*Container([exact=JSExtendableArray], element: [exact=JSBool], length: 2)*/ first,
+    x. /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSBool|powerset=0], length: 2, powerset: 0)*/ first,
   );
 
   final List<Object> y = [true, true];
   testLast1(
-    y. /*Container([exact=JSExtendableArray], element: [exact=JSBool], length: 2)*/ first,
+    y. /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSBool|powerset=0], length: 2, powerset: 0)*/ first,
   );
-  y. /*update: Container([exact=JSExtendableArray], element: [exact=JSBool], length: 2)*/ last =
+  y. /*update: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSBool|powerset=0], length: 2, powerset: 0)*/ last =
       false;
   testLast2(
-    y. /*Container([exact=JSExtendableArray], element: [exact=JSBool], length: 2)*/ first,
+    y. /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSBool|powerset=0], length: 2, powerset: 0)*/ first,
   );
 
   final List<Object> z = [true, true];
   testUnchangedFirst(
-    z. /*Container([exact=JSExtendableArray], element: Value([exact=JSBool], value: true), length: 2)*/ first,
+    z. /*Container([exact=JSExtendableArray|powerset=0], element: Value([exact=JSBool|powerset=0], value: true, powerset: 0), length: 2, powerset: 0)*/ first,
   );
   testUnchangedLast(
-    z. /*Container([exact=JSExtendableArray], element: Value([exact=JSBool], value: true), length: 2)*/ last,
+    z. /*Container([exact=JSExtendableArray|powerset=0], element: Value([exact=JSBool|powerset=0], value: true, powerset: 0), length: 2, powerset: 0)*/ last,
   );
 }
diff --git a/pkg/compiler/test/inference/data/js_interop.dart b/pkg/compiler/test/inference/data/js_interop.dart
index ce6a004..355c946 100644
--- a/pkg/compiler/test/inference/data/js_interop.dart
+++ b/pkg/compiler/test/inference/data/js_interop.dart
@@ -7,7 +7,7 @@
 
 import 'package:js/js.dart';
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   anonymousClass();
   jsInteropClass();
@@ -16,37 +16,37 @@
 @JS()
 @anonymous
 class Class1 {
-  /*member: Class1.:[null|subclass=Object]*/
+  /*member: Class1.:[null|subclass=Object|powerset=1]*/
   external factory Class1({
-    /*[exact=JSUInt31]*/ a,
-    /*Value([exact=JSString], value: "")*/ b,
+    /*[exact=JSUInt31|powerset=0]*/ a,
+    /*Value([exact=JSString|powerset=0], value: "", powerset: 0)*/ b,
   });
 }
 
-/*member: anonymousClass:[subclass=LegacyJavaScriptObject]*/
+/*member: anonymousClass:[subclass=LegacyJavaScriptObject|powerset=0]*/
 anonymousClass() => Class1(a: 1, b: '');
 
 @JS()
 class JsInteropClass {
-  /*member: JsInteropClass.:[null|subclass=Object]*/
+  /*member: JsInteropClass.:[null|subclass=Object|powerset=1]*/
   external JsInteropClass();
 
-  /*member: JsInteropClass.getter:[null|subclass=Object]*/
+  /*member: JsInteropClass.getter:[null|subclass=Object|powerset=1]*/
   external int get getter;
 
-  external void set setter(int /*[subclass=JSInt]*/ value);
+  external void set setter(int /*[subclass=JSInt|powerset=0]*/ value);
 
-  /*member: JsInteropClass.method:[null|subclass=Object]*/
-  external int method(int /*[exact=JSUInt31]*/ a);
+  /*member: JsInteropClass.method:[null|subclass=Object|powerset=1]*/
+  external int method(int /*[exact=JSUInt31|powerset=0]*/ a);
 }
 
-/*member: jsInteropClass:[subclass=JSInt]*/
+/*member: jsInteropClass:[subclass=JSInt|powerset=0]*/
 jsInteropClass() {
   JsInteropClass cls = JsInteropClass();
-  return cls. /*update: [exact=JsInteropClass]*/ setter =
-      cls. /*[exact=JsInteropClass]*/ getter /*invoke: [subclass=JSInt]*/ +
-      cls. /*invoke: [exact=JsInteropClass]*/ method(
+  return cls. /*update: [exact=JsInteropClass|powerset=0]*/ setter =
+      cls. /*[exact=JsInteropClass|powerset=0]*/ getter /*invoke: [subclass=JSInt|powerset=0]*/ +
+      cls. /*invoke: [exact=JsInteropClass|powerset=0]*/ method(
         0,
-      ) /*invoke: [subclass=JSInt]*/ +
+      ) /*invoke: [subclass=JSInt|powerset=0]*/ +
       10;
 }
diff --git a/pkg/compiler/test/inference/data/late_field.dart b/pkg/compiler/test/inference/data/late_field.dart
index 2038243..1f85282 100644
--- a/pkg/compiler/test/inference/data/late_field.dart
+++ b/pkg/compiler/test/inference/data/late_field.dart
@@ -4,18 +4,19 @@
 
 import 'package:compiler/src/util/testing.dart';
 
-/*member: Foo.:[exact=Foo]*/
+/*member: Foo.:[exact=Foo|powerset=0]*/
 class Foo {
-  /*member: Foo._#Foo#x#AI:[sentinel|exact=JSUInt31]*/
-  /*member: Foo.x:[exact=JSUInt31]*/
-  late int /*[exact=Foo]*/ /*update: [exact=Foo]*/ x = 42;
+  /*member: Foo._#Foo#x#AI:[sentinel|exact=JSUInt31|powerset=2]*/
+  /*member: Foo.x:[exact=JSUInt31|powerset=0]*/
+  late int /*[exact=Foo|powerset=0]*/ /*update: [exact=Foo|powerset=0]*/ x = 42;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 void main() {
   makeLive(test(Foo()));
 }
 
 @pragma('dart2js:noInline')
-/*member: test:[exact=JSUInt31]*/
-int test(Foo /*[exact=Foo]*/ foo) => foo. /*[exact=Foo]*/ x;
+/*member: test:[exact=JSUInt31|powerset=0]*/
+int test(Foo /*[exact=Foo|powerset=0]*/ foo) =>
+    foo. /*[exact=Foo|powerset=0]*/ x;
diff --git a/pkg/compiler/test/inference/data/list.dart b/pkg/compiler/test/inference/data/list.dart
index e77b765..0eb8a7f 100644
--- a/pkg/compiler/test/inference/data/list.dart
+++ b/pkg/compiler/test/inference/data/list.dart
@@ -4,7 +4,7 @@
 
 import 'dart:typed_data';
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   emptyList();
   nullList();
@@ -28,65 +28,65 @@
   newUint8List();
 }
 
-/*member: emptyList:Container([exact=JSExtendableArray], element: [empty], length: 0)*/
+/*member: emptyList:Container([exact=JSExtendableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)*/
 emptyList() => [];
 
-/*member: constList:Container([exact=JSUnmodifiableArray], element: [empty], length: 0)*/
+/*member: constList:Container([exact=JSUnmodifiableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)*/
 constList() => const [];
 
-/*member: nullList:Container([exact=JSExtendableArray], element: [null], length: 1)*/
+/*member: nullList:Container([exact=JSExtendableArray|powerset=0], element: [null|powerset=1], length: 1, powerset: 0)*/
 nullList() => [null];
 
-/*member: constNullList:Container([exact=JSUnmodifiableArray], element: [null], length: 1)*/
+/*member: constNullList:Container([exact=JSUnmodifiableArray|powerset=0], element: [null|powerset=1], length: 1, powerset: 0)*/
 constNullList() => const [null];
 
-/*member: intList:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 3)*/
+/*member: intList:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 3, powerset: 0)*/
 intList() => [1, 2, 3];
 
-/*member: newFilledList:Container([exact=JSFixedArray], element: Value([exact=JSString], value: ""), length: 3)*/
+/*member: newFilledList:Container([exact=JSFixedArray|powerset=0], element: Value([exact=JSString|powerset=0], value: "", powerset: 0), length: 3, powerset: 0)*/
 newFilledList() => List.filled(3, '');
 
-/*member: newFilledGrowableList:Container([exact=JSExtendableArray], element: Value([exact=JSString], value: ""), length: 3)*/
+/*member: newFilledGrowableList:Container([exact=JSExtendableArray|powerset=0], element: Value([exact=JSString|powerset=0], value: "", powerset: 0), length: 3, powerset: 0)*/
 newFilledGrowableList() => List.filled(3, '', growable: true);
 
-/*member: newFloat32x4List:[exact=NativeFloat32x4List]*/
+/*member: newFloat32x4List:[exact=NativeFloat32x4List|powerset=0]*/
 newFloat32x4List() => Float32x4List(4);
 
-/*member: newInt32x4List:[exact=NativeInt32x4List]*/
+/*member: newInt32x4List:[exact=NativeInt32x4List|powerset=0]*/
 newInt32x4List() => Int32x4List(5);
 
-/*member: newFloat64x2List:[exact=NativeFloat64x2List]*/
+/*member: newFloat64x2List:[exact=NativeFloat64x2List|powerset=0]*/
 newFloat64x2List() => Float64x2List(6);
 
-/*member: newFloat32List:Container([exact=NativeFloat32List], element: [subclass=JSNumber], length: 7)*/
+/*member: newFloat32List:Container([exact=NativeFloat32List|powerset=0], element: [subclass=JSNumber|powerset=0], length: 7, powerset: 0)*/
 newFloat32List() => Float32List(7);
 
-/*member: newFloat64List:Container([exact=NativeFloat64List], element: [subclass=JSNumber], length: 8)*/
+/*member: newFloat64List:Container([exact=NativeFloat64List|powerset=0], element: [subclass=JSNumber|powerset=0], length: 8, powerset: 0)*/
 newFloat64List() => Float64List(8);
 
-/*member: newInt16List:Container([exact=NativeInt16List], element: [subclass=JSInt], length: 9)*/
+/*member: newInt16List:Container([exact=NativeInt16List|powerset=0], element: [subclass=JSInt|powerset=0], length: 9, powerset: 0)*/
 newInt16List() => Int16List(9);
 
 ////////////////////////////////////////////////////////////////////////////////
 // Create a Int32List using an unchanged non-final top-level field as length.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _field1:[exact=JSUInt31]*/
+/*member: _field1:[exact=JSUInt31|powerset=0]*/
 var _field1 = 10;
 
-/*member: newInt32List:Container([exact=NativeInt32List], element: [subclass=JSInt], length: 10)*/
+/*member: newInt32List:Container([exact=NativeInt32List|powerset=0], element: [subclass=JSInt|powerset=0], length: 10, powerset: 0)*/
 newInt32List() => Int32List(_field1);
 
 ////////////////////////////////////////////////////////////////////////////////
 // Create a Int32List using a changed non-final top-level field as length.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _field1b:[subclass=JSPositiveInt]*/
+/*member: _field1b:[subclass=JSPositiveInt|powerset=0]*/
 var _field1b = 10;
 
-/*member: newInt32List2:Container([exact=NativeInt32List], element: [subclass=JSInt], length: null)*/
+/*member: newInt32List2:Container([exact=NativeInt32List|powerset=0], element: [subclass=JSInt|powerset=0], length: null, powerset: 0)*/
 newInt32List2() {
-  _field1b /*invoke: [subclass=JSPositiveInt]*/ ++;
+  _field1b /*invoke: [subclass=JSPositiveInt|powerset=0]*/ ++;
   return Int32List(_field1b);
 }
 
@@ -94,10 +94,10 @@
 // Create a Int8List using a final top-level field as length.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _field2:[exact=JSUInt31]*/
+/*member: _field2:[exact=JSUInt31|powerset=0]*/
 final _field2 = 11;
 
-/*member: newInt8List:Container([exact=NativeInt8List], element: [subclass=JSInt], length: 11)*/
+/*member: newInt8List:Container([exact=NativeInt8List|powerset=0], element: [subclass=JSInt|powerset=0], length: 11, powerset: 0)*/
 newInt8List() => Int8List(_field2);
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -106,21 +106,21 @@
 
 const _field3 = 12;
 
-/*member: newUint16List:Container([exact=NativeUint16List], element: [exact=JSUInt31], length: 12)*/
+/*member: newUint16List:Container([exact=NativeUint16List|powerset=0], element: [exact=JSUInt31|powerset=0], length: 12, powerset: 0)*/
 newUint16List() => Uint16List(_field3);
 
 ////////////////////////////////////////////////////////////////////////////////
 // Create a Uint32List using a parenthesized literal int as length.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: newUint32List:Container([exact=NativeUint32List], element: [subclass=JSUInt32], length: 13)*/
+/*member: newUint32List:Container([exact=NativeUint32List|powerset=0], element: [subclass=JSUInt32|powerset=0], length: 13, powerset: 0)*/
 newUint32List() => Uint32List((13));
 
 ////////////////////////////////////////////////////////////////////////////////
 // Create a Uint8ClampedList using a constant multiplication as length.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: newUint8ClampedList:Container([exact=NativeUint8ClampedList], element: [exact=JSUInt31], length: 14)*/
+/*member: newUint8ClampedList:Container([exact=NativeUint8ClampedList|powerset=0], element: [exact=JSUInt31|powerset=0], length: 14, powerset: 0)*/
 newUint8ClampedList() => Uint8ClampedList(2 * 7);
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -131,5 +131,5 @@
   static const field = 15;
 }
 
-/*member: newUint8List:Container([exact=NativeUint8List], element: [exact=JSUInt31], length: 15)*/
+/*member: newUint8List:Container([exact=NativeUint8List|powerset=0], element: [exact=JSUInt31|powerset=0], length: 15, powerset: 0)*/
 newUint8List() => Uint8List(Class1.field);
diff --git a/pkg/compiler/test/inference/data/list2.dart b/pkg/compiler/test/inference/data/list2.dart
index aa0d4df..5df3d41 100644
--- a/pkg/compiler/test/inference/data/list2.dart
+++ b/pkg/compiler/test/inference/data/list2.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   boolFlag = !boolFlag;
-  data. /*invoke: Container([exact=JSExtendableArray], element: [subclass=JSInt], length: null)*/ add(
+  data. /*invoke: Container([exact=JSExtendableArray|powerset=0], element: [subclass=JSInt|powerset=0], length: null, powerset: 0)*/ add(
     100,
   );
 
@@ -35,109 +35,111 @@
   ];
 }
 
-/*member: boolFlag:[exact=JSBool]*/
+/*member: boolFlag:[exact=JSBool|powerset=0]*/
 bool boolFlag = true;
 
-/*member: data:Container([exact=JSExtendableArray], element: [subclass=JSInt], length: null)*/
+/*member: data:Container([exact=JSExtendableArray|powerset=0], element: [subclass=JSInt|powerset=0], length: null, powerset: 0)*/
 List<int> data = [-1, 1];
 
 // -------- List.empty --------
 
-/*member: listEmptyDefault:Container([exact=JSFixedArray], element: [empty], length: 0)*/
+/*member: listEmptyDefault:Container([exact=JSFixedArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)*/
 get listEmptyDefault => List<int>.empty();
 
-/*member: listEmptyGrowable:Container([exact=JSExtendableArray], element: [empty], length: 0)*/
+/*member: listEmptyGrowable:Container([exact=JSExtendableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)*/
 get listEmptyGrowable => List<int>.empty(growable: true);
 
-/*member: listEmptyFixed:Container([exact=JSFixedArray], element: [empty], length: 0)*/
+/*member: listEmptyFixed:Container([exact=JSFixedArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)*/
 get listEmptyFixed => List<int>.empty(growable: false);
 
-/*member: listEmptyEither:Container([subclass=JSMutableArray], element: [empty], length: 0)*/
+/*member: listEmptyEither:Container([subclass=JSMutableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)*/
 get listEmptyEither => List<int>.empty(growable: boolFlag);
 
 // -------- List.filled --------
 
-/*member: listFilledDefault:Container([exact=JSFixedArray], element: Value([exact=JSString], value: "x"), length: 5)*/
+/*member: listFilledDefault:Container([exact=JSFixedArray|powerset=0], element: Value([exact=JSString|powerset=0], value: "x", powerset: 0), length: 5, powerset: 0)*/
 get listFilledDefault => List.filled(5, 'x');
 
-/*member: listFilledGrowable:Container([exact=JSExtendableArray], element: Value([exact=JSString], value: "g"), length: 5)*/
+/*member: listFilledGrowable:Container([exact=JSExtendableArray|powerset=0], element: Value([exact=JSString|powerset=0], value: "g", powerset: 0), length: 5, powerset: 0)*/
 get listFilledGrowable => List.filled(5, 'g', growable: true);
 
-/*member: listFilledFixed:Container([exact=JSFixedArray], element: Value([exact=JSString], value: "f"), length: 5)*/
+/*member: listFilledFixed:Container([exact=JSFixedArray|powerset=0], element: Value([exact=JSString|powerset=0], value: "f", powerset: 0), length: 5, powerset: 0)*/
 get listFilledFixed => List.filled(5, 'f', growable: false);
 
-/*member: listFilledEither:Container([subclass=JSMutableArray], element: Value([exact=JSString], value: "e"), length: 5)*/
+/*member: listFilledEither:Container([subclass=JSMutableArray|powerset=0], element: Value([exact=JSString|powerset=0], value: "e", powerset: 0), length: 5, powerset: 0)*/
 get listFilledEither => List.filled(5, 'e', growable: boolFlag);
 
 // -------- List.generate --------
 
-/*member: listGenerateDefault:Container([exact=JSExtendableArray], element: [exact=JSString], length: 8)*/
+/*member: listGenerateDefault:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSString|powerset=0], length: 8, powerset: 0)*/
 get listGenerateDefault =>
-    List. /*update: Container([exact=JSExtendableArray], element: [exact=JSString], length: 8)*/ generate(
+    List. /*update: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSString|powerset=0], length: 8, powerset: 0)*/ generate(
       8,
       (i) => 'x$i',
     );
 
-/*member: listGenerateGrowable:Container([exact=JSExtendableArray], element: [exact=JSString], length: 8)*/
+/*member: listGenerateGrowable:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSString|powerset=0], length: 8, powerset: 0)*/
 get listGenerateGrowable =>
-    List. /*update: Container([exact=JSExtendableArray], element: [exact=JSString], length: 8)*/ generate(
+    List. /*update: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSString|powerset=0], length: 8, powerset: 0)*/ generate(
       8,
       (i) => 'g$i',
       growable: true,
     );
 
-/*member: listGenerateFixed:Container([exact=JSFixedArray], element: [exact=JSString], length: 8)*/
+/*member: listGenerateFixed:Container([exact=JSFixedArray|powerset=0], element: [exact=JSString|powerset=0], length: 8, powerset: 0)*/
 get listGenerateFixed =>
-    List. /*update: Container([exact=JSFixedArray], element: [exact=JSString], length: 8)*/ generate(
+    List. /*update: Container([exact=JSFixedArray|powerset=0], element: [exact=JSString|powerset=0], length: 8, powerset: 0)*/ generate(
       8,
       (i) => 'f$i',
       growable: false,
     );
 
-/*member: listGenerateEither:Container([subclass=JSMutableArray], element: [exact=JSString], length: 8)*/
+/*member: listGenerateEither:Container([subclass=JSMutableArray|powerset=0], element: [exact=JSString|powerset=0], length: 8, powerset: 0)*/
 get listGenerateEither => List.generate(
   8,
-  /*[exact=JSString]*/ (/*[subclass=JSPositiveInt]*/ i) => 'e$i',
+  /*[exact=JSString|powerset=0]*/ (/*[subclass=JSPositiveInt|powerset=0]*/ i) =>
+      'e$i',
   growable: boolFlag,
 );
 
-/*member: listGenerateBigClosure:Container([exact=JSExtendableArray], element: [exact=JSString], length: 8)*/
-get listGenerateBigClosure =>
-    List.generate(8, /*[exact=JSString]*/ (/*[subclass=JSPositiveInt]*/ i) {
-      if (i /*invoke: [subclass=JSPositiveInt]*/ == 1) return 'one';
-      if (i /*invoke: [subclass=JSPositiveInt]*/ == 2) return 'two';
-      return '$i';
-    });
+/*member: listGenerateBigClosure:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSString|powerset=0], length: 8, powerset: 0)*/
+get listGenerateBigClosure => List.generate(8, /*[exact=JSString|powerset=0]*/ (
+  /*[subclass=JSPositiveInt|powerset=0]*/ i,
+) {
+  if (i /*invoke: [subclass=JSPositiveInt|powerset=0]*/ == 1) return 'one';
+  if (i /*invoke: [subclass=JSPositiveInt|powerset=0]*/ == 2) return 'two';
+  return '$i';
+});
 
 // -------- List.of --------
 
-/*member: listOfDefault:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
+/*member: listOfDefault:Container([exact=JSExtendableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0)*/
 get listOfDefault => List.of(data);
 
-/*member: listOfGrowable:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
+/*member: listOfGrowable:Container([exact=JSExtendableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0)*/
 get listOfGrowable => List.of(data, growable: true);
 
-/*member: listOfFixed:Container([exact=JSFixedArray], element: [null|subclass=Object], length: null)*/
+/*member: listOfFixed:Container([exact=JSFixedArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0)*/
 get listOfFixed => List.of(data, growable: false);
 
-/*member: listOfEither:Container([subclass=JSMutableArray], element: [null|subclass=Object], length: null)*/
+/*member: listOfEither:Container([subclass=JSMutableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0)*/
 get listOfEither => List.of(data, growable: boolFlag);
 
 // -------- List.from --------
 
-/*member: listFromDefault:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
+/*member: listFromDefault:Container([exact=JSExtendableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0)*/
 get listFromDefault => List.from(data);
 
-/*member: listFromGrowable:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
+/*member: listFromGrowable:Container([exact=JSExtendableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0)*/
 get listFromGrowable => List.from(data, growable: true);
 
-/*member: listFromFixed:Container([exact=JSFixedArray], element: [null|subclass=Object], length: null)*/
+/*member: listFromFixed:Container([exact=JSFixedArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0)*/
 get listFromFixed => List.from(data, growable: false);
 
-/*member: listFromEither:Container([subclass=JSMutableArray], element: [null|subclass=Object], length: null)*/
+/*member: listFromEither:Container([subclass=JSMutableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0)*/
 get listFromEither => List.from(data, growable: boolFlag);
 
 // -------- List.unmodifiable --------
 
-/*member: listUnmodifiable:[exact=JSUnmodifiableArray]*/
+/*member: listUnmodifiable:[exact=JSUnmodifiableArray|powerset=0]*/
 get listUnmodifiable => List.unmodifiable(data);
diff --git a/pkg/compiler/test/inference/data/list_huge.dart b/pkg/compiler/test/inference/data/list_huge.dart
index 574748a..121cc94 100644
--- a/pkg/compiler/test/inference/data/list_huge.dart
+++ b/pkg/compiler/test/inference/data/list_huge.dart
@@ -4,7 +4,7 @@
 
 // Test for Container type for Lists with huge or negative sizes.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   hugeList1();
   hugeList2();
@@ -12,35 +12,35 @@
   hugeList4();
 }
 
-/*member: thing:[null]*/
+/*member: thing:[null|powerset=1]*/
 dynamic thing;
 
-/*member: _huge1:[subclass=JSPositiveInt]*/
+/*member: _huge1:[subclass=JSPositiveInt|powerset=0]*/
 final _huge1 = 5000000000;
 
-/*member: hugeList1:Container([exact=JSFixedArray], element: [null], length: null)*/
+/*member: hugeList1:Container([exact=JSFixedArray|powerset=0], element: [null|powerset=1], length: null, powerset: 0)*/
 hugeList1() => List.filled(_huge1, thing);
 
 const _huge2a = 10000000000 * 10000000000;
 
-/*member: _huge2b:[subclass=JSPositiveInt]*/
+/*member: _huge2b:[subclass=JSPositiveInt|powerset=0]*/
 final _huge2b = _huge2a;
 
-/*member: hugeList2:Container([exact=JSFixedArray], element: [null], length: null)*/
+/*member: hugeList2:Container([exact=JSFixedArray|powerset=0], element: [null|powerset=1], length: null, powerset: 0)*/
 hugeList2() => List.filled(_huge2b, thing);
 
 const _huge3a = -10000000;
 
-/*member: _huge3b:[subclass=JSInt]*/
+/*member: _huge3b:[subclass=JSInt|powerset=0]*/
 final _huge3b = _huge3a;
 
-/*member: hugeList3:Container([exact=JSFixedArray], element: [null], length: null)*/
+/*member: hugeList3:Container([exact=JSFixedArray|powerset=0], element: [null|powerset=1], length: null, powerset: 0)*/
 hugeList3() => List.filled(_huge3b, thing);
 
 // 'Small' limits are still tracked.
 
-/*member: _huge4:[exact=JSUInt31]*/
+/*member: _huge4:[exact=JSUInt31|powerset=0]*/
 final _huge4 = 10000000;
 
-/*member: hugeList4:Container([exact=JSFixedArray], element: [null], length: 10000000)*/
+/*member: hugeList4:Container([exact=JSFixedArray|powerset=0], element: [null|powerset=1], length: 10000000, powerset: 0)*/
 hugeList4() => List.filled(_huge4, thing);
diff --git a/pkg/compiler/test/inference/data/list_js.dart b/pkg/compiler/test/inference/data/list_js.dart
index 6d6f634..eac453b 100644
--- a/pkg/compiler/test/inference/data/list_js.dart
+++ b/pkg/compiler/test/inference/data/list_js.dart
@@ -7,7 +7,7 @@
 /// ignore: IMPORT_INTERNAL_LIBRARY
 import 'dart:_foreign_helper' show JS;
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   test1();
   test2();
@@ -15,50 +15,50 @@
   test4();
 }
 
-/*member: test1:[null]*/
+/*member: test1:[null|powerset=1]*/
 test1() {
   var list = [42];
   JS('', '#', list); // '#' is by default a no-op.
   witness1(list);
 }
 
-/*member: witness1:[null]*/
+/*member: witness1:[null|powerset=1]*/
 witness1(
-  /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/ x,
+  /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/ x,
 ) {}
 
-/*member: test2:[null]*/
+/*member: test2:[null|powerset=1]*/
 test2() {
   var list = [42];
   JS('effects:all;depends:all', '#', list);
   witness2(list);
 }
 
-/*member: witness2:[null]*/
+/*member: witness2:[null|powerset=1]*/
 witness2(
-  /*Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/ x,
+  /*Container([exact=JSExtendableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0)*/ x,
 ) {}
 
-/*member: test3:[null]*/
+/*member: test3:[null|powerset=1]*/
 test3() {
   var list = [42];
   JS('', '#.slice(0)', list);
   witness3(list);
 }
 
-/*member: witness3:[null]*/
+/*member: witness3:[null|powerset=1]*/
 witness3(
-  /*Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/ x,
+  /*Container([exact=JSExtendableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0)*/ x,
 ) {}
 
-/*member: test4:[null]*/
+/*member: test4:[null|powerset=1]*/
 test4() {
   var list = [42];
   JS('effects:none;depends:all', '#.slice(0)', list);
   witness4(list);
 }
 
-/*member: witness4:[null]*/
+/*member: witness4:[null|powerset=1]*/
 witness4(
-  /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/ x,
+  /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/ x,
 ) {}
diff --git a/pkg/compiler/test/inference/data/list_tracer2.dart b/pkg/compiler/test/inference/data/list_tracer2.dart
index 2736f0b..4509066 100644
--- a/pkg/compiler/test/inference/data/list_tracer2.dart
+++ b/pkg/compiler/test/inference/data/list_tracer2.dart
@@ -5,14 +5,14 @@
 // We used to always nullify the element type of a list we are tracing in
 // the presence of a fixed length list constructor call.
 
-/*member: myList:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+/*member: myList:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
 var myList = [42];
 
-/*member: main:[exact=JSUInt31]*/
+/*member: main:[exact=JSUInt31|powerset=0]*/
 main() {
   /// ignore: unused_local_variable
   var a = List.filled(42, null);
   return myList
-  /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+  /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
   [0];
 }
diff --git a/pkg/compiler/test/inference/data/list_tracer3.dart b/pkg/compiler/test/inference/data/list_tracer3.dart
index d324890..eaddcd2 100644
--- a/pkg/compiler/test/inference/data/list_tracer3.dart
+++ b/pkg/compiler/test/inference/data/list_tracer3.dart
@@ -5,20 +5,21 @@
 // We used to always nullify the element type of a list we are tracing in
 // the presence of a fixed length list constructor call.
 
-/*member: myList:Container([exact=JSExtendableArray], element: Union([exact=JSString], [subclass=JSNumber]), length: null)*/
+/*member: myList:Container([exact=JSExtendableArray|powerset=0], element: Union([exact=JSString|powerset=0], [subclass=JSNumber|powerset=0], powerset: 0), length: null, powerset: 0)*/
 var myList = [];
 
-/*member: otherList:Container([exact=JSExtendableArray], element: Union([exact=JSString], [exact=JSUInt31]), length: 2)*/
+/*member: otherList:Container([exact=JSExtendableArray|powerset=0], element: Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0), length: 2, powerset: 0)*/
 var otherList = ['foo', 42];
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   dynamic a =
       otherList
-      /*Container([exact=JSExtendableArray], element: Union([exact=JSString], [exact=JSUInt31]), length: 2)*/
+      /*Container([exact=JSExtendableArray|powerset=0], element: Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0), length: 2, powerset: 0)*/
       [0];
-  a /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ += 54;
+  a /*invoke: Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ +=
+      54;
   myList.
-  /*invoke: Container([exact=JSExtendableArray], element: Union([exact=JSString], [subclass=JSNumber]), length: null)*/
+  /*invoke: Container([exact=JSExtendableArray|powerset=0], element: Union([exact=JSString|powerset=0], [subclass=JSNumber|powerset=0], powerset: 0), length: null, powerset: 0)*/
   add(a);
 }
diff --git a/pkg/compiler/test/inference/data/list_tracer_typed_data_length.dart b/pkg/compiler/test/inference/data/list_tracer_typed_data_length.dart
index 4f5d20b..9741b1f 100644
--- a/pkg/compiler/test/inference/data/list_tracer_typed_data_length.dart
+++ b/pkg/compiler/test/inference/data/list_tracer_typed_data_length.dart
@@ -7,22 +7,22 @@
 // TODO(johnniwinther): Fix inference for spec mode. List elements should not be
 // [empty].
 
-/*member: myList:Container([exact=NativeFloat32List], element: [subclass=JSNumber], length: 42)*/
+/*member: myList:Container([exact=NativeFloat32List|powerset=0], element: [subclass=JSNumber|powerset=0], length: 42, powerset: 0)*/
 var myList = Float32List(42);
 
-/*member: myOtherList:Container([exact=NativeUint8List], element: [exact=JSUInt31], length: 32)*/
+/*member: myOtherList:Container([exact=NativeUint8List|powerset=0], element: [exact=JSUInt31|powerset=0], length: 32, powerset: 0)*/
 var myOtherList = Uint8List(32);
 
-/*member: main:[subclass=JSNumber]*/
+/*member: main:[subclass=JSNumber|powerset=0]*/
 main() {
   // ignore: unused_local_variable
   var a = Float32List(9);
   return myList
-      /*Container([exact=NativeFloat32List], element: [subclass=JSNumber], length: 42)*/
+      /*Container([exact=NativeFloat32List|powerset=0], element: [subclass=JSNumber|powerset=0], length: 42, powerset: 0)*/
       [0]
-      /*invoke: [subclass=JSNumber]*/
+      /*invoke: [subclass=JSNumber|powerset=0]*/
       +
       myOtherList
-      /*Container([exact=NativeUint8List], element: [exact=JSUInt31], length: 32)*/
+      /*Container([exact=NativeUint8List|powerset=0], element: [exact=JSUInt31|powerset=0], length: 32, powerset: 0)*/
       [0];
 }
diff --git a/pkg/compiler/test/inference/data/local_functions.dart b/pkg/compiler/test/inference/data/local_functions.dart
index ce22d73..630866d 100644
--- a/pkg/compiler/test/inference/data/local_functions.dart
+++ b/pkg/compiler/test/inference/data/local_functions.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   namedLocalFunctionInvoke();
   unnamedLocalFunctionInvoke();
@@ -21,9 +21,9 @@
 // Invocation of a named local function.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: namedLocalFunctionInvoke:[exact=JSUInt31]*/
+/*member: namedLocalFunctionInvoke:[exact=JSUInt31|powerset=0]*/
 namedLocalFunctionInvoke() {
-  /*[exact=JSUInt31]*/
+  /*[exact=JSUInt31|powerset=0]*/
   local() => 0;
   return local();
 }
@@ -32,9 +32,9 @@
 // Invocation of an unnamed local function.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: unnamedLocalFunctionInvoke:[subclass=JSInt]*/
+/*member: unnamedLocalFunctionInvoke:[subclass=JSInt|powerset=0]*/
 unnamedLocalFunctionInvoke() {
-  var local = /*[exact=JSUInt31]*/ () => 0;
+  var local = /*[exact=JSUInt31|powerset=0]*/ () => 0;
   return local();
 }
 
@@ -42,9 +42,9 @@
 // Access of a named local function.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: namedLocalFunctionGet:[subclass=Closure]*/
+/*member: namedLocalFunctionGet:[subclass=Closure|powerset=0]*/
 namedLocalFunctionGet() {
-  /*[exact=JSUInt31]*/
+  /*[exact=JSUInt31|powerset=0]*/
   local() => 0;
   return local;
 }
@@ -53,9 +53,9 @@
 // Call a named local function recursively.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: recursiveLocalFunction:[subclass=Closure]*/
+/*member: recursiveLocalFunction:[subclass=Closure|powerset=0]*/
 recursiveLocalFunction() {
-  /*[subclass=Closure]*/
+  /*[subclass=Closure|powerset=0]*/
   local() => local;
   return local();
 }
@@ -64,11 +64,11 @@
 // Call a named local function with a missing argument.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: namedLocalFunctionInvokeMissingArgument:[null|subclass=Object]*/
+/*member: namedLocalFunctionInvokeMissingArgument:[null|subclass=Object|powerset=1]*/
 @pragma('dart2js:disableFinal')
 namedLocalFunctionInvokeMissingArgument() {
-  /*[exact=JSUInt31]*/
-  local(/*[empty]*/ x) => 0;
+  /*[exact=JSUInt31|powerset=0]*/
+  local(/*[empty|powerset=0]*/ x) => 0;
   dynamic b = local;
   return b();
 }
@@ -77,10 +77,10 @@
 // Call a named local function with an extra argument.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: namedLocalFunctionInvokeExtraArgument:[null|subclass=Object]*/
+/*member: namedLocalFunctionInvokeExtraArgument:[null|subclass=Object|powerset=1]*/
 @pragma('dart2js:disableFinal')
 namedLocalFunctionInvokeExtraArgument() {
-  /*[exact=JSUInt31]*/
+  /*[exact=JSUInt31|powerset=0]*/
   local() => 0;
   dynamic b = local;
   return b(0);
@@ -90,10 +90,10 @@
 // Call a named local function with an extra named argument.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: namedLocalFunctionInvokeExtraNamedArgument:[null|subclass=Object]*/
+/*member: namedLocalFunctionInvokeExtraNamedArgument:[null|subclass=Object|powerset=1]*/
 @pragma('dart2js:disableFinal')
 namedLocalFunctionInvokeExtraNamedArgument() {
-  /*[exact=JSUInt31]*/
+  /*[exact=JSUInt31|powerset=0]*/
   local() => 0;
   dynamic b = local;
   return b(a: 0);
@@ -103,40 +103,40 @@
 // Implicit .call on a local variable.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: closureToString:[exact=JSString]*/
+/*member: closureToString:[exact=JSString|powerset=0]*/
 closureToString() {
-  var local = /*[null]*/ () {};
+  var local = /*[null|powerset=1]*/ () {};
   local();
-  return local. /*invoke: [subclass=Closure]*/ toString();
+  return local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Explicit .call on a local variable.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: closureCallToString:[exact=JSString]*/
+/*member: closureCallToString:[exact=JSString|powerset=0]*/
 closureCallToString() {
-  var local = /*[null]*/ () {};
+  var local = /*[null|powerset=1]*/ () {};
   local.call();
-  return local. /*invoke: [subclass=Closure]*/ toString();
+  return local. /*invoke: [subclass=Closure|powerset=0]*/ toString();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Operator == on the result of a parameter invocation.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _callCompare:[subclass=Closure]*/
-_callCompare(int /*[subclass=Closure]*/ compare({a, b})) {
-  compare(a: 0, b: 1) /*invoke: [subclass=JSInt]*/ == 0;
+/*member: _callCompare:[subclass=Closure|powerset=0]*/
+_callCompare(int /*[subclass=Closure|powerset=0]*/ compare({a, b})) {
+  compare(a: 0, b: 1) /*invoke: [subclass=JSInt|powerset=0]*/ == 0;
   return compare;
 }
 
-/*member: callCompare:[null]*/
+/*member: callCompare:[null|powerset=1]*/
 callCompare() {
   _callCompare(
-    /*[subclass=JSInt]*/
-    ({/*[exact=JSUInt31]*/ a, /*[exact=JSUInt31]*/ b}) =>
-        a /*invoke: [exact=JSUInt31]*/ - b,
+    /*[subclass=JSInt|powerset=0]*/
+    ({/*[exact=JSUInt31|powerset=0]*/ a, /*[exact=JSUInt31|powerset=0]*/ b}) =>
+        a /*invoke: [exact=JSUInt31|powerset=0]*/ - b,
   );
 }
 
@@ -144,19 +144,21 @@
 // Invocation on the result of a parameter invocation.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
-  /*member: Class1.method1:[null]*/
+  /*member: Class1.method1:[null|powerset=1]*/
   method1() {}
 }
 
-/*member: _callClosure:[subclass=Closure]*/
-_callClosure(/*[subclass=Closure]*/ f({c})) {
+/*member: _callClosure:[subclass=Closure|powerset=0]*/
+_callClosure(/*[subclass=Closure|powerset=0]*/ f({c})) {
   f(c: Class1()).method1();
   return f;
 }
 
-/*member: callClosure:[null]*/
+/*member: callClosure:[null|powerset=1]*/
 callClosure() {
-  _callClosure(/*[exact=Class1]*/ ({/*[exact=Class1]*/ c}) => c);
+  _callClosure(
+    /*[exact=Class1|powerset=0]*/ ({/*[exact=Class1|powerset=0]*/ c}) => c,
+  );
 }
diff --git a/pkg/compiler/test/inference/data/local_functions_call.dart b/pkg/compiler/test/inference/data/local_functions_call.dart
index 42cc5b10..43f5db4 100644
--- a/pkg/compiler/test/inference/data/local_functions_call.dart
+++ b/pkg/compiler/test/inference/data/local_functions_call.dart
@@ -6,7 +6,7 @@
 // with a different expectancy because the closed world contains less '.call'
 // methods.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   closureCallToString();
 }
@@ -15,12 +15,12 @@
 // Explicit .call on a local variable.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: closureCallToString:[exact=JSString]*/
+/*member: closureCallToString:[exact=JSString|powerset=0]*/
 closureCallToString() {
-  var local = /*[null]*/ () {};
+  var local = /*[null|powerset=1]*/ () {};
   local.call();
   return local
       .
-      /*invoke: [subclass=Closure]*/
+      /*invoke: [subclass=Closure|powerset=0]*/
       toString();
 }
diff --git a/pkg/compiler/test/inference/data/locals.dart b/pkg/compiler/test/inference/data/locals.dart
index b6f096d..5cd7f7d 100644
--- a/pkg/compiler/test/inference/data/locals.dart
+++ b/pkg/compiler/test/inference/data/locals.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   uninitializedLocal();
   initializedLocal();
@@ -15,63 +15,63 @@
   complexAssignmentLocal();
 }
 
-/*member: uninitializedLocal:[null]*/
+/*member: uninitializedLocal:[null|powerset=1]*/
 uninitializedLocal() {
   var local;
   return local;
 }
 
-/*member: initializedLocal:[exact=JSUInt31]*/
+/*member: initializedLocal:[exact=JSUInt31|powerset=0]*/
 initializedLocal() {
   var local = 0;
   return local;
 }
 
-/*member: updatedLocal:[exact=JSUInt31]*/
+/*member: updatedLocal:[exact=JSUInt31|powerset=0]*/
 updatedLocal() {
   var local2;
   local2 = 0;
   return local2;
 }
 
-/*member: invokeLocal:[null]*/
+/*member: invokeLocal:[null|powerset=1]*/
 invokeLocal() {
   var local2 = 0;
-  local2. /*invoke: [exact=JSUInt31]*/ toString();
+  local2. /*invoke: [exact=JSUInt31|powerset=0]*/ toString();
   return null;
 }
 
-/*member: postfixLocal:[null]*/
+/*member: postfixLocal:[null|powerset=1]*/
 postfixLocal() {
   // ignore: UNUSED_LOCAL_VARIABLE
   var local2 = 0;
-  local2 /*invoke: [exact=JSUInt31]*/ ++;
+  local2 /*invoke: [exact=JSUInt31|powerset=0]*/ ++;
   return null;
 }
 
-/*member: postfixLocalUsed:[exact=JSUInt31]*/
+/*member: postfixLocalUsed:[exact=JSUInt31|powerset=0]*/
 postfixLocalUsed() {
   var local2 = 0;
-  return local2 /*invoke: [exact=JSUInt31]*/ ++;
+  return local2 /*invoke: [exact=JSUInt31|powerset=0]*/ ++;
 }
 
-/*member: prefixLocal:[null]*/
+/*member: prefixLocal:[null|powerset=1]*/
 prefixLocal() {
   // ignore: UNUSED_LOCAL_VARIABLE
   var local2 = 0;
-  /*invoke: [exact=JSUInt31]*/
+  /*invoke: [exact=JSUInt31|powerset=0]*/
   ++local2;
   return null;
 }
 
-/*member: prefixLocalUsed:[subclass=JSUInt32]*/
+/*member: prefixLocalUsed:[subclass=JSUInt32|powerset=0]*/
 prefixLocalUsed() {
   var local2 = 0;
-  return /*invoke: [exact=JSUInt31]*/ ++local2;
+  return /*invoke: [exact=JSUInt31|powerset=0]*/ ++local2;
 }
 
-/*member: complexAssignmentLocal:[subclass=JSUInt32]*/
+/*member: complexAssignmentLocal:[subclass=JSUInt32|powerset=0]*/
 complexAssignmentLocal() {
   var local2 = 0;
-  return local2 /*invoke: [exact=JSUInt31]*/ += 42;
+  return local2 /*invoke: [exact=JSUInt31|powerset=0]*/ += 42;
 }
diff --git a/pkg/compiler/test/inference/data/locals_trust.dart b/pkg/compiler/test/inference/data/locals_trust.dart
index 86f3c0c..2a77ae8 100644
--- a/pkg/compiler/test/inference/data/locals_trust.dart
+++ b/pkg/compiler/test/inference/data/locals_trust.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   trustLocals();
   trustFunctions();
@@ -13,15 +13,17 @@
 // Test that we trust the explicit type of a local.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _trustLocals:[exact=JSBool]*/
-_trustLocals(int Function(int)? /*[null|subclass=Closure]*/ f) {
+/*member: _trustLocals:[exact=JSBool|powerset=0]*/
+_trustLocals(int Function(int)? /*[null|subclass=Closure|powerset=1]*/ f) {
   int c = f!(0);
-  return c /*invoke: [subclass=JSInt]*/ == 0;
+  return c /*invoke: [subclass=JSInt|powerset=0]*/ == 0;
 }
 
-/*member: trustLocals:[null]*/
+/*member: trustLocals:[null|powerset=1]*/
 trustLocals() {
-  _trustLocals(/*[exact=JSUInt31]*/ (/*[exact=JSUInt31]*/ o) => o);
+  _trustLocals(
+    /*[exact=JSUInt31|powerset=0]*/ (/*[exact=JSUInt31|powerset=0]*/ o) => o,
+  );
   _trustLocals(null);
 }
 
@@ -29,16 +31,18 @@
 // Test that we infer the type of a dynamic local from the type of the function.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _trustFunctions:[exact=JSBool]*/
-_trustFunctions(int Function(int)? /*[null|subclass=Closure]*/ f) {
+/*member: _trustFunctions:[exact=JSBool|powerset=0]*/
+_trustFunctions(int Function(int)? /*[null|subclass=Closure|powerset=1]*/ f) {
   dynamic c = f!(0);
   c = f(0);
-  return c /*invoke: [subclass=JSInt]*/ == 0;
+  return c /*invoke: [subclass=JSInt|powerset=0]*/ == 0;
 }
 
-/*member: trustFunctions:[null]*/
+/*member: trustFunctions:[null|powerset=1]*/
 trustFunctions() {
-  _trustFunctions(/*[exact=JSUInt31]*/ (/*[exact=JSUInt31]*/ o) => o);
+  _trustFunctions(
+    /*[exact=JSUInt31|powerset=0]*/ (/*[exact=JSUInt31|powerset=0]*/ o) => o,
+  );
   _trustFunctions(null);
 }
 
@@ -46,14 +50,18 @@
 // Test that we infer the type of a 'var' local from the type of the function.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _inferFromFunctions:[exact=JSBool]*/
-_inferFromFunctions(int Function(int)? /*[null|subclass=Closure]*/ f) {
+/*member: _inferFromFunctions:[exact=JSBool|powerset=0]*/
+_inferFromFunctions(
+  int Function(int)? /*[null|subclass=Closure|powerset=1]*/ f,
+) {
   var c = f!(0);
-  return c /*invoke: [subclass=JSInt]*/ == 0;
+  return c /*invoke: [subclass=JSInt|powerset=0]*/ == 0;
 }
 
-/*member: inferFromFunctions:[null]*/
+/*member: inferFromFunctions:[null|powerset=1]*/
 inferFromFunctions() {
-  _inferFromFunctions(/*[exact=JSUInt31]*/ (/*[exact=JSUInt31]*/ o) => o);
+  _inferFromFunctions(
+    /*[exact=JSUInt31|powerset=0]*/ (/*[exact=JSUInt31|powerset=0]*/ o) => o,
+  );
   _inferFromFunctions(null);
 }
diff --git a/pkg/compiler/test/inference/data/logical.dart b/pkg/compiler/test/inference/data/logical.dart
index 556f12b..31eead1 100644
--- a/pkg/compiler/test/inference/data/logical.dart
+++ b/pkg/compiler/test/inference/data/logical.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   returnTrue();
   returnFalse();
@@ -43,24 +43,24 @@
 /// Return `true`.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: returnTrue:Value([exact=JSBool], value: true)*/
+/*member: returnTrue:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
 returnTrue() => true;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return `false`.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: returnFalse:Value([exact=JSBool], value: false)*/
+/*member: returnFalse:Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/
 returnFalse() => false;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return negation of a boolean value.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _returnNot:[exact=JSBool]*/
-_returnNot(/*[exact=JSBool]*/ o) => !o;
+/*member: _returnNot:[exact=JSBool|powerset=0]*/
+_returnNot(/*[exact=JSBool|powerset=0]*/ o) => !o;
 
-/*member: returnNot:[null]*/
+/*member: returnNot:[null|powerset=1]*/
 returnNot() {
   _returnNot(true);
   _returnNot(false);
@@ -70,30 +70,30 @@
 /// Return negation of `false`.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: returnNotFalse:Value([exact=JSBool], value: true)*/
+/*member: returnNotFalse:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
 returnNotFalse() => !false;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return negation of `true`.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: returnNotTrue:Value([exact=JSBool], value: false)*/
+/*member: returnNotTrue:Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/
 returnNotTrue() => !true;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return negation of `null`.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: returnNotOfNull:[exact=JSBool]*/
+/*member: returnNotOfNull:[exact=JSBool|powerset=0]*/
 returnNotOfNull() => !(null as dynamic);
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return value of an is test.
 ////////////////////////////////////////////////////////////////////////////////
-/*member: _returnIs:[exact=JSBool]*/
-_returnIs(/*[null|exact=JSUInt31]*/ o) => o is int;
+/*member: _returnIs:[exact=JSBool|powerset=0]*/
+_returnIs(/*[null|exact=JSUInt31|powerset=1]*/ o) => o is int;
 
-/*member: returnIs:[null]*/
+/*member: returnIs:[null|powerset=1]*/
 returnIs() {
   _returnIs(null);
   _returnIs(1);
@@ -102,22 +102,22 @@
 ////////////////////////////////////////////////////////////////////////////////
 /// Return value of an is `int` test known to be true.
 ////////////////////////////////////////////////////////////////////////////////
-/*member: returnIsOneInt:Value([exact=JSBool], value: true)*/
+/*member: returnIsOneInt:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
 returnIsOneInt() => 1 is int;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return value of an is `int` test known to be false.
 ////////////////////////////////////////////////////////////////////////////////
-/*member: returnIsNullInt:Value([exact=JSBool], value: false)*/
+/*member: returnIsNullInt:Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/
 returnIsNullInt() => null is int;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return value of a negated is test.
 ////////////////////////////////////////////////////////////////////////////////
-/*member: _returnNotIs:[exact=JSBool]*/
-_returnNotIs(/*[null|exact=JSUInt31]*/ o) => o is! int;
+/*member: _returnNotIs:[exact=JSBool|powerset=0]*/
+_returnNotIs(/*[null|exact=JSUInt31|powerset=1]*/ o) => o is! int;
 
-/*member: returnNotIs:[null]*/
+/*member: returnNotIs:[null|powerset=1]*/
 returnNotIs() {
   _returnNotIs(null);
   _returnNotIs(1);
@@ -126,23 +126,26 @@
 ////////////////////////////////////////////////////////////////////////////////
 /// Return value of a negated is `int` test known to be false.
 ////////////////////////////////////////////////////////////////////////////////
-/*member: returnNotIsOneInt:Value([exact=JSBool], value: false)*/
+/*member: returnNotIsOneInt:Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/
 returnNotIsOneInt() => 1 is! int;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return value of a negated is `int` test known to be true.
 ////////////////////////////////////////////////////////////////////////////////
-/*member: returnNotIsNullInt:Value([exact=JSBool], value: true)*/
+/*member: returnNotIsNullInt:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
 returnNotIsNullInt() => null is! int;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return logical and of booleans values.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _returnLogicalAnd:[exact=JSBool]*/
-_returnLogicalAnd(/*[exact=JSBool]*/ a, /*[exact=JSBool]*/ b) => a && b;
+/*member: _returnLogicalAnd:[exact=JSBool|powerset=0]*/
+_returnLogicalAnd(
+  /*[exact=JSBool|powerset=0]*/ a,
+  /*[exact=JSBool|powerset=0]*/ b,
+) => a && b;
 
-/*member: returnLogicalAnd:[null]*/
+/*member: returnLogicalAnd:[null|powerset=1]*/
 returnLogicalAnd() {
   _returnLogicalAnd(true, true);
   _returnLogicalAnd(false, false);
@@ -152,14 +155,14 @@
 /// Return logical and of `true` && `true`.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: returnLogicalAndTrueTrue:Value([exact=JSBool], value: true)*/
+/*member: returnLogicalAndTrueTrue:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
 returnLogicalAndTrueTrue() => true && true;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return logical and of `false` && `true`.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: returnLogicalAndFalseTrue:Value([exact=JSBool], value: false)*/
+/*member: returnLogicalAndFalseTrue:Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/
 /// ignore: dead_code
 returnLogicalAndFalseTrue() => false && true;
 
@@ -167,25 +170,25 @@
 /// Return logical and of `null` && `true`.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: returnLogicalAndNullTrue:[exact=JSBool]*/
+/*member: returnLogicalAndNullTrue:[exact=JSBool|powerset=0]*/
 returnLogicalAndNullTrue() => (null as dynamic) && true;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return logical and of is test and use.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
-  /*member: Class1.field:Value([exact=JSBool], value: true)*/
+  /*member: Class1.field:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
   final bool field = true;
 }
 
-/*member: _returnLogicalAndIs:[exact=JSBool]*/
-_returnLogicalAndIs(/*[null|exact=Class1]*/ o) {
-  return o is Class1 && o. /*[exact=Class1]*/ field;
+/*member: _returnLogicalAndIs:[exact=JSBool|powerset=0]*/
+_returnLogicalAndIs(/*[null|exact=Class1|powerset=1]*/ o) {
+  return o is Class1 && o. /*[exact=Class1|powerset=0]*/ field;
 }
 
-/*member: returnLogicalAndIs:[null]*/
+/*member: returnLogicalAndIs:[null|powerset=1]*/
 returnLogicalAndIs() {
   _returnLogicalAndIs(new Class1());
   _returnLogicalAndIs(null);
@@ -195,20 +198,20 @@
 /// Return logical and of is-not test and use.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class2.:[exact=Class2]*/
+/*member: Class2.:[exact=Class2|powerset=0]*/
 class Class2 {
-  /*member: Class2.field:Value([exact=JSBool], value: true)*/
+  /*member: Class2.field:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
   final bool field = true;
 }
 
-/*member: _returnLogicalAndIsNot:[exact=JSBool]*/
-_returnLogicalAndIsNot(/*[null|exact=Class2]*/ o) {
+/*member: _returnLogicalAndIsNot:[exact=JSBool|powerset=0]*/
+_returnLogicalAndIsNot(/*[null|exact=Class2|powerset=1]*/ o) {
   // TODO(johnniwinther): Use negative type knowledge to show that the receiver
   // is [null].
-  return o is! Class2 && o. /*[null|exact=Class2]*/ field;
+  return o is! Class2 && o. /*[null|exact=Class2|powerset=1]*/ field;
 }
 
-/*member: returnLogicalAndIsNot:[null]*/
+/*member: returnLogicalAndIsNot:[null|powerset=1]*/
 returnLogicalAndIsNot() {
   _returnLogicalAndIsNot(new Class2());
   _returnLogicalAndIsNot(null);
@@ -218,18 +221,18 @@
 /// Return logical and of null test and use.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class3.:[exact=Class3]*/
+/*member: Class3.:[exact=Class3|powerset=0]*/
 class Class3 {
-  /*member: Class3.field:Value([exact=JSBool], value: true)*/
+  /*member: Class3.field:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
   final bool field = true;
 }
 
-/*member: _returnLogicalAndNull:[exact=JSBool]*/
-_returnLogicalAndNull(/*[null|exact=Class3]*/ o) {
-  return o == null && o. /*[null]*/ field;
+/*member: _returnLogicalAndNull:[exact=JSBool|powerset=0]*/
+_returnLogicalAndNull(/*[null|exact=Class3|powerset=1]*/ o) {
+  return o == null && o. /*[null|powerset=1]*/ field;
 }
 
-/*member: returnLogicalAndNull:[null]*/
+/*member: returnLogicalAndNull:[null|powerset=1]*/
 returnLogicalAndNull() {
   _returnLogicalAndNull(new Class3());
   _returnLogicalAndNull(null);
@@ -239,18 +242,18 @@
 /// Return logical and of not null test and use.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class4.:[exact=Class4]*/
+/*member: Class4.:[exact=Class4|powerset=0]*/
 class Class4 {
-  /*member: Class4.field:Value([exact=JSBool], value: true)*/
+  /*member: Class4.field:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
   final bool field = true;
 }
 
-/*member: _returnLogicalAndNotNull:[exact=JSBool]*/
-_returnLogicalAndNotNull(/*[null|exact=Class4]*/ o) {
-  return o != null && o. /*[exact=Class4]*/ field;
+/*member: _returnLogicalAndNotNull:[exact=JSBool|powerset=0]*/
+_returnLogicalAndNotNull(/*[null|exact=Class4|powerset=1]*/ o) {
+  return o != null && o. /*[exact=Class4|powerset=0]*/ field;
 }
 
-/*member: returnLogicalAndNotNull:[null]*/
+/*member: returnLogicalAndNotNull:[null|powerset=1]*/
 returnLogicalAndNotNull() {
   _returnLogicalAndNotNull(new Class4());
   _returnLogicalAndNotNull(null);
@@ -260,10 +263,13 @@
 /// Return logical or of booleans values.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _returnLogicalOr:[exact=JSBool]*/
-_returnLogicalOr(/*[exact=JSBool]*/ a, /*[exact=JSBool]*/ b) => a || b;
+/*member: _returnLogicalOr:[exact=JSBool|powerset=0]*/
+_returnLogicalOr(
+  /*[exact=JSBool|powerset=0]*/ a,
+  /*[exact=JSBool|powerset=0]*/ b,
+) => a || b;
 
-/*member: returnLogicalOr:[null]*/
+/*member: returnLogicalOr:[null|powerset=1]*/
 returnLogicalOr() {
   _returnLogicalOr(true, true);
   _returnLogicalOr(false, false);
@@ -273,41 +279,41 @@
 /// Return logical or of `false` || `true`.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: returnLogicalOrFalseTrue:Value([exact=JSBool], value: true)*/
+/*member: returnLogicalOrFalseTrue:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
 returnLogicalOrFalseTrue() => false || true;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return logical or of `false` || `false`.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: returnLogicalOrFalseFalse:Value([exact=JSBool], value: false)*/
+/*member: returnLogicalOrFalseFalse:Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/
 returnLogicalOrFalseFalse() => false || false;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return logical or of `null` || `true`.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: returnLogicalOrNullTrue:[exact=JSBool]*/
+/*member: returnLogicalOrNullTrue:[exact=JSBool|powerset=0]*/
 returnLogicalOrNullTrue() => (null as dynamic) || true;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return logical or of is test or use.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class5.:[exact=Class5]*/
+/*member: Class5.:[exact=Class5|powerset=0]*/
 class Class5 {
-  /*member: Class5.field:Value([exact=JSBool], value: true)*/
+  /*member: Class5.field:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
   final bool field = true;
 }
 
-/*member: _returnLogicalOrIs:[exact=JSBool]*/
-_returnLogicalOrIs(/*[null|exact=Class5]*/ o) {
+/*member: _returnLogicalOrIs:[exact=JSBool|powerset=0]*/
+_returnLogicalOrIs(/*[null|exact=Class5|powerset=1]*/ o) {
   // TODO(johnniwinther): Use negative type knowledge to show that the receiver
   // is [null].
-  return o is Class5 || o. /*[null|exact=Class5]*/ field;
+  return o is Class5 || o. /*[null|exact=Class5|powerset=1]*/ field;
 }
 
-/*member: returnLogicalOrIs:[null]*/
+/*member: returnLogicalOrIs:[null|powerset=1]*/
 returnLogicalOrIs() {
   _returnLogicalOrIs(new Class5());
   _returnLogicalOrIs(null);
@@ -317,18 +323,18 @@
 /// Return logical or of is-not test or use.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class6.:[exact=Class6]*/
+/*member: Class6.:[exact=Class6|powerset=0]*/
 class Class6 {
-  /*member: Class6.field:Value([exact=JSBool], value: true)*/
+  /*member: Class6.field:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
   final bool field = true;
 }
 
-/*member: _returnLogicalOrIsNot:[exact=JSBool]*/
-_returnLogicalOrIsNot(/*[null|exact=Class6]*/ o) {
-  return o is! Class6 || o. /*[exact=Class6]*/ field;
+/*member: _returnLogicalOrIsNot:[exact=JSBool|powerset=0]*/
+_returnLogicalOrIsNot(/*[null|exact=Class6|powerset=1]*/ o) {
+  return o is! Class6 || o. /*[exact=Class6|powerset=0]*/ field;
 }
 
-/*member: returnLogicalOrIsNot:[null]*/
+/*member: returnLogicalOrIsNot:[null|powerset=1]*/
 returnLogicalOrIsNot() {
   _returnLogicalOrIsNot(new Class6());
   _returnLogicalOrIsNot(null);
@@ -338,18 +344,18 @@
 /// Return logical or of null test or use.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class7.:[exact=Class7]*/
+/*member: Class7.:[exact=Class7|powerset=0]*/
 class Class7 {
-  /*member: Class7.field:Value([exact=JSBool], value: true)*/
+  /*member: Class7.field:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
   final bool field = true;
 }
 
-/*member: _returnLogicalOrNull:[exact=JSBool]*/
-_returnLogicalOrNull(/*[null|exact=Class7]*/ o) {
-  return o == null || o. /*[exact=Class7]*/ field;
+/*member: _returnLogicalOrNull:[exact=JSBool|powerset=0]*/
+_returnLogicalOrNull(/*[null|exact=Class7|powerset=1]*/ o) {
+  return o == null || o. /*[exact=Class7|powerset=0]*/ field;
 }
 
-/*member: returnLogicalOrNull:[null]*/
+/*member: returnLogicalOrNull:[null|powerset=1]*/
 returnLogicalOrNull() {
   _returnLogicalOrNull(new Class7());
   _returnLogicalOrNull(null);
@@ -359,18 +365,18 @@
 /// Return logical or of not null test or use.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class8.:[exact=Class8]*/
+/*member: Class8.:[exact=Class8|powerset=0]*/
 class Class8 {
-  /*member: Class8.field:Value([exact=JSBool], value: true)*/
+  /*member: Class8.field:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
   final bool field = true;
 }
 
-/*member: _returnLogicalOrNotNull:[exact=JSBool]*/
-_returnLogicalOrNotNull(/*[null|exact=Class8]*/ o) {
-  return o != null || o. /*[null]*/ field;
+/*member: _returnLogicalOrNotNull:[exact=JSBool|powerset=0]*/
+_returnLogicalOrNotNull(/*[null|exact=Class8|powerset=1]*/ o) {
+  return o != null || o. /*[null|powerset=1]*/ field;
 }
 
-/*member: returnLogicalOrNotNull:[null]*/
+/*member: returnLogicalOrNotNull:[null|powerset=1]*/
 returnLogicalOrNotNull() {
   _returnLogicalOrNotNull(new Class8());
   _returnLogicalOrNotNull(null);
diff --git a/pkg/compiler/test/inference/data/logical_if.dart b/pkg/compiler/test/inference/data/logical_if.dart
index 50a69ae..1ba4c64 100644
--- a/pkg/compiler/test/inference/data/logical_if.dart
+++ b/pkg/compiler/test/inference/data/logical_if.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   promotedIfThen();
   promotedIfThenElse();
@@ -30,17 +30,19 @@
 // Test if-then statement with is-test
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {}
 
-/*member: _promotedIfThen:[null]*/
-_promotedIfThen(/*Union([exact=Class1], [exact=JSUInt31])*/ o) {
+/*member: _promotedIfThen:[null|powerset=1]*/
+_promotedIfThen(
+  /*Union([exact=Class1|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ o,
+) {
   if (o is Class1) {
-    o. /*invoke: [exact=Class1]*/ toString();
+    o. /*invoke: [exact=Class1|powerset=0]*/ toString();
   }
 }
 
-/*member: promotedIfThen:[null]*/
+/*member: promotedIfThen:[null|powerset=1]*/
 promotedIfThen() {
   _promotedIfThen(0);
   _promotedIfThen(new Class1());
@@ -50,21 +52,23 @@
 // Test if-then-else statement with is-test
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class2.:[exact=Class2]*/
+/*member: Class2.:[exact=Class2|powerset=0]*/
 class Class2 {}
 
-/*member: _promotedIfThenElse:[null]*/
-_promotedIfThenElse(/*Union([exact=Class2], [exact=JSUInt31])*/ o) {
+/*member: _promotedIfThenElse:[null|powerset=1]*/
+_promotedIfThenElse(
+  /*Union([exact=Class2|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ o,
+) {
   if (o is Class2) {
-    o. /*invoke: [exact=Class2]*/ toString();
+    o. /*invoke: [exact=Class2|powerset=0]*/ toString();
   } else {
     // TODO(johnniwinther): Use negative type knowledge to show that the
     // receiver must be [exact=JSUInt31].
-    o. /*invoke: Union([exact=Class2], [exact=JSUInt31])*/ toString();
+    o. /*invoke: Union([exact=Class2|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ toString();
   }
 }
 
-/*member: promotedIfThenElse:[null]*/
+/*member: promotedIfThenElse:[null|powerset=1]*/
 promotedIfThenElse() {
   _promotedIfThenElse(0);
   _promotedIfThenElse(new Class2());
@@ -74,19 +78,21 @@
 // Test if-then-else statement with negated is-test
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class3.:[exact=Class3]*/
+/*member: Class3.:[exact=Class3|powerset=0]*/
 class Class3 {}
 
-/*member: _promotedNotIfThenElse:[null]*/
-_promotedNotIfThenElse(/*Union([exact=Class3], [exact=JSUInt31])*/ o) {
+/*member: _promotedNotIfThenElse:[null|powerset=1]*/
+_promotedNotIfThenElse(
+  /*Union([exact=Class3|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ o,
+) {
   if (o is! Class3) {
-    o. /*invoke: Union([exact=Class3], [exact=JSUInt31])*/ toString();
+    o. /*invoke: Union([exact=Class3|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ toString();
   } else {
-    o. /*invoke: [exact=Class3]*/ toString();
+    o. /*invoke: [exact=Class3|powerset=0]*/ toString();
   }
 }
 
-/*member: promotedNotIfThenElse:[null]*/
+/*member: promotedNotIfThenElse:[null|powerset=1]*/
 promotedNotIfThenElse() {
   _promotedNotIfThenElse(0);
   _promotedNotIfThenElse(new Class3());
@@ -96,20 +102,20 @@
 // Test if-then statement with is-test in &&
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class4.:[exact=Class4]*/
+/*member: Class4.:[exact=Class4|powerset=0]*/
 class Class4 {}
 
-/*member: _promotedAndIfThen:[null]*/
+/*member: _promotedAndIfThen:[null|powerset=1]*/
 _promotedAndIfThen(
-  /*Union([exact=Class4], [exact=JSUInt31])*/ o,
-  /*[exact=JSBool]*/ c,
+  /*Union([exact=Class4|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ o,
+  /*[exact=JSBool|powerset=0]*/ c,
 ) {
   if (o is Class4 && c) {
-    o. /*invoke: [exact=Class4]*/ toString();
+    o. /*invoke: [exact=Class4|powerset=0]*/ toString();
   }
 }
 
-/*member: promotedAndIfThen:[null]*/
+/*member: promotedAndIfThen:[null|powerset=1]*/
 promotedAndIfThen() {
   _promotedAndIfThen(0, true);
   _promotedAndIfThen(new Class4(), false);
@@ -119,24 +125,24 @@
 // Test if-then-else statement with is-test in &&
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class5.:[exact=Class5]*/
+/*member: Class5.:[exact=Class5|powerset=0]*/
 class Class5 {}
 
-/*member: _promotedAndIfThenElse:[null]*/
+/*member: _promotedAndIfThenElse:[null|powerset=1]*/
 _promotedAndIfThenElse(
-  /*Union([exact=Class5], [exact=JSUInt31])*/ o,
-  /*[exact=JSBool]*/ c,
+  /*Union([exact=Class5|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ o,
+  /*[exact=JSBool|powerset=0]*/ c,
 ) {
   if (o is Class5 && c) {
-    o. /*invoke: [exact=Class5]*/ toString();
+    o. /*invoke: [exact=Class5|powerset=0]*/ toString();
   } else {
     // TODO(johnniwinther): Use negative type knowledge to show that the
     // receiver must be [exact=JSUInt31].
-    o. /*invoke: Union([exact=Class5], [exact=JSUInt31])*/ toString();
+    o. /*invoke: Union([exact=Class5|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ toString();
   }
 }
 
-/*member: promotedAndIfThenElse:[null]*/
+/*member: promotedAndIfThenElse:[null|powerset=1]*/
 promotedAndIfThenElse() {
   _promotedAndIfThenElse(0, true);
   _promotedAndIfThenElse(new Class5(), false);
@@ -146,22 +152,22 @@
 // Test if-then-else statement with negated is-test in &&
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class6.:[exact=Class6]*/
+/*member: Class6.:[exact=Class6|powerset=0]*/
 class Class6 {}
 
-/*member: _promotedNotAndIfThenElse:[null]*/
+/*member: _promotedNotAndIfThenElse:[null|powerset=1]*/
 _promotedNotAndIfThenElse(
-  /*Union([exact=Class6], [exact=JSUInt31])*/ o,
-  /*[exact=JSBool]*/ c,
+  /*Union([exact=Class6|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ o,
+  /*[exact=JSBool|powerset=0]*/ c,
 ) {
   if (o is! Class6 && c) {
-    o. /*invoke: Union([exact=Class6], [exact=JSUInt31])*/ toString();
+    o. /*invoke: Union([exact=Class6|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ toString();
   } else {
-    o. /*invoke: Union([exact=Class6], [exact=JSUInt31])*/ toString();
+    o. /*invoke: Union([exact=Class6|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ toString();
   }
 }
 
-/*member: promotedNotAndIfThenElse:[null]*/
+/*member: promotedNotAndIfThenElse:[null|powerset=1]*/
 promotedNotAndIfThenElse() {
   _promotedNotAndIfThenElse(0, true);
   _promotedNotAndIfThenElse(new Class6(), false);
@@ -171,20 +177,20 @@
 // Test if-then statement with is-test in ||
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class7.:[exact=Class7]*/
+/*member: Class7.:[exact=Class7|powerset=0]*/
 class Class7 {}
 
-/*member: _promotedOrIfThen:[null]*/
+/*member: _promotedOrIfThen:[null|powerset=1]*/
 _promotedOrIfThen(
-  /*Union([exact=Class7], [exact=JSUInt31])*/ o,
-  /*[exact=JSBool]*/ c,
+  /*Union([exact=Class7|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ o,
+  /*[exact=JSBool|powerset=0]*/ c,
 ) {
   if (o is Class7 || c) {
-    o. /*invoke: Union([exact=Class7], [exact=JSUInt31])*/ toString();
+    o. /*invoke: Union([exact=Class7|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ toString();
   }
 }
 
-/*member: promotedOrIfThen:[null]*/
+/*member: promotedOrIfThen:[null|powerset=1]*/
 promotedOrIfThen() {
   _promotedOrIfThen(0, true);
   _promotedOrIfThen(new Class7(), false);
@@ -194,24 +200,24 @@
 // Test if-then-else statement with is-test in ||
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class8.:[exact=Class8]*/
+/*member: Class8.:[exact=Class8|powerset=0]*/
 class Class8 {}
 
-/*member: _promotedOrIfThenElse:[null]*/
+/*member: _promotedOrIfThenElse:[null|powerset=1]*/
 _promotedOrIfThenElse(
-  /*Union([exact=Class8], [exact=JSUInt31])*/ o,
-  /*[exact=JSBool]*/ c,
+  /*Union([exact=Class8|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ o,
+  /*[exact=JSBool|powerset=0]*/ c,
 ) {
   if (o is Class8 || c) {
-    o. /*invoke: Union([exact=Class8], [exact=JSUInt31])*/ toString();
+    o. /*invoke: Union([exact=Class8|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ toString();
   } else {
     // TODO(johnniwinther): Use negative type knowledge to show that the
     // receiver must be [exact=JSUInt31].
-    o. /*invoke: Union([exact=Class8], [exact=JSUInt31])*/ toString();
+    o. /*invoke: Union([exact=Class8|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ toString();
   }
 }
 
-/*member: promotedOrIfThenElse:[null]*/
+/*member: promotedOrIfThenElse:[null|powerset=1]*/
 promotedOrIfThenElse() {
   _promotedOrIfThenElse(0, true);
   _promotedOrIfThenElse(new Class8(), false);
@@ -221,22 +227,22 @@
 // Test if-then-else statement with negated is-test in ||
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class9.:[exact=Class9]*/
+/*member: Class9.:[exact=Class9|powerset=0]*/
 class Class9 {}
 
-/*member: _promotedNotOrIfThenElse:[null]*/
+/*member: _promotedNotOrIfThenElse:[null|powerset=1]*/
 _promotedNotOrIfThenElse(
-  /*Union([exact=Class9], [exact=JSUInt31])*/ o,
-  /*[exact=JSBool]*/ c,
+  /*Union([exact=Class9|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ o,
+  /*[exact=JSBool|powerset=0]*/ c,
 ) {
   if (o is! Class9 || c) {
-    o. /*invoke: Union([exact=Class9], [exact=JSUInt31])*/ toString();
+    o. /*invoke: Union([exact=Class9|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ toString();
   } else {
-    o. /*invoke: [exact=Class9]*/ toString();
+    o. /*invoke: [exact=Class9|powerset=0]*/ toString();
   }
 }
 
-/*member: promotedNotOrIfThenElse:[null]*/
+/*member: promotedNotOrIfThenElse:[null|powerset=1]*/
 promotedNotOrIfThenElse() {
   _promotedNotOrIfThenElse(0, true);
   _promotedNotOrIfThenElse(new Class9(), false);
@@ -246,20 +252,22 @@
 // Test if-then statement with doubly negated is-test
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class10.:[exact=Class10]*/
+/*member: Class10.:[exact=Class10|powerset=0]*/
 class Class10 {}
 
-/*member: _promotedNotNotIfThen:[null]*/
-_promotedNotNotIfThen(/*Union([exact=Class10], [exact=JSUInt31])*/ o) {
+/*member: _promotedNotNotIfThen:[null|powerset=1]*/
+_promotedNotNotIfThen(
+  /*Union([exact=Class10|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ o,
+) {
   if (!(o is! Class10)) {
     o
         .
-        /*invoke: [exact=Class10]*/
+        /*invoke: [exact=Class10|powerset=0]*/
         toString();
   }
 }
 
-/*member: promotedNotNotIfThen:[null]*/
+/*member: promotedNotNotIfThen:[null|powerset=1]*/
 promotedNotNotIfThen() {
   _promotedNotNotIfThen(0);
   _promotedNotNotIfThen(new Class10());
@@ -269,24 +277,26 @@
 // Test if-then-else statement with negated is-test in parentheses
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class11.:[exact=Class11]*/
+/*member: Class11.:[exact=Class11|powerset=0]*/
 class Class11 {}
 
-/*member: _promotedParenNotIfThenElse:[null]*/
-_promotedParenNotIfThenElse(/*Union([exact=Class11], [exact=JSUInt31])*/ o) {
+/*member: _promotedParenNotIfThenElse:[null|powerset=1]*/
+_promotedParenNotIfThenElse(
+  /*Union([exact=Class11|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ o,
+) {
   if (!(o is Class11)) {
     // TODO(johnniwinther): Use negative type knowledge to show that the
     // receiver must be [exact=JSUInt31].
-    o. /*invoke: Union([exact=Class11], [exact=JSUInt31])*/ toString();
+    o. /*invoke: Union([exact=Class11|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ toString();
   } else {
     o
         .
-        /*invoke: [exact=Class11]*/
+        /*invoke: [exact=Class11|powerset=0]*/
         toString();
   }
 }
 
-/*member: promotedParenNotIfThenElse:[null]*/
+/*member: promotedParenNotIfThenElse:[null|powerset=1]*/
 promotedParenNotIfThenElse() {
   _promotedParenNotIfThenElse(0);
   _promotedParenNotIfThenElse(new Class11());
@@ -296,14 +306,14 @@
 // Test if-then statement with null-test
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _nullIfThen:[null]*/
-_nullIfThen(/*[null|exact=JSUInt31]*/ o) {
+/*member: _nullIfThen:[null|powerset=1]*/
+_nullIfThen(/*[null|exact=JSUInt31|powerset=1]*/ o) {
   if (o == null) {
-    o. /*invoke: [null]*/ toString();
+    o. /*invoke: [null|powerset=1]*/ toString();
   }
 }
 
-/*member: nullIfThen:[null]*/
+/*member: nullIfThen:[null|powerset=1]*/
 nullIfThen() {
   _nullIfThen(0);
   _nullIfThen(null);
@@ -313,16 +323,16 @@
 // Test if-then-else statement null-test
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _nullIfThenElse:[null]*/
-_nullIfThenElse(/*[null|exact=JSUInt31]*/ o) {
+/*member: _nullIfThenElse:[null|powerset=1]*/
+_nullIfThenElse(/*[null|exact=JSUInt31|powerset=1]*/ o) {
   if (o == null) {
-    o. /*invoke: [null]*/ toString();
+    o. /*invoke: [null|powerset=1]*/ toString();
   } else {
-    o. /*invoke: [exact=JSUInt31]*/ toString();
+    o. /*invoke: [exact=JSUInt31|powerset=0]*/ toString();
   }
 }
 
-/*member: nullIfThenElse:[null]*/
+/*member: nullIfThenElse:[null|powerset=1]*/
 nullIfThenElse() {
   _nullIfThenElse(0);
   _nullIfThenElse(null);
@@ -332,14 +342,14 @@
 // Test if-then statement with negated null-test
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _notNullIfThen:[null]*/
-_notNullIfThen(/*[null|exact=JSUInt31]*/ o) {
+/*member: _notNullIfThen:[null|powerset=1]*/
+_notNullIfThen(/*[null|exact=JSUInt31|powerset=1]*/ o) {
   if (o != null) {
-    o. /*invoke: [exact=JSUInt31]*/ toString();
+    o. /*invoke: [exact=JSUInt31|powerset=0]*/ toString();
   }
 }
 
-/*member: notNullIfThen:[null]*/
+/*member: notNullIfThen:[null|powerset=1]*/
 notNullIfThen() {
   _notNullIfThen(0);
   _notNullIfThen(null);
@@ -349,16 +359,16 @@
 // Test if-then-else statement with negated null-test
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _notNullIfThenElse:[null]*/
-_notNullIfThenElse(/*[null|exact=JSUInt31]*/ o) {
+/*member: _notNullIfThenElse:[null|powerset=1]*/
+_notNullIfThenElse(/*[null|exact=JSUInt31|powerset=1]*/ o) {
   if (o != null) {
-    o. /*invoke: [exact=JSUInt31]*/ toString();
+    o. /*invoke: [exact=JSUInt31|powerset=0]*/ toString();
   } else {
-    o. /*invoke: [null]*/ toString();
+    o. /*invoke: [null|powerset=1]*/ toString();
   }
 }
 
-/*member: notNullIfThenElse:[null]*/
+/*member: notNullIfThenElse:[null|powerset=1]*/
 notNullIfThenElse() {
   _notNullIfThenElse(0);
   _notNullIfThenElse(null);
@@ -368,14 +378,17 @@
 // Test if-then statement with null-test in &&
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _nullAndIfThen:[null]*/
-_nullAndIfThen(/*[null|exact=JSUInt31]*/ o, /*[exact=JSBool]*/ c) {
+/*member: _nullAndIfThen:[null|powerset=1]*/
+_nullAndIfThen(
+  /*[null|exact=JSUInt31|powerset=1]*/ o,
+  /*[exact=JSBool|powerset=0]*/ c,
+) {
   if (o == null && c) {
-    o. /*invoke: [null]*/ toString();
+    o. /*invoke: [null|powerset=1]*/ toString();
   }
 }
 
-/*member: nullAndIfThen:[null]*/
+/*member: nullAndIfThen:[null|powerset=1]*/
 nullAndIfThen() {
   _nullAndIfThen(0, true);
   _nullAndIfThen(null, false);
@@ -385,16 +398,19 @@
 // Test if-then-else statement null-test in &&
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _nullAndIfThenElse:[null]*/
-_nullAndIfThenElse(/*[null|exact=JSUInt31]*/ o, /*[exact=JSBool]*/ c) {
+/*member: _nullAndIfThenElse:[null|powerset=1]*/
+_nullAndIfThenElse(
+  /*[null|exact=JSUInt31|powerset=1]*/ o,
+  /*[exact=JSBool|powerset=0]*/ c,
+) {
   if (o == null && c) {
-    o. /*invoke: [null]*/ toString();
+    o. /*invoke: [null|powerset=1]*/ toString();
   } else {
-    o. /*invoke: [null|exact=JSUInt31]*/ toString();
+    o. /*invoke: [null|exact=JSUInt31|powerset=1]*/ toString();
   }
 }
 
-/*member: nullAndIfThenElse:[null]*/
+/*member: nullAndIfThenElse:[null|powerset=1]*/
 nullAndIfThenElse() {
   _nullAndIfThenElse(0, true);
   _nullAndIfThenElse(null, false);
@@ -404,14 +420,17 @@
 // Test if-then statement with negated null-test in &&
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _notNullAndIfThen:[null]*/
-_notNullAndIfThen(/*[null|exact=JSUInt31]*/ o, /*[exact=JSBool]*/ c) {
+/*member: _notNullAndIfThen:[null|powerset=1]*/
+_notNullAndIfThen(
+  /*[null|exact=JSUInt31|powerset=1]*/ o,
+  /*[exact=JSBool|powerset=0]*/ c,
+) {
   if (o != null && c) {
-    o. /*invoke: [exact=JSUInt31]*/ toString();
+    o. /*invoke: [exact=JSUInt31|powerset=0]*/ toString();
   }
 }
 
-/*member: notNullAndIfThen:[null]*/
+/*member: notNullAndIfThen:[null|powerset=1]*/
 notNullAndIfThen() {
   _notNullAndIfThen(0, true);
   _notNullAndIfThen(null, false);
@@ -421,16 +440,19 @@
 // Test if-then-else statement with negated null-test in &&
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _notNullAndIfThenElse:[null]*/
-_notNullAndIfThenElse(/*[null|exact=JSUInt31]*/ o, /*[exact=JSBool]*/ c) {
+/*member: _notNullAndIfThenElse:[null|powerset=1]*/
+_notNullAndIfThenElse(
+  /*[null|exact=JSUInt31|powerset=1]*/ o,
+  /*[exact=JSBool|powerset=0]*/ c,
+) {
   if (o != null && c) {
-    o. /*invoke: [exact=JSUInt31]*/ toString();
+    o. /*invoke: [exact=JSUInt31|powerset=0]*/ toString();
   } else {
-    o. /*invoke: [null|exact=JSUInt31]*/ toString();
+    o. /*invoke: [null|exact=JSUInt31|powerset=1]*/ toString();
   }
 }
 
-/*member: notNullAndIfThenElse:[null]*/
+/*member: notNullAndIfThenElse:[null|powerset=1]*/
 notNullAndIfThenElse() {
   _notNullAndIfThenElse(0, true);
   _notNullAndIfThenElse(null, false);
diff --git a/pkg/compiler/test/inference/data/map.dart b/pkg/compiler/test/inference/data/map.dart
index bef703b..2ddaa9a 100644
--- a/pkg/compiler/test/inference/data/map.dart
+++ b/pkg/compiler/test/inference/data/map.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   emptyMap();
   nullMap();
@@ -14,26 +14,26 @@
   constIntStringMap();
 }
 
-/*member: emptyMap:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+/*member: emptyMap:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
 emptyMap() => {};
 
-/*member: constMap:Dictionary([subclass=ConstantMap], key: [empty], value: [null], map: {})*/
+/*member: constMap:Dictionary([subclass=ConstantMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
 constMap() => const {};
 
-/*member: nullMap:Map([subclass=JsLinkedHashMap], key: [null], value: [null])*/
+/*member: nullMap:Map([subclass=JsLinkedHashMap|powerset=0], key: [null|powerset=1], value: [null|powerset=1], powerset: 0)*/
 nullMap() => {null: null};
 
-/*member: constNullMap:Map([subclass=ConstantMap], key: [null], value: [null])*/
+/*member: constNullMap:Map([subclass=ConstantMap|powerset=0], key: [null|powerset=1], value: [null|powerset=1], powerset: 0)*/
 constNullMap() => const {null: null};
 
-/*member: stringIntMap:Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSUInt31], map: {a: [exact=JSUInt31], b: [exact=JSUInt31], c: [exact=JSUInt31]})*/
+/*member: stringIntMap:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: [null|exact=JSUInt31|powerset=1], map: {a: [exact=JSUInt31|powerset=0], b: [exact=JSUInt31|powerset=0], c: [exact=JSUInt31|powerset=0]}, powerset: 0)*/
 stringIntMap() => {'a': 1, 'b': 2, 'c': 3};
 
-/*member: intStringMap:Map([subclass=JsLinkedHashMap], key: [exact=JSUInt31], value: [null|exact=JSString])*/
+/*member: intStringMap:Map([subclass=JsLinkedHashMap|powerset=0], key: [exact=JSUInt31|powerset=0], value: [null|exact=JSString|powerset=1], powerset: 0)*/
 intStringMap() => {1: 'a', 2: 'b', 3: 'c'};
 
-/*member: constStringIntMap:Dictionary([subclass=ConstantMap], key: [exact=JSString], value: [null|exact=JSUInt31], map: {a: [exact=JSUInt31], b: [exact=JSUInt31], c: [exact=JSUInt31]})*/
+/*member: constStringIntMap:Dictionary([subclass=ConstantMap|powerset=0], key: [exact=JSString|powerset=0], value: [null|exact=JSUInt31|powerset=1], map: {a: [exact=JSUInt31|powerset=0], b: [exact=JSUInt31|powerset=0], c: [exact=JSUInt31|powerset=0]}, powerset: 0)*/
 constStringIntMap() => const {'a': 1, 'b': 2, 'c': 3};
 
-/*member: constIntStringMap:Map([subclass=ConstantMap], key: [exact=JSUInt31], value: [null|exact=JSString])*/
+/*member: constIntStringMap:Map([subclass=ConstantMap|powerset=0], key: [exact=JSUInt31|powerset=0], value: [null|exact=JSString|powerset=1], powerset: 0)*/
 constIntStringMap() => const {1: 'a', 2: 'b', 3: 'c'};
diff --git a/pkg/compiler/test/inference/data/map_tracer_const.dart b/pkg/compiler/test/inference/data/map_tracer_const.dart
index 7c8433d..45e50ba 100644
--- a/pkg/compiler/test/inference/data/map_tracer_const.dart
+++ b/pkg/compiler/test/inference/data/map_tracer_const.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: closure:[exact=JSUInt31]*/
+/*member: closure:[exact=JSUInt31|powerset=0]*/
 int closure(
   int
-  /*spec.Union([exact=JSNumNotInt], [exact=JSUInt31])*/
-  /*prod.[exact=JSUInt31]*/
+  /*spec.Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+  /*prod.[exact=JSUInt31|powerset=0]*/
   x,
 ) {
   return x;
@@ -15,18 +15,18 @@
 class A {
   static const DEFAULT = const {'fun': closure};
 
-  /*member: A.map:Dictionary([subclass=ConstantMap], key: Value([exact=JSString], value: "fun"), value: [null|subclass=Closure], map: {fun: [subclass=Closure]})*/
+  /*member: A.map:Dictionary([subclass=ConstantMap|powerset=0], key: Value([exact=JSString|powerset=0], value: "fun", powerset: 0), value: [null|subclass=Closure|powerset=1], map: {fun: [subclass=Closure|powerset=0]}, powerset: 0)*/
   final map;
 
-  /*member: A.:[exact=A]*/
-  A([/*[null]*/ maparg]) : map = maparg == null ? DEFAULT : maparg;
+  /*member: A.:[exact=A|powerset=0]*/
+  A([/*[null|powerset=1]*/ maparg]) : map = maparg == null ? DEFAULT : maparg;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   var a = A();
-  a. /*[exact=A]*/ map
-  /*Dictionary([subclass=ConstantMap], key: Value([exact=JSString], value: "fun"), value: [null|subclass=Closure], map: {fun: [subclass=Closure]})*/
+  a. /*[exact=A|powerset=0]*/ map
+  /*Dictionary([subclass=ConstantMap|powerset=0], key: Value([exact=JSString|powerset=0], value: "fun", powerset: 0), value: [null|subclass=Closure|powerset=1], map: {fun: [subclass=Closure|powerset=0]}, powerset: 0)*/
   ['fun'](3.3);
   print(closure(22));
 }
diff --git a/pkg/compiler/test/inference/data/map_tracer_keys.dart b/pkg/compiler/test/inference/data/map_tracer_keys.dart
index 0e410fa..971437a 100644
--- a/pkg/compiler/test/inference/data/map_tracer_keys.dart
+++ b/pkg/compiler/test/inference/data/map_tracer_keys.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   test1();
   test2();
@@ -12,197 +12,197 @@
   test6();
 }
 
-/*member: aDouble1:[null|exact=JSNumNotInt]*/
+/*member: aDouble1:[null|exact=JSNumNotInt|powerset=1]*/
 dynamic aDouble1 = 42.5;
 
-/*member: aList1:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+/*member: aList1:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
 dynamic aList1 = [42];
 
-/*member: consume1:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+/*member: consume1:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
 consume1(
-  /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/ x,
+  /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/ x,
 ) => x;
 
-/*member: test1:[null]*/
+/*member: test1:[null|powerset=1]*/
 test1() {
   var theMap = {'a': 2.2, 'b': 3.3, 'c': 4.4};
   theMap
-      /*update: Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSNumNotInt], map: {a: [exact=JSNumNotInt], b: [exact=JSNumNotInt], c: [exact=JSNumNotInt], d: [null|exact=JSNumNotInt]})*/
+      /*update: Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: [null|exact=JSNumNotInt|powerset=1], map: {a: [exact=JSNumNotInt|powerset=0], b: [exact=JSNumNotInt|powerset=0], c: [exact=JSNumNotInt|powerset=0], d: [null|exact=JSNumNotInt|powerset=1]}, powerset: 0)*/
       ['d'] =
       5.5;
-  /*iterator: [exact=LinkedHashMapKeysIterable]*/
-  /*current: [exact=LinkedHashMapKeyIterator]*/
-  /*moveNext: [exact=LinkedHashMapKeyIterator]*/
+  /*iterator: [exact=LinkedHashMapKeysIterable|powerset=0]*/
+  /*current: [exact=LinkedHashMapKeyIterator|powerset=0]*/
+  /*moveNext: [exact=LinkedHashMapKeyIterator|powerset=0]*/
   for (var key
       in theMap
           .
-          /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSNumNotInt], map: {a: [exact=JSNumNotInt], b: [exact=JSNumNotInt], c: [exact=JSNumNotInt], d: [null|exact=JSNumNotInt]})*/
+          /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: [null|exact=JSNumNotInt|powerset=1], map: {a: [exact=JSNumNotInt|powerset=0], b: [exact=JSNumNotInt|powerset=0], c: [exact=JSNumNotInt|powerset=0], d: [null|exact=JSNumNotInt|powerset=1]}, powerset: 0)*/
           keys) {
     aDouble1 =
         theMap
-        /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSNumNotInt], map: {a: [exact=JSNumNotInt], b: [exact=JSNumNotInt], c: [exact=JSNumNotInt], d: [null|exact=JSNumNotInt]})*/
+        /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: [null|exact=JSNumNotInt|powerset=1], map: {a: [exact=JSNumNotInt|powerset=0], b: [exact=JSNumNotInt|powerset=0], c: [exact=JSNumNotInt|powerset=0], d: [null|exact=JSNumNotInt|powerset=1]}, powerset: 0)*/
         [key];
   }
   // We have to reference it somewhere, so that it always gets resolved.
   consume1(aList1);
 }
 
-/*member: aDouble2:[null|exact=JSNumNotInt]*/
+/*member: aDouble2:[null|exact=JSNumNotInt|powerset=1]*/
 dynamic aDouble2 = 42.5;
 
-/*member: aList2:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
+/*member: aList2:Container([exact=JSExtendableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0)*/
 dynamic aList2 = [42];
 
-/*member: consume2:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
+/*member: consume2:Container([exact=JSExtendableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0)*/
 consume2(
-  /*Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/ x,
+  /*Container([exact=JSExtendableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0)*/ x,
 ) => x;
 
-/*member: test2:[null]*/
+/*member: test2:[null|powerset=1]*/
 test2() {
   dynamic theMap = {'a': 2.2, 'b': 3.3, 'c': 4.4};
   theMap
-      /*update: Map([exact=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSNumNotInt])*/
+      /*update: Map([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: [null|exact=JSNumNotInt|powerset=1], powerset: 0)*/
       [aList2] =
       5.5;
-  /*iterator: [exact=LinkedHashMapKeysIterable]*/
-  /*current: [exact=LinkedHashMapKeyIterator]*/
-  /*moveNext: [exact=LinkedHashMapKeyIterator]*/
+  /*iterator: [exact=LinkedHashMapKeysIterable|powerset=0]*/
+  /*current: [exact=LinkedHashMapKeyIterator|powerset=0]*/
+  /*moveNext: [exact=LinkedHashMapKeyIterator|powerset=0]*/
   for (var key
       in theMap
           .
-          /*Map([exact=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSNumNotInt])*/
+          /*Map([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: [null|exact=JSNumNotInt|powerset=1], powerset: 0)*/
           keys) {
     aDouble2 =
         theMap
-        /*Map([exact=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSNumNotInt])*/
+        /*Map([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: [null|exact=JSNumNotInt|powerset=1], powerset: 0)*/
         [key];
   }
   // We have to reference it somewhere, so that it always gets resolved.
   consume2(aList2);
 }
 
-/*member: aDouble3:Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt])*/
+/*member: aDouble3:Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], powerset: 1)*/
 dynamic aDouble3 = 42.5;
 
-/*member: aList3:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+/*member: aList3:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
 dynamic aList3 = [42];
 
-/*member: consume3:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+/*member: consume3:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
 consume3(
-  /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/ x,
+  /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/ x,
 ) => x;
 
-/*member: test3:[null]*/
+/*member: test3:[null|powerset=1]*/
 test3() {
   dynamic theMap = <dynamic, dynamic>{'a': 2.2, 'b': 3.3, 'c': 4.4};
   theMap
-      /*update: Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt]), map: {a: [exact=JSNumNotInt], b: [exact=JSNumNotInt], c: [exact=JSNumNotInt], d: Container([null|exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)})*/
+      /*update: Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], powerset: 1), map: {a: [exact=JSNumNotInt|powerset=0], b: [exact=JSNumNotInt|powerset=0], c: [exact=JSNumNotInt|powerset=0], d: Container([null|exact=JSExtendableArray|powerset=1], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 1)}, powerset: 0)*/
       ['d'] =
       aList3;
-  /*iterator: [exact=LinkedHashMapKeysIterable]*/
-  /*current: [exact=LinkedHashMapKeyIterator]*/
-  /*moveNext: [exact=LinkedHashMapKeyIterator]*/
+  /*iterator: [exact=LinkedHashMapKeysIterable|powerset=0]*/
+  /*current: [exact=LinkedHashMapKeyIterator|powerset=0]*/
+  /*moveNext: [exact=LinkedHashMapKeyIterator|powerset=0]*/
   for (var key
       in theMap
           .
-          /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt]), map: {a: [exact=JSNumNotInt], b: [exact=JSNumNotInt], c: [exact=JSNumNotInt], d: Container([null|exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)})*/
+          /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], powerset: 1), map: {a: [exact=JSNumNotInt|powerset=0], b: [exact=JSNumNotInt|powerset=0], c: [exact=JSNumNotInt|powerset=0], d: Container([null|exact=JSExtendableArray|powerset=1], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 1)}, powerset: 0)*/
           keys) {
     aDouble3 =
         theMap
-        /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt]), map: {a: [exact=JSNumNotInt], b: [exact=JSNumNotInt], c: [exact=JSNumNotInt], d: Container([null|exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)})*/
+        /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], powerset: 1), map: {a: [exact=JSNumNotInt|powerset=0], b: [exact=JSNumNotInt|powerset=0], c: [exact=JSNumNotInt|powerset=0], d: Container([null|exact=JSExtendableArray|powerset=1], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 1)}, powerset: 0)*/
         [key];
   }
   // We have to reference it somewhere, so that it always gets resolved.
   consume3(aList3);
 }
 
-/*member: aDouble4:[null|exact=JSNumNotInt]*/
+/*member: aDouble4:[null|exact=JSNumNotInt|powerset=1]*/
 dynamic aDouble4 = 42.5;
 
-/*member: aList4:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+/*member: aList4:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
 dynamic aList4 = [42];
 
-/*member: consume4:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+/*member: consume4:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
 consume4(
-  /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/ x,
+  /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/ x,
 ) => x;
 
-/*member: test4:[null]*/
+/*member: test4:[null|powerset=1]*/
 test4() {
   var theMap = {'a': 2.2, 'b': 3.3, 'c': 4.4, 'd': 5.5};
-  /*iterator: [exact=LinkedHashMapKeysIterable]*/
-  /*current: [exact=LinkedHashMapKeyIterator]*/
-  /*moveNext: [exact=LinkedHashMapKeyIterator]*/
+  /*iterator: [exact=LinkedHashMapKeysIterable|powerset=0]*/
+  /*current: [exact=LinkedHashMapKeyIterator|powerset=0]*/
+  /*moveNext: [exact=LinkedHashMapKeyIterator|powerset=0]*/
   for (var key
       in theMap
           .
-          /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSNumNotInt], map: {a: [exact=JSNumNotInt], b: [exact=JSNumNotInt], c: [exact=JSNumNotInt], d: [exact=JSNumNotInt]})*/
+          /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: [null|exact=JSNumNotInt|powerset=1], map: {a: [exact=JSNumNotInt|powerset=0], b: [exact=JSNumNotInt|powerset=0], c: [exact=JSNumNotInt|powerset=0], d: [exact=JSNumNotInt|powerset=0]}, powerset: 0)*/
           keys) {
     aDouble4 =
         theMap
-        /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: [null|exact=JSNumNotInt], map: {a: [exact=JSNumNotInt], b: [exact=JSNumNotInt], c: [exact=JSNumNotInt], d: [exact=JSNumNotInt]})*/
+        /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: [null|exact=JSNumNotInt|powerset=1], map: {a: [exact=JSNumNotInt|powerset=0], b: [exact=JSNumNotInt|powerset=0], c: [exact=JSNumNotInt|powerset=0], d: [exact=JSNumNotInt|powerset=0]}, powerset: 0)*/
         [key];
   }
   // We have to reference it somewhere, so that it always gets resolved.
   consume4(aList4);
 }
 
-/*member: aDouble5:[null|exact=JSNumNotInt]*/
+/*member: aDouble5:[null|exact=JSNumNotInt|powerset=1]*/
 dynamic aDouble5 = 42.5;
 
-/*member: aList5:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
+/*member: aList5:Container([exact=JSExtendableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0)*/
 dynamic aList5 = [42];
 
-/*member: consume5:Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/
+/*member: consume5:Container([exact=JSExtendableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0)*/
 consume5(
-  /*Container([exact=JSExtendableArray], element: [null|subclass=Object], length: null)*/ x,
+  /*Container([exact=JSExtendableArray|powerset=0], element: [null|subclass=Object|powerset=1], length: null, powerset: 0)*/ x,
 ) => x;
 
-/*member: test5:[null]*/
+/*member: test5:[null|powerset=1]*/
 test5() {
   var theMap = {'a': 2.2, 'b': 3.3, 'c': 4.4, aList5: 5.5};
-  /*iterator: [exact=LinkedHashMapKeysIterable]*/
-  /*current: [exact=LinkedHashMapKeyIterator]*/
-  /*moveNext: [exact=LinkedHashMapKeyIterator]*/
+  /*iterator: [exact=LinkedHashMapKeysIterable|powerset=0]*/
+  /*current: [exact=LinkedHashMapKeyIterator|powerset=0]*/
+  /*moveNext: [exact=LinkedHashMapKeyIterator|powerset=0]*/
   for (var key
       in theMap
           .
-          /*Map([exact=JsLinkedHashMap], key: Union([exact=JSExtendableArray], [exact=JSString]), value: [null|exact=JSNumNotInt])*/
+          /*Map([exact=JsLinkedHashMap|powerset=0], key: Union([exact=JSExtendableArray|powerset=0], [exact=JSString|powerset=0], powerset: 0), value: [null|exact=JSNumNotInt|powerset=1], powerset: 0)*/
           keys) {
     aDouble5 =
         theMap
-        /*Map([exact=JsLinkedHashMap], key: Union([exact=JSExtendableArray], [exact=JSString]), value: [null|exact=JSNumNotInt])*/
+        /*Map([exact=JsLinkedHashMap|powerset=0], key: Union([exact=JSExtendableArray|powerset=0], [exact=JSString|powerset=0], powerset: 0), value: [null|exact=JSNumNotInt|powerset=1], powerset: 0)*/
         [key];
   }
   // We have to reference it somewhere, so that it always gets resolved.
   consume5(aList5);
 }
 
-/*member: aDouble6:Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt])*/
+/*member: aDouble6:Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], powerset: 1)*/
 dynamic aDouble6 = 42.5;
-/*member: aList6:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+/*member: aList6:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
 dynamic aList6 = [42];
 
-/*member: consume6:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+/*member: consume6:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/
 consume6(
-  /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/ x,
+  /*Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)*/ x,
 ) => x;
 
-/*member: test6:[null]*/
+/*member: test6:[null|powerset=1]*/
 test6() {
   var theMap = {'a': 2.2, 'b': 3.3, 'c': 4.4, 'd': aList6};
-  /*iterator: [exact=LinkedHashMapKeysIterable]*/
-  /*current: [exact=LinkedHashMapKeyIterator]*/
-  /*moveNext: [exact=LinkedHashMapKeyIterator]*/
+  /*iterator: [exact=LinkedHashMapKeysIterable|powerset=0]*/
+  /*current: [exact=LinkedHashMapKeyIterator|powerset=0]*/
+  /*moveNext: [exact=LinkedHashMapKeyIterator|powerset=0]*/
   for (var key
       in theMap
           .
-          /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt]), map: {a: [exact=JSNumNotInt], b: [exact=JSNumNotInt], c: [exact=JSNumNotInt], d: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)})*/
+          /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], powerset: 1), map: {a: [exact=JSNumNotInt|powerset=0], b: [exact=JSNumNotInt|powerset=0], c: [exact=JSNumNotInt|powerset=0], d: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)}, powerset: 0)*/
           keys) {
     aDouble6 =
         theMap
-        /*Dictionary([exact=JsLinkedHashMap], key: [exact=JSString], value: Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt]), map: {a: [exact=JSNumNotInt], b: [exact=JSNumNotInt], c: [exact=JSNumNotInt], d: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)})*/
+        /*Dictionary([exact=JsLinkedHashMap|powerset=0], key: [exact=JSString|powerset=0], value: Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], powerset: 1), map: {a: [exact=JSNumNotInt|powerset=0], b: [exact=JSNumNotInt|powerset=0], c: [exact=JSNumNotInt|powerset=0], d: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 1, powerset: 0)}, powerset: 0)*/
         [key];
   }
   // We have to reference it somewhere, so that it always gets resolved.
diff --git a/pkg/compiler/test/inference/data/mixin_constructor_default_parameter_values/lib.dart b/pkg/compiler/test/inference/data/mixin_constructor_default_parameter_values/lib.dart
index 106d905..bb9aac3 100644
--- a/pkg/compiler/test/inference/data/mixin_constructor_default_parameter_values/lib.dart
+++ b/pkg/compiler/test/inference/data/mixin_constructor_default_parameter_values/lib.dart
@@ -4,33 +4,36 @@
 
 class _SECRET {
   const _SECRET();
-  /*member: _SECRET.toString:Value([exact=JSString], value: "SECRET!")*/
+  /*member: _SECRET.toString:Value([exact=JSString|powerset=0], value: "SECRET!", powerset: 0)*/
   @override
   String toString() => "SECRET!";
 }
 
 class C {
-  /*member: C.x:[exact=JSUInt31]*/
+  /*member: C.x:[exact=JSUInt31|powerset=0]*/
   final int x;
 
-  /*member: C.y:Union([exact=JSString], [exact=_SECRET])*/
+  /*member: C.y:Union([exact=JSString|powerset=0], [exact=_SECRET|powerset=0], powerset: 0)*/
   final y;
 
-  /*member: C.a:[exact=C]*/
+  /*member: C.a:[exact=C|powerset=0]*/
   C.a(
-    int /*[exact=JSUInt31]*/ x, [
-    var /*Union([exact=JSString], [exact=_SECRET])*/ b = const _SECRET(),
+    int /*[exact=JSUInt31|powerset=0]*/ x, [
+    var /*Union([exact=JSString|powerset=0], [exact=_SECRET|powerset=0], powerset: 0)*/ b =
+        const _SECRET(),
   ]) : this.x = x,
        this.y = b;
 
-  /*member: C.b:[exact=C]*/
+  /*member: C.b:[exact=C|powerset=0]*/
   C.b(
-    int /*[exact=JSUInt31]*/ x, {
-    var /*Union([exact=JSString], [exact=_SECRET])*/ b = const _SECRET(),
+    int /*[exact=JSUInt31|powerset=0]*/ x, {
+    var /*Union([exact=JSString|powerset=0], [exact=_SECRET|powerset=0], powerset: 0)*/ b =
+        const _SECRET(),
   }) : this.x = x,
        this.y = b;
 
-  /*member: C.toString:[exact=JSString]*/
+  /*member: C.toString:[exact=JSString|powerset=0]*/
   @override
-  String toString() => "C(${ /*[exact=D]*/ x},${ /*[exact=D]*/ y})";
+  String toString() =>
+      "C(${ /*[exact=D|powerset=0]*/ x},${ /*[exact=D|powerset=0]*/ y})";
 }
diff --git a/pkg/compiler/test/inference/data/mixin_constructor_default_parameter_values/main.dart b/pkg/compiler/test/inference/data/mixin_constructor_default_parameter_values/main.dart
index f4145a6..6426ce7 100644
--- a/pkg/compiler/test/inference/data/mixin_constructor_default_parameter_values/main.dart
+++ b/pkg/compiler/test/inference/data/mixin_constructor_default_parameter_values/main.dart
@@ -10,21 +10,21 @@
 import 'lib.dart';
 
 mixin Mixin {
-  /*member: Mixin.foo:[exact=JSString]*/
+  /*member: Mixin.foo:[exact=JSString|powerset=0]*/
   String get foo => "Mixin:$this";
 }
 
 // ignore: MIXIN_HAS_NO_CONSTRUCTORS
 class D = C with Mixin;
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   // ignore: NEW_WITH_UNDEFINED_CONSTRUCTOR
-  print(new D.a(42). /*[exact=D]*/ foo);
+  print(new D.a(42). /*[exact=D|powerset=0]*/ foo);
   // ignore: NEW_WITH_UNDEFINED_CONSTRUCTOR
-  print(new D.b(42). /*[exact=D]*/ foo);
+  print(new D.b(42). /*[exact=D|powerset=0]*/ foo);
   // ignore: NEW_WITH_UNDEFINED_CONSTRUCTOR
-  print(new D.a(42, "overt"). /*[exact=D]*/ foo);
+  print(new D.a(42, "overt"). /*[exact=D|powerset=0]*/ foo);
   // ignore: NEW_WITH_UNDEFINED_CONSTRUCTOR
-  print(new D.b(42, b: "odvert"). /*[exact=D]*/ foo);
+  print(new D.b(42, b: "odvert"). /*[exact=D|powerset=0]*/ foo);
 }
diff --git a/pkg/compiler/test/inference/data/narrowing.dart b/pkg/compiler/test/inference/data/narrowing.dart
index f173338..8994681 100644
--- a/pkg/compiler/test/inference/data/narrowing.dart
+++ b/pkg/compiler/test/inference/data/narrowing.dart
@@ -5,115 +5,117 @@
 /// Regression test for Issue #33761: is-checks and null-checks were assumed to
 /// be true even in nested non-condition contexts.
 
-/*member: argIsNonNull1:[null]*/
-argIsNonNull1(/*[exact=JSUInt31]*/ x) {
+/*member: argIsNonNull1:[null|powerset=1]*/
+argIsNonNull1(/*[exact=JSUInt31|powerset=0]*/ x) {
   print('>> is null: ${x == null}');
 }
 
-/*member: nonNull1:[null]*/
+/*member: nonNull1:[null|powerset=1]*/
 void nonNull1() {
   var x = 1;
-  if (x /*invoke: [subclass=JSInt]*/ == null) return;
+  if (x /*invoke: [subclass=JSInt|powerset=0]*/ == null) return;
   argIsNonNull1(x);
 }
 
-/*member: argIsNonNull2:[null]*/
-argIsNonNull2(/*[exact=JSUInt31]*/ x) {
+/*member: argIsNonNull2:[null|powerset=1]*/
+argIsNonNull2(/*[exact=JSUInt31|powerset=0]*/ x) {
   print('>> is null: ${x == null}');
 }
 
-/*member: nonNull2:[null]*/
+/*member: nonNull2:[null|powerset=1]*/
 void nonNull2() {
   var x = 1;
-  if ((x /*invoke: [subclass=JSInt]*/ == null) /*invoke: [exact=JSBool]*/ ==
+  if ((x /*invoke: [subclass=JSInt|powerset=0]*/ ==
+          null) /*invoke: [exact=JSBool|powerset=0]*/ ==
       true)
     return;
   argIsNonNull2(x);
 }
 
-/*member: argIsNonNull3:[null]*/
-argIsNonNull3(/*[exact=JSUInt31]*/ x) {
+/*member: argIsNonNull3:[null|powerset=1]*/
+argIsNonNull3(/*[exact=JSUInt31|powerset=0]*/ x) {
   print('>> is null: ${x == null}');
 }
 
-/*member: nonNull3:[null]*/
+/*member: nonNull3:[null|powerset=1]*/
 void nonNull3() {
   var x = 1;
-  if ((x /*invoke: [subclass=JSInt]*/ == null) /*invoke: [exact=JSBool]*/ !=
+  if ((x /*invoke: [subclass=JSInt|powerset=0]*/ ==
+          null) /*invoke: [exact=JSBool|powerset=0]*/ !=
       false)
     return;
   argIsNonNull3(x);
 }
 
-/*member: argIsNonNull4:[null]*/
-argIsNonNull4(/*[exact=JSUInt31]*/ x) {
+/*member: argIsNonNull4:[null|powerset=1]*/
+argIsNonNull4(/*[exact=JSUInt31|powerset=0]*/ x) {
   print('>> is null: ${x == null}');
 }
 
-/*member: discard:Value([exact=JSBool], value: false)*/
-discard(/*[exact=JSBool]*/ x) => false;
+/*member: discard:Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/
+discard(/*[exact=JSBool|powerset=0]*/ x) => false;
 
-/*member: nonNull4:[null]*/
+/*member: nonNull4:[null|powerset=1]*/
 void nonNull4() {
   var x = 1;
-  if (discard(x /*invoke: [subclass=JSInt]*/ != null)) return;
+  if (discard(x /*invoke: [subclass=JSInt|powerset=0]*/ != null)) return;
   argIsNonNull4(x);
 }
 
-/*member: argIsNonNull5:[null]*/
-argIsNonNull5(/*[exact=JSUInt31]*/ x) {
+/*member: argIsNonNull5:[null|powerset=1]*/
+argIsNonNull5(/*[exact=JSUInt31|powerset=0]*/ x) {
   print('>> is null: ${x == null}');
 }
 
-/*member: nonNull5:[null]*/
+/*member: nonNull5:[null|powerset=1]*/
 void nonNull5() {
   var x = 1;
-  if (x /*invoke: [subclass=JSInt]*/ != null ? false : false) return;
+  if (x /*invoke: [subclass=JSInt|powerset=0]*/ != null ? false : false) return;
   argIsNonNull5(x);
 }
 
-/*member: argIsNonNull6:[null]*/
-argIsNonNull6(/*[exact=JSUInt31]*/ x) {
+/*member: argIsNonNull6:[null|powerset=1]*/
+argIsNonNull6(/*[exact=JSUInt31|powerset=0]*/ x) {
   print('>> is null: ${x == null}');
 }
 
-/*member: nonNull6:[null]*/
+/*member: nonNull6:[null|powerset=1]*/
 void nonNull6() {
   var x = 1;
-  if (( /*[exact=JSBool]*/ (/*[exact=JSBool]*/ y) => y && false)(
-    x /*invoke: [subclass=JSInt]*/ != null,
-  ))
+  if (( /*[exact=JSBool|powerset=0]*/ (/*[exact=JSBool|powerset=0]*/ y) =>
+      y && false)(x /*invoke: [subclass=JSInt|powerset=0]*/ != null))
     return;
   argIsNonNull6(x);
 }
 
-/*member: argIsNonNull7:[null]*/
-argIsNonNull7(/*[exact=JSUInt31]*/ x) {
+/*member: argIsNonNull7:[null|powerset=1]*/
+argIsNonNull7(/*[exact=JSUInt31|powerset=0]*/ x) {
   print('>> is null: ${x == null}');
 }
 
-/*member: nonNull7:[null]*/
+/*member: nonNull7:[null|powerset=1]*/
 void nonNull7() {
   var f = false;
   var x = 1;
-  if (f ? (throw x /*invoke: [subclass=JSInt]*/ != null) : false) return;
+  if (f ? (throw x /*invoke: [subclass=JSInt|powerset=0]*/ != null) : false)
+    return;
   argIsNonNull7(x);
 }
 
-/*member: argIsNonNull8:[null]*/
-argIsNonNull8(/*[exact=JSUInt31]*/ x) {
+/*member: argIsNonNull8:[null|powerset=1]*/
+argIsNonNull8(/*[exact=JSUInt31|powerset=0]*/ x) {
   print('>> is null: ${x == null}');
 }
 
-/*member: nonNull8:[null]*/
+/*member: nonNull8:[null|powerset=1]*/
 void nonNull8() {
   var f = false;
   var x = 1;
-  if (f ?? (x /*invoke: [subclass=JSInt]*/ != null)) return;
+  if (f ?? (x /*invoke: [subclass=JSInt|powerset=0]*/ != null)) return;
   argIsNonNull8(x);
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 void main() {
   nonNull1();
   nonNull2();
diff --git a/pkg/compiler/test/inference/data/native.dart b/pkg/compiler/test/inference/data/native.dart
index 61e2cc8..f3f0439 100644
--- a/pkg/compiler/test/inference/data/native.dart
+++ b/pkg/compiler/test/inference/data/native.dart
@@ -2,12 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   nativeMethod();
 }
 
-/*member: nativeMethod:[null|subclass=Object]*/
+/*member: nativeMethod:[null|subclass=Object|powerset=1]*/
 nativeMethod()
 // ignore: NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE
 native;
diff --git a/pkg/compiler/test/inference/data/native2.dart b/pkg/compiler/test/inference/data/native2.dart
index 3f568ec..7eeb616 100644
--- a/pkg/compiler/test/inference/data/native2.dart
+++ b/pkg/compiler/test/inference/data/native2.dart
@@ -6,16 +6,16 @@
 import 'dart:_foreign_helper' as foreign show JS;
 import 'dart:html';
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   createElement();
   createRectangle();
 }
 
-/*member: createElement:[subclass=Element]*/
+/*member: createElement:[subclass=Element|powerset=0]*/
 Element createElement()
 // ignore: NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE
 native;
 
-/*member: createRectangle:[subclass=DomRectReadOnly]*/
+/*member: createRectangle:[subclass=DomRectReadOnly|powerset=0]*/
 createRectangle() => foreign.JS('Rectangle', "#", null);
diff --git a/pkg/compiler/test/inference/data/native3.dart b/pkg/compiler/test/inference/data/native3.dart
index f4f1161..50d3b1c 100644
--- a/pkg/compiler/test/inference/data/native3.dart
+++ b/pkg/compiler/test/inference/data/native3.dart
@@ -4,12 +4,12 @@
 
 import 'dart:html';
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   createRectangle();
 }
 
-/*member: createRectangle:[subclass=DomRectReadOnly]*/
+/*member: createRectangle:[subclass=DomRectReadOnly|powerset=0]*/
 Rectangle createRectangle()
 // ignore: NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE
 native;
diff --git a/pkg/compiler/test/inference/data/new.dart b/pkg/compiler/test/inference/data/new.dart
index 233955c8..c849388 100644
--- a/pkg/compiler/test/inference/data/new.dart
+++ b/pkg/compiler/test/inference/data/new.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   generativeConstructorCall();
   factoryConstructorCall2();
@@ -21,10 +21,10 @@
 /// Call default constructor of a field-less class.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {}
 
-/*member: generativeConstructorCall:[exact=Class1]*/
+/*member: generativeConstructorCall:[exact=Class1|powerset=0]*/
 generativeConstructorCall() => Class1();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -32,13 +32,13 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class3 {
-  /*member: Class3.:[exact=Class3]*/
+  /*member: Class3.:[exact=Class3|powerset=0]*/
   factory Class3() => Class3.named();
-  /*member: Class3.named:[exact=Class3]*/
+  /*member: Class3.named:[exact=Class3|powerset=0]*/
   Class3.named();
 }
 
-/*member: factoryConstructorCall2:[exact=Class3]*/
+/*member: factoryConstructorCall2:[exact=Class3|powerset=0]*/
 factoryConstructorCall2() => Class3();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -46,14 +46,14 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class4a {
-  /*member: Class4a.:[exact=Class4b]*/
+  /*member: Class4a.:[exact=Class4b|powerset=0]*/
   factory Class4a() => Class4b();
 }
 
-/*member: Class4b.:[exact=Class4b]*/
+/*member: Class4b.:[exact=Class4b|powerset=0]*/
 class Class4b implements Class4a {}
 
-/*member: factoryConstructorCall3:[exact=Class4b]*/
+/*member: factoryConstructorCall3:[exact=Class4b|powerset=0]*/
 factoryConstructorCall3() => Class4a();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -61,13 +61,13 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class5 {
-  final /*member: Class5.field:[exact=JSUInt31]*/ field;
+  final /*member: Class5.field:[exact=JSUInt31|powerset=0]*/ field;
 
-  /*member: Class5.:[exact=Class5]*/
-  Class5(this. /*[exact=JSUInt31]*/ field);
+  /*member: Class5.:[exact=Class5|powerset=0]*/
+  Class5(this. /*[exact=JSUInt31|powerset=0]*/ field);
 }
 
-/*member: classWithFinalFieldInitializer:[exact=Class5]*/
+/*member: classWithFinalFieldInitializer:[exact=Class5|powerset=0]*/
 classWithFinalFieldInitializer() => Class5(0);
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -75,13 +75,13 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class6 {
-  var /*member: Class6.field:[exact=JSUInt31]*/ field;
+  var /*member: Class6.field:[exact=JSUInt31|powerset=0]*/ field;
 
-  /*member: Class6.:[exact=Class6]*/
-  Class6(this. /*[exact=JSUInt31]*/ field);
+  /*member: Class6.:[exact=Class6|powerset=0]*/
+  Class6(this. /*[exact=JSUInt31|powerset=0]*/ field);
 }
 
-/*member: classWithNonFinalFieldInitializer:[exact=Class6]*/
+/*member: classWithNonFinalFieldInitializer:[exact=Class6|powerset=0]*/
 classWithNonFinalFieldInitializer() => Class6(0);
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -89,13 +89,13 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class7 {
-  var /*member: Class7.field:[exact=JSUInt31]*/ field;
+  var /*member: Class7.field:[exact=JSUInt31|powerset=0]*/ field;
 
-  /*member: Class7.:[exact=Class7]*/
-  Class7(/*[exact=JSUInt31]*/ value) : this.field = value;
+  /*member: Class7.:[exact=Class7|powerset=0]*/
+  Class7(/*[exact=JSUInt31|powerset=0]*/ value) : this.field = value;
 }
 
-/*member: classWithExplicitFieldInitializer:[exact=Class7]*/
+/*member: classWithExplicitFieldInitializer:[exact=Class7|powerset=0]*/
 classWithExplicitFieldInitializer() => Class7(0);
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -103,15 +103,15 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class8 {
-  var /*member: Class8.field:[exact=JSUInt31]*/ field;
+  var /*member: Class8.field:[exact=JSUInt31|powerset=0]*/ field;
 
-  /*member: Class8.:[exact=Class8]*/
-  Class8(/*[exact=JSUInt31]*/ value) {
-    this. /*update: [exact=Class8]*/ field = value;
+  /*member: Class8.:[exact=Class8|powerset=0]*/
+  Class8(/*[exact=JSUInt31|powerset=0]*/ value) {
+    this. /*update: [exact=Class8|powerset=0]*/ field = value;
   }
 }
 
-/*member: classWithFieldInitializerInBody:[exact=Class8]*/
+/*member: classWithFieldInitializerInBody:[exact=Class8|powerset=0]*/
 classWithFieldInitializerInBody() => Class8(0);
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -120,13 +120,13 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class9 {
-  var /*member: Class9.field:[null]*/ field = null;
+  var /*member: Class9.field:[null|powerset=1]*/ field = null;
 
-  /*member: Class9.:[exact=Class9]*/
+  /*member: Class9.:[exact=Class9|powerset=0]*/
   Class9() {}
 }
 
-/*member: classWithNullNoFieldInitializerInBody:[exact=Class9]*/
+/*member: classWithNullNoFieldInitializerInBody:[exact=Class9|powerset=0]*/
 classWithNullNoFieldInitializerInBody() => Class9();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -135,15 +135,15 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class10 {
-  var /*member: Class10.field:[exact=JSUInt31]*/ field = null;
+  var /*member: Class10.field:[exact=JSUInt31|powerset=0]*/ field = null;
 
-  /*member: Class10.:[exact=Class10]*/
-  Class10(/*[exact=JSUInt31]*/ value) {
-    this. /*update: [exact=Class10]*/ field = value;
+  /*member: Class10.:[exact=Class10|powerset=0]*/
+  Class10(/*[exact=JSUInt31|powerset=0]*/ value) {
+    this. /*update: [exact=Class10|powerset=0]*/ field = value;
   }
 }
 
-/*member: classWithNullFieldInitializerInBody:[exact=Class10]*/
+/*member: classWithNullFieldInitializerInBody:[exact=Class10|powerset=0]*/
 classWithNullFieldInitializerInBody() => Class10(0);
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -152,18 +152,18 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class11 {
-  var /*member: Class11.field:[null|exact=JSUInt31]*/ field = null;
+  var /*member: Class11.field:[null|exact=JSUInt31|powerset=1]*/ field = null;
 
-  /*member: Class11.a:[exact=Class11]*/
-  Class11.a(/*[exact=JSUInt31]*/ value) {
-    this. /*update: [exact=Class11]*/ field = value;
+  /*member: Class11.a:[exact=Class11|powerset=0]*/
+  Class11.a(/*[exact=JSUInt31|powerset=0]*/ value) {
+    this. /*update: [exact=Class11|powerset=0]*/ field = value;
   }
 
-  /*member: Class11.b:[exact=Class11]*/
+  /*member: Class11.b:[exact=Class11|powerset=0]*/
   Class11.b() {}
 }
 
-/*member: classWithNullMaybeFieldInitializerInBody:[exact=Class11]*/
+/*member: classWithNullMaybeFieldInitializerInBody:[exact=Class11|powerset=0]*/
 classWithNullMaybeFieldInitializerInBody() {
   Class11.a(0);
   return Class11.b();
@@ -174,13 +174,13 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class12 {
-  final /*member: Class12.field:[null]*/ field = null;
+  final /*member: Class12.field:[null|powerset=1]*/ field = null;
 
-  /*member: Class12.:[exact=Class12]*/
+  /*member: Class12.:[exact=Class12|powerset=0]*/
   Class12();
 }
 
-/*member: classWithNullFinalFieldInitializer:[exact=Class12]*/
+/*member: classWithNullFinalFieldInitializer:[exact=Class12|powerset=0]*/
 classWithNullFinalFieldInitializer() {
   return Class12();
 }
diff --git a/pkg/compiler/test/inference/data/no_such_method.dart b/pkg/compiler/test/inference/data/no_such_method.dart
index 867c36a..fe36531 100644
--- a/pkg/compiler/test/inference/data/no_such_method.dart
+++ b/pkg/compiler/test/inference/data/no_such_method.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   missingGetter();
   missingMethod();
@@ -14,119 +14,125 @@
 // Access missing getter.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
-  /*member: Class1.noSuchMethod:[exact=JSUInt31]*/
+  /*member: Class1.noSuchMethod:[exact=JSUInt31|powerset=0]*/
   noSuchMethod(
     Invocation
-    /*spec.[null|subclass=Object]*/
-    /*prod.[exact=JSInvocationMirror]*/
+    /*spec.[null|subclass=Object|powerset=1]*/
+    /*prod.[exact=JSInvocationMirror|powerset=0]*/
     _,
   ) => 42;
 
-  /*member: Class1.method:[exact=JSUInt31]*/
+  /*member: Class1.method:[exact=JSUInt31|powerset=0]*/
   method() {
     dynamic a = this;
-    return a. /*[exact=Class1]*/ missingGetter;
+    return a. /*[exact=Class1|powerset=0]*/ missingGetter;
   }
 }
 
-/*member: missingGetter:[exact=JSUInt31]*/
-missingGetter() => Class1(). /*invoke: [exact=Class1]*/ method();
+/*member: missingGetter:[exact=JSUInt31|powerset=0]*/
+missingGetter() => Class1(). /*invoke: [exact=Class1|powerset=0]*/ method();
 
 ////////////////////////////////////////////////////////////////////////////////
 // Invoke missing method.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class2.:[exact=Class2]*/
+/*member: Class2.:[exact=Class2|powerset=0]*/
 class Class2 {
-  /*member: Class2.noSuchMethod:[exact=JSUInt31]*/
+  /*member: Class2.noSuchMethod:[exact=JSUInt31|powerset=0]*/
   noSuchMethod(
     Invocation
-    /*spec.[null|subclass=Object]*/
-    /*prod.[exact=JSInvocationMirror]*/
+    /*spec.[null|subclass=Object|powerset=1]*/
+    /*prod.[exact=JSInvocationMirror|powerset=0]*/
     _,
   ) => 42;
 
-  /*member: Class2.method:[exact=JSUInt31]*/
+  /*member: Class2.method:[exact=JSUInt31|powerset=0]*/
   method() {
     dynamic a = this;
-    return a. /*invoke: [exact=Class2]*/ missingMethod();
+    return a. /*invoke: [exact=Class2|powerset=0]*/ missingMethod();
   }
 }
 
-/*member: missingMethod:[exact=JSUInt31]*/
-missingMethod() => Class2(). /*invoke: [exact=Class2]*/ method();
+/*member: missingMethod:[exact=JSUInt31|powerset=0]*/
+missingMethod() => Class2(). /*invoke: [exact=Class2|powerset=0]*/ method();
 
 ////////////////////////////////////////////////////////////////////////////////
 // Pass closure to missing method.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class3.:[exact=Class3]*/
+/*member: Class3.:[exact=Class3|powerset=0]*/
 class Class3 {
-  /*member: Class3.noSuchMethod:[null|subclass=Object]*/
+  /*member: Class3.noSuchMethod:[null|subclass=Object|powerset=1]*/
   noSuchMethod(
     Invocation
-    /*spec.[null|subclass=Object]*/
-    /*prod.[exact=JSInvocationMirror]*/
+    /*spec.[null|subclass=Object|powerset=1]*/
+    /*prod.[exact=JSInvocationMirror|powerset=0]*/
     invocation,
   ) {
     return invocation
         .
-        /*[exact=JSInvocationMirror]*/
+        /*[exact=JSInvocationMirror|powerset=0]*/
         positionalArguments
         .
-        /*[exact=JSUnmodifiableArray]*/
+        /*[exact=JSUnmodifiableArray|powerset=0]*/
         first;
   }
 
-  /*member: Class3.method:[null|subclass=Object]*/
+  /*member: Class3.method:[null|subclass=Object|powerset=1]*/
   method() {
     dynamic a = this;
-    return a. /*invoke: [exact=Class3]*/ missingMethod(
-      /*[null]*/ (/*[null|subclass=Object]*/ parameter) {},
+    return a. /*invoke: [exact=Class3|powerset=0]*/ missingMethod(
+      /*[null|powerset=1]*/ (
+        /*[null|subclass=Object|powerset=1]*/ parameter,
+      ) {},
     )(0);
   }
 }
 
-/*member: closureThroughMissingMethod:[null|subclass=Object]*/
-closureThroughMissingMethod() => Class3(). /*invoke: [exact=Class3]*/ method();
+/*member: closureThroughMissingMethod:[null|subclass=Object|powerset=1]*/
+closureThroughMissingMethod() =>
+    Class3(). /*invoke: [exact=Class3|powerset=0]*/ method();
 
 ////////////////////////////////////////////////////////////////////////////////
 // Pass closure to missing setter.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class4.:[exact=Class4]*/
+/*member: Class4.:[exact=Class4|powerset=0]*/
 class Class4 {
-  /*member: Class4.field:[null|subclass=Object]*/
+  /*member: Class4.field:[null|subclass=Object|powerset=1]*/
   var field;
 
-  /*member: Class4.noSuchMethod:[null]*/
+  /*member: Class4.noSuchMethod:[null|powerset=1]*/
   noSuchMethod(
     Invocation
-    /*spec.[null|subclass=Object]*/
-    /*prod.[exact=JSInvocationMirror]*/
+    /*spec.[null|subclass=Object|powerset=1]*/
+    /*prod.[exact=JSInvocationMirror|powerset=0]*/
     invocation,
   ) {
-    this. /*update: [exact=Class4]*/ field =
+    this. /*update: [exact=Class4|powerset=0]*/ field =
         invocation
             .
-            /*[exact=JSInvocationMirror]*/
+            /*[exact=JSInvocationMirror|powerset=0]*/
             positionalArguments
             .
-            /*[exact=JSUnmodifiableArray]*/
+            /*[exact=JSUnmodifiableArray|powerset=0]*/
             first;
     return null;
   }
 
-  /*member: Class4.method:[null]*/
+  /*member: Class4.method:[null|powerset=1]*/
   method() {
     dynamic a = this;
-    a. /*update: [exact=Class4]*/ missingSetter =
-        /*[null]*/ (/*[null|subclass=Object]*/ parameter) {};
-    a. /*invoke: [exact=Class4]*/ field(0);
+    a. /*update: [exact=Class4|powerset=0]*/ missingSetter =
+        /*[null|powerset=1]*/ (
+          /*[null|subclass=Object|powerset=1]*/ parameter,
+        ) {};
+    a. /*invoke: [exact=Class4|powerset=0]*/ field(0);
   }
 }
 
-/*member: closureThroughMissingSetter:[null]*/
-closureThroughMissingSetter() => Class4(). /*invoke: [exact=Class4]*/ method();
+/*member: closureThroughMissingSetter:[null|powerset=1]*/
+closureThroughMissingSetter() =>
+    Class4(). /*invoke: [exact=Class4|powerset=0]*/ method();
diff --git a/pkg/compiler/test/inference/data/no_such_method1.dart b/pkg/compiler/test/inference/data/no_such_method1.dart
index a141d24..e0f52dd 100644
--- a/pkg/compiler/test/inference/data/no_such_method1.dart
+++ b/pkg/compiler/test/inference/data/no_such_method1.dart
@@ -2,60 +2,60 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: A.:[exact=A]*/
+/*member: A.:[exact=A|powerset=0]*/
 class A {
-  /*member: A.noSuchMethod:[exact=JSUInt31]*/
+  /*member: A.noSuchMethod:[exact=JSUInt31|powerset=0]*/
   noSuchMethod(
-    /*spec.[null|subclass=Object]*/
-    /*prod.[exact=JSInvocationMirror]*/
+    /*spec.[null|subclass=Object|powerset=1]*/
+    /*prod.[exact=JSInvocationMirror|powerset=0]*/
     im,
   ) => 42;
 }
 
-/*member: B.:[exact=B]*/
+/*member: B.:[exact=B|powerset=0]*/
 class B extends A {
-  /*member: B.foo:[exact=JSUInt31]*/
-  /*invoke: [subclass=B]*/
+  /*member: B.foo:[exact=JSUInt31|powerset=0]*/
+  /*invoke: [subclass=B|powerset=0]*/
   foo();
 }
 
-/*member: C.:[exact=C]*/
+/*member: C.:[exact=C|powerset=0]*/
 class C extends B {
-  /*member: C.foo:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+  /*member: C.foo:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
   foo() => {};
 }
 
-/*member: a:[null|subclass=B]*/
+/*member: a:[null|subclass=B|powerset=1]*/
 dynamic a =
     [new B(), C()]
-    /*Container([exact=JSExtendableArray], element: [subclass=B], length: 2)*/
+    /*Container([exact=JSExtendableArray|powerset=0], element: [subclass=B|powerset=0], length: 2, powerset: 0)*/
     [0];
 
-/*member: test1:[exact=JSUInt31]*/
+/*member: test1:[exact=JSUInt31|powerset=0]*/
 test1() {
   dynamic e = A();
-  return e. /*invoke: [exact=A]*/ foo();
+  return e. /*invoke: [exact=A|powerset=0]*/ foo();
 }
 
-/*member: test2:Union([exact=JSUInt31], [subclass=JsLinkedHashMap])*/
-test2() => a. /*invoke: [null|subclass=B]*/ foo();
+/*member: test2:Union([exact=JSUInt31|powerset=0], [subclass=JsLinkedHashMap|powerset=0], powerset: 0)*/
+test2() => a. /*invoke: [null|subclass=B|powerset=1]*/ foo();
 
-/*member: test3:[exact=JSUInt31]*/
-test3() => B(). /*invoke: [exact=B]*/ foo();
+/*member: test3:[exact=JSUInt31|powerset=0]*/
+test3() => B(). /*invoke: [exact=B|powerset=0]*/ foo();
 
-/*member: test4:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
-test4() => C(). /*invoke: [exact=C]*/ foo();
+/*member: test4:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
+test4() => C(). /*invoke: [exact=C|powerset=0]*/ foo();
 
-/*member: test5:Union([exact=JSUInt31], [subclass=JsLinkedHashMap])*/
+/*member: test5:Union([exact=JSUInt31|powerset=0], [subclass=JsLinkedHashMap|powerset=0], powerset: 0)*/
 test5() {
   dynamic e = (a ? A() : B());
-  return e. /*invoke: [subclass=A]*/ foo();
+  return e. /*invoke: [subclass=A|powerset=0]*/ foo();
 }
 
-/*member: test6:Union([exact=JSUInt31], [subclass=JsLinkedHashMap])*/
-test6() => (a ? B() : C()). /*invoke: [subclass=B]*/ foo();
+/*member: test6:Union([exact=JSUInt31|powerset=0], [subclass=JsLinkedHashMap|powerset=0], powerset: 0)*/
+test6() => (a ? B() : C()). /*invoke: [subclass=B|powerset=0]*/ foo();
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   test1();
   test2();
diff --git a/pkg/compiler/test/inference/data/no_such_method2.dart b/pkg/compiler/test/inference/data/no_such_method2.dart
index 94bdd61..4457cdd 100644
--- a/pkg/compiler/test/inference/data/no_such_method2.dart
+++ b/pkg/compiler/test/inference/data/no_such_method2.dart
@@ -2,103 +2,107 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: A.:[subclass=B]*/
+/*member: A.:[subclass=B|powerset=0]*/
 abstract class A {
-  /*member: A.noSuchMethod:[exact=JSUInt31]*/
+  /*member: A.noSuchMethod:[exact=JSUInt31|powerset=0]*/
   noSuchMethod(
-    /*spec.[null|subclass=Object]*/
-    /*prod.[exact=JSInvocationMirror]*/
+    /*spec.[null|subclass=Object|powerset=1]*/
+    /*prod.[exact=JSInvocationMirror|powerset=0]*/
     im,
   ) => 42;
 }
 
-/*member: B.:[exact=B]*/
+/*member: B.:[exact=B|powerset=0]*/
 class B extends A {
-  /*member: B.foo:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+  /*member: B.foo:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
   foo() => {};
 }
 
-/*member: C.:[exact=C]*/
+/*member: C.:[exact=C|powerset=0]*/
 class C extends B {
-  /*member: C.foo:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+  /*member: C.foo:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
   foo() => {};
 }
 
-/*member: D.:[exact=D]*/
+/*member: D.:[exact=D|powerset=0]*/
 class D implements A {
-  /*member: D.foo:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+  /*member: D.foo:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
   foo() => {};
 
-  /*member: D.noSuchMethod:[exact=JSNumNotInt]*/
+  /*member: D.noSuchMethod:[exact=JSNumNotInt|powerset=0]*/
   noSuchMethod(
-    /*prod.[exact=JSInvocationMirror]*/
-    /*spec.[null|subclass=Object]*/
+    /*prod.[exact=JSInvocationMirror|powerset=0]*/
+    /*spec.[null|subclass=Object|powerset=1]*/
     im,
   ) => 42.5;
 }
 
-/*member: a:Union(null, [exact=D], [subclass=B])*/
+/*member: a:Union(null, [exact=D|powerset=0], [subclass=B|powerset=0], powerset: 1)*/
 dynamic a =
     [new B(), C(), D()]
-    /*Container([exact=JSExtendableArray], element: Union([exact=D], [subclass=B]), length: 3)*/
+    /*Container([exact=JSExtendableArray|powerset=0], element: Union([exact=D|powerset=0], [subclass=B|powerset=0], powerset: 0), length: 3, powerset: 0)*/
     [0];
 
-/*member: test1:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
-test1() => a. /*invoke: Union(null, [exact=D], [subclass=B])*/ foo();
+/*member: test1:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
+test1() =>
+    a. /*invoke: Union(null, [exact=D|powerset=0], [subclass=B|powerset=0], powerset: 1)*/ foo();
 
-/*member: test2:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
-test2() => B(). /*invoke: [exact=B]*/ foo();
+/*member: test2:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
+test2() => B(). /*invoke: [exact=B|powerset=0]*/ foo();
 
-/*member: test3:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
-test3() => C(). /*invoke: [exact=C]*/ foo();
+/*member: test3:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
+test3() => C(). /*invoke: [exact=C|powerset=0]*/ foo();
 
-/*member: test4:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
-test4() => (a ? B() : C()). /*invoke: [subclass=B]*/ foo();
+/*member: test4:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
+test4() => (a ? B() : C()). /*invoke: [subclass=B|powerset=0]*/ foo();
 
-/*member: test5:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+/*member: test5:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
 test5() {
   dynamic e = (a ? B() : D());
-  return e. /*invoke: Union([exact=B], [exact=D])*/ foo();
+  return e
+      . /*invoke: Union([exact=B|powerset=0], [exact=D|powerset=0], powerset: 0)*/ foo();
 }
 
 // Can hit A.noSuchMethod, D.noSuchMethod and Object.noSuchMethod.
-/*member: test6:Union([exact=JSNumNotInt], [exact=JSUInt31])*/
-test6() => a. /*invoke: Union(null, [exact=D], [subclass=B])*/ bar();
+/*member: test6:Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+test6() =>
+    a. /*invoke: Union(null, [exact=D|powerset=0], [subclass=B|powerset=0], powerset: 1)*/ bar();
 
 // Can hit A.noSuchMethod.
-/*member: test7:[exact=JSUInt31]*/
+/*member: test7:[exact=JSUInt31|powerset=0]*/
 test7() {
   dynamic e = B();
-  return e. /*invoke: [exact=B]*/ bar();
+  return e. /*invoke: [exact=B|powerset=0]*/ bar();
 }
 
-/*member: test8:[exact=JSUInt31]*/
+/*member: test8:[exact=JSUInt31|powerset=0]*/
 test8() {
   dynamic e = C();
-  return e. /*invoke: [exact=C]*/ bar();
+  return e. /*invoke: [exact=C|powerset=0]*/ bar();
 }
 
-/*member: test9:[exact=JSUInt31]*/
+/*member: test9:[exact=JSUInt31|powerset=0]*/
 test9() {
   dynamic e = (a ? B() : C());
-  return e. /*invoke: [subclass=B]*/ bar();
+  return e. /*invoke: [subclass=B|powerset=0]*/ bar();
 }
 
 // Can hit A.noSuchMethod and D.noSuchMethod.
-/*member: test10:Union([exact=JSNumNotInt], [exact=JSUInt31])*/
+/*member: test10:Union([exact=JSNumNotInt|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 test10() {
   dynamic e = (a ? B() : D());
-  return e. /*invoke: Union([exact=B], [exact=D])*/ bar();
+  return e
+      . /*invoke: Union([exact=B|powerset=0], [exact=D|powerset=0], powerset: 0)*/ bar();
 }
 
 // Can hit D.noSuchMethod.
-/*member: test11:[exact=JSNumNotInt]*/
+/*member: test11:[exact=JSNumNotInt|powerset=0]*/
 test11() {
   dynamic e = D();
-  return e. /*invoke: [exact=D]*/ bar();
+  return e. /*invoke: [exact=D|powerset=0]*/ bar();
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   test1();
   test2();
diff --git a/pkg/compiler/test/inference/data/no_such_method3.dart b/pkg/compiler/test/inference/data/no_such_method3.dart
index 342fdb5..f222862 100644
--- a/pkg/compiler/test/inference/data/no_such_method3.dart
+++ b/pkg/compiler/test/inference/data/no_such_method3.dart
@@ -2,60 +2,60 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: A.:[exact=A]*/
+/*member: A.:[exact=A|powerset=0]*/
 class A {
   // We may ignore this for type inference because syntactically it always
   // throws an exception.
-  /*member: A.noSuchMethod:[empty]*/
+  /*member: A.noSuchMethod:[empty|powerset=0]*/
   noSuchMethod(
-    /*spec.[null|subclass=Object]*/
-    /*prod.[exact=JSInvocationMirror]*/
+    /*spec.[null|subclass=Object|powerset=1]*/
+    /*prod.[exact=JSInvocationMirror|powerset=0]*/
     im,
   ) => throw 'foo';
 }
 
-/*member: B.:[exact=B]*/
+/*member: B.:[exact=B|powerset=0]*/
 class B extends A {
-  /*member: B.foo:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+  /*member: B.foo:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
   foo() => {};
 }
 
-/*member: C.:[exact=C]*/
+/*member: C.:[exact=C|powerset=0]*/
 class C extends B {
-  /*member: C.foo:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+  /*member: C.foo:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
   foo() => {};
 }
 
-/*member: a:[null|subclass=B]*/
+/*member: a:[null|subclass=B|powerset=1]*/
 dynamic a =
     [new B(), C()]
-    /*Container([exact=JSExtendableArray], element: [subclass=B], length: 2)*/
+    /*Container([exact=JSExtendableArray|powerset=0], element: [subclass=B|powerset=0], length: 2, powerset: 0)*/
     [0];
-/*member: test1:[empty]*/
+/*member: test1:[empty|powerset=0]*/
 test1() {
   dynamic e = A();
-  return e. /*invoke: [exact=A]*/ foo();
+  return e. /*invoke: [exact=A|powerset=0]*/ foo();
 }
 
-/*member: test2:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
-test2() => a. /*invoke: [null|subclass=B]*/ foo();
+/*member: test2:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
+test2() => a. /*invoke: [null|subclass=B|powerset=1]*/ foo();
 
-/*member: test3:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
-test3() => B(). /*invoke: [exact=B]*/ foo();
+/*member: test3:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
+test3() => B(). /*invoke: [exact=B|powerset=0]*/ foo();
 
-/*member: test4:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
-test4() => C(). /*invoke: [exact=C]*/ foo();
+/*member: test4:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
+test4() => C(). /*invoke: [exact=C|powerset=0]*/ foo();
 
-/*member: test5:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+/*member: test5:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
 test5() {
   dynamic e = (a ? A() : B());
-  return e. /*invoke: [subclass=A]*/ foo();
+  return e. /*invoke: [subclass=A|powerset=0]*/ foo();
 }
 
-/*member: test6:Dictionary([subclass=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
-test6() => (a ? B() : C()). /*invoke: [subclass=B]*/ foo();
+/*member: test6:Dictionary([subclass=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
+test6() => (a ? B() : C()). /*invoke: [subclass=B|powerset=0]*/ foo();
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   test1();
   test2();
diff --git a/pkg/compiler/test/inference/data/no_such_method4.dart b/pkg/compiler/test/inference/data/no_such_method4.dart
index e14ebf1..8ac3852 100644
--- a/pkg/compiler/test/inference/data/no_such_method4.dart
+++ b/pkg/compiler/test/inference/data/no_such_method4.dart
@@ -2,56 +2,56 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: A.:[exact=A]*/
+/*member: A.:[exact=A|powerset=0]*/
 class A {
   // We may ignore this for type inference because it forwards to a default
   // noSuchMethod implementation, which always throws an exception.
   noSuchMethod(im) => super.noSuchMethod(im);
 }
 
-/*member: B.:[exact=B]*/
+/*member: B.:[exact=B|powerset=0]*/
 class B extends A {
-  /*member: B.foo:Dictionary([exact=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+  /*member: B.foo:Dictionary([exact=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
   foo() => {};
 }
 
-/*member: C.:[exact=C]*/
+/*member: C.:[exact=C|powerset=0]*/
 class C extends B {
-  /*member: C.foo:Dictionary([exact=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+  /*member: C.foo:Dictionary([exact=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
   foo() => {};
 }
 
-/*member: a:[null|subclass=B]*/
+/*member: a:[null|subclass=B|powerset=1]*/
 dynamic a =
     [new B(), C()]
-    /*Container([exact=JSExtendableArray], element: [subclass=B], length: 2)*/
+    /*Container([exact=JSExtendableArray|powerset=0], element: [subclass=B|powerset=0], length: 2, powerset: 0)*/
     [0];
 
-/*member: test1:[empty]*/
+/*member: test1:[empty|powerset=0]*/
 test1() {
   dynamic e = A();
-  return e. /*invoke: [exact=A]*/ foo();
+  return e. /*invoke: [exact=A|powerset=0]*/ foo();
 }
 
-/*member: test2:Dictionary([exact=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
-test2() => a. /*invoke: [null|subclass=B]*/ foo();
+/*member: test2:Dictionary([exact=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
+test2() => a. /*invoke: [null|subclass=B|powerset=1]*/ foo();
 
-/*member: test3:Dictionary([exact=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
-test3() => B(). /*invoke: [exact=B]*/ foo();
+/*member: test3:Dictionary([exact=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
+test3() => B(). /*invoke: [exact=B|powerset=0]*/ foo();
 
-/*member: test4:Dictionary([exact=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
-test4() => C(). /*invoke: [exact=C]*/ foo();
+/*member: test4:Dictionary([exact=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
+test4() => C(). /*invoke: [exact=C|powerset=0]*/ foo();
 
-/*member: test5:Dictionary([exact=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
+/*member: test5:Dictionary([exact=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
 test5() {
   dynamic e = (a ? A() : B());
-  return e. /*invoke: [subclass=A]*/ foo();
+  return e. /*invoke: [subclass=A|powerset=0]*/ foo();
 }
 
-/*member: test6:Dictionary([exact=JsLinkedHashMap], key: [empty], value: [null], map: {})*/
-test6() => (a ? B() : C()). /*invoke: [subclass=B]*/ foo();
+/*member: test6:Dictionary([exact=JsLinkedHashMap|powerset=0], key: [empty|powerset=0], value: [null|powerset=1], map: {}, powerset: 0)*/
+test6() => (a ? B() : C()). /*invoke: [subclass=B|powerset=0]*/ foo();
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   test1();
   test2();
diff --git a/pkg/compiler/test/inference/data/non_null.dart b/pkg/compiler/test/inference/data/non_null.dart
index a23be1f..f44909d 100644
--- a/pkg/compiler/test/inference/data/non_null.dart
+++ b/pkg/compiler/test/inference/data/non_null.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   nonNullStaticField();
   nonNullInstanceField1();
@@ -10,40 +10,42 @@
   nonNullLocal();
 }
 
-/*member: staticField:[null|exact=JSUInt31]*/
+/*member: staticField:[null|exact=JSUInt31|powerset=1]*/
 var staticField;
 
-/*member: nonNullStaticField:[exact=JSUInt31]*/
+/*member: nonNullStaticField:[exact=JSUInt31|powerset=0]*/
 nonNullStaticField() => staticField ??= 42;
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
-  /*member: Class1.field:[null|exact=JSUInt31]*/
+  /*member: Class1.field:[null|exact=JSUInt31|powerset=1]*/
   var field;
 }
 
-/*member: nonNullInstanceField1:[exact=JSUInt31]*/
+/*member: nonNullInstanceField1:[exact=JSUInt31|powerset=0]*/
 nonNullInstanceField1() {
-  return Class1(). /*[exact=Class1]*/ /*update: [exact=Class1]*/ field ??= 42;
+  return Class1()
+      . /*[exact=Class1|powerset=0]*/ /*update: [exact=Class1|powerset=0]*/ field ??= 42;
 }
 
-/*member: Class2.:[exact=Class2]*/
+/*member: Class2.:[exact=Class2|powerset=0]*/
 class Class2 {
-  /*member: Class2.field:[null|exact=JSUInt31]*/
+  /*member: Class2.field:[null|exact=JSUInt31|powerset=1]*/
   var field;
 
-  /*member: Class2.method:[exact=JSUInt31]*/
+  /*member: Class2.method:[exact=JSUInt31|powerset=0]*/
   method() {
-    return /*[exact=Class2]*/ /*update: [exact=Class2]*/ field ??= 42;
+    return /*[exact=Class2|powerset=0]*/ /*update: [exact=Class2|powerset=0]*/ field ??=
+        42;
   }
 }
 
-/*member: nonNullInstanceField2:[exact=JSUInt31]*/
+/*member: nonNullInstanceField2:[exact=JSUInt31|powerset=0]*/
 nonNullInstanceField2() {
-  return Class2(). /*invoke: [exact=Class2]*/ method();
+  return Class2(). /*invoke: [exact=Class2|powerset=0]*/ method();
 }
 
-/*member: nonNullLocal:[exact=JSUInt31]*/
+/*member: nonNullLocal:[exact=JSUInt31|powerset=0]*/
 nonNullLocal() {
   var local = null;
   return local ??= 42;
diff --git a/pkg/compiler/test/inference/data/null.dart b/pkg/compiler/test/inference/data/null.dart
index ec7f4bf..e9db384 100644
--- a/pkg/compiler/test/inference/data/null.dart
+++ b/pkg/compiler/test/inference/data/null.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   ifThenNullCheck(0);
   ifThenNullCheck(null);
@@ -22,84 +22,84 @@
   ifThenNotNullGradualCheck2(null, 0);
 }
 
-/*member: ifThenNullCheck:[exact=JSUInt31]*/
-ifThenNullCheck(int? /*[null|exact=JSUInt31]*/ value) {
-  if (value /*invoke: [null|subclass=JSInt]*/ == null) {
+/*member: ifThenNullCheck:[exact=JSUInt31|powerset=0]*/
+ifThenNullCheck(int? /*[null|exact=JSUInt31|powerset=1]*/ value) {
+  if (value /*invoke: [null|subclass=JSInt|powerset=1]*/ == null) {
     return 0;
   }
   return value;
 }
 
-/*member: ifThenElseNullCheck:[exact=JSUInt31]*/
-ifThenElseNullCheck(int? /*[null|exact=JSUInt31]*/ value) {
-  if (value /*invoke: [null|subclass=JSInt]*/ == null) {
+/*member: ifThenElseNullCheck:[exact=JSUInt31|powerset=0]*/
+ifThenElseNullCheck(int? /*[null|exact=JSUInt31|powerset=1]*/ value) {
+  if (value /*invoke: [null|subclass=JSInt|powerset=1]*/ == null) {
     return 0;
   } else {
     return value;
   }
 }
 
-/*member: ifNotThenNullCheck:[exact=JSUInt31]*/
-ifNotThenNullCheck(int? /*[null|exact=JSUInt31]*/ value) {
-  if (value /*invoke: [null|subclass=JSInt]*/ != null) {
+/*member: ifNotThenNullCheck:[exact=JSUInt31|powerset=0]*/
+ifNotThenNullCheck(int? /*[null|exact=JSUInt31|powerset=1]*/ value) {
+  if (value /*invoke: [null|subclass=JSInt|powerset=1]*/ != null) {
     return value;
   }
   return 0;
 }
 
-/*member: ifNotThenElseNullCheck:[exact=JSUInt31]*/
-ifNotThenElseNullCheck(int? /*[null|exact=JSUInt31]*/ value) {
-  if (value /*invoke: [null|subclass=JSInt]*/ != null) {
+/*member: ifNotThenElseNullCheck:[exact=JSUInt31|powerset=0]*/
+ifNotThenElseNullCheck(int? /*[null|exact=JSUInt31|powerset=1]*/ value) {
+  if (value /*invoke: [null|subclass=JSInt|powerset=1]*/ != null) {
     return value;
   } else {
     return 0;
   }
 }
 
-/*member: ifThenNotNullComplexCheck:[exact=JSUInt31]*/
+/*member: ifThenNotNullComplexCheck:[exact=JSUInt31|powerset=0]*/
 ifThenNotNullComplexCheck(
-  int? /*[null|exact=JSUInt31]*/ a,
-  int? /*[null|exact=JSUInt31]*/ b,
+  int? /*[null|exact=JSUInt31|powerset=1]*/ a,
+  int? /*[null|exact=JSUInt31|powerset=1]*/ b,
 ) {
-  if (a /*invoke: [null|subclass=JSInt]*/ != null &&
-      a /*invoke: [exact=JSUInt31]*/ != b) {
+  if (a /*invoke: [null|subclass=JSInt|powerset=1]*/ != null &&
+      a /*invoke: [exact=JSUInt31|powerset=0]*/ != b) {
     return a;
   }
   return 0;
 }
 
-/*member: ifThenElseNotNullComplexCheck:[null|exact=JSUInt31]*/
+/*member: ifThenElseNotNullComplexCheck:[null|exact=JSUInt31|powerset=1]*/
 ifThenElseNotNullComplexCheck(
-  int? /*[null|exact=JSUInt31]*/ a,
-  int? /*[null|exact=JSUInt31]*/ b,
+  int? /*[null|exact=JSUInt31|powerset=1]*/ a,
+  int? /*[null|exact=JSUInt31|powerset=1]*/ b,
 ) {
-  if (a /*invoke: [null|subclass=JSInt]*/ != null &&
-      a /*invoke: [exact=JSUInt31]*/ != b) {
+  if (a /*invoke: [null|subclass=JSInt|powerset=1]*/ != null &&
+      a /*invoke: [exact=JSUInt31|powerset=0]*/ != b) {
     return a;
   }
   return a;
 }
 
-/*member: ifThenNotNullGradualCheck1:[exact=JSUInt31]*/
+/*member: ifThenNotNullGradualCheck1:[exact=JSUInt31|powerset=0]*/
 ifThenNotNullGradualCheck1(
-  int? /*[null|exact=JSUInt31]*/ a,
-  int /*[exact=JSUInt31]*/ b,
+  int? /*[null|exact=JSUInt31|powerset=1]*/ a,
+  int /*[exact=JSUInt31|powerset=0]*/ b,
 ) {
-  if (a /*invoke: [null|exact=JSUInt31]*/ != b) {
-    if (a /*invoke: [null|subclass=JSInt]*/ != null) {
+  if (a /*invoke: [null|exact=JSUInt31|powerset=1]*/ != b) {
+    if (a /*invoke: [null|subclass=JSInt|powerset=1]*/ != null) {
       return a;
     }
   }
   return 0;
 }
 
-/*member: ifThenNotNullGradualCheck2:[exact=JSUInt31]*/
+/*member: ifThenNotNullGradualCheck2:[exact=JSUInt31|powerset=0]*/
 ifThenNotNullGradualCheck2(
-  int? /*[null|exact=JSUInt31]*/ a,
-  int /*[exact=JSUInt31]*/ b,
+  int? /*[null|exact=JSUInt31|powerset=1]*/ a,
+  int /*[exact=JSUInt31|powerset=0]*/ b,
 ) {
-  if (a /*invoke: [null|subclass=JSInt]*/ != null) {
-    if (a /*invoke: [exact=JSUInt31]*/ != b) {
+  if (a /*invoke: [null|subclass=JSInt|powerset=1]*/ != null) {
+    if (a /*invoke: [exact=JSUInt31|powerset=0]*/ != b) {
       return a;
     }
   }
diff --git a/pkg/compiler/test/inference/data/optimizer_hints.dart b/pkg/compiler/test/inference/data/optimizer_hints.dart
index 96e66f2..0e029bf 100644
--- a/pkg/compiler/test/inference/data/optimizer_hints.dart
+++ b/pkg/compiler/test/inference/data/optimizer_hints.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   assumeDynamic();
   notAssumeDynamic();
@@ -18,11 +18,11 @@
 // the 'dynamic' type.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _assumeDynamic:[null|subclass=Object]*/
+/*member: _assumeDynamic:[null|subclass=Object|powerset=1]*/
 @pragma('dart2js:assumeDynamic')
-_assumeDynamic(/*[null|subclass=Object]*/ o) => o;
+_assumeDynamic(/*[null|subclass=Object|powerset=1]*/ o) => o;
 
-/*member: assumeDynamic:[null]*/
+/*member: assumeDynamic:[null|powerset=1]*/
 assumeDynamic() {
   _assumeDynamic(0);
 }
@@ -31,10 +31,10 @@
 // As above but without the annotation.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _notAssumeDynamic:[exact=JSUInt31]*/
-_notAssumeDynamic(/*[exact=JSUInt31]*/ o) => o;
+/*member: _notAssumeDynamic:[exact=JSUInt31|powerset=0]*/
+_notAssumeDynamic(/*[exact=JSUInt31|powerset=0]*/ o) => o;
 
-/*member: notAssumeDynamic:[null]*/
+/*member: notAssumeDynamic:[null|powerset=1]*/
 notAssumeDynamic() {
   _notAssumeDynamic(0);
 }
@@ -43,7 +43,7 @@
 // No annotation is needed to trust return type annotation.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: trustReturnTypeString:[exact=JSString]*/
+/*member: trustReturnTypeString:[exact=JSString|powerset=0]*/
 String trustReturnTypeString() {
   return _assumeDynamic(0);
 }
@@ -52,10 +52,10 @@
 // No annotation is needed to trust parameter type annotation.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _trustParameterTypeString:[null]*/
-_trustParameterTypeString(String /*[exact=JSString]*/ o) {}
+/*member: _trustParameterTypeString:[null|powerset=1]*/
+_trustParameterTypeString(String /*[exact=JSString|powerset=0]*/ o) {}
 
-/*member: trustParameterTypeString:[null]*/
+/*member: trustParameterTypeString:[null|powerset=1]*/
 trustParameterTypeString() {
   _trustParameterTypeString(_assumeDynamic(0));
 }
diff --git a/pkg/compiler/test/inference/data/parameters_trust.dart b/pkg/compiler/test/inference/data/parameters_trust.dart
index 7420aed..610b3aa 100644
--- a/pkg/compiler/test/inference/data/parameters_trust.dart
+++ b/pkg/compiler/test/inference/data/parameters_trust.dart
@@ -4,7 +4,7 @@
 
 import 'package:expect/expect.dart';
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   trustParameters();
 }
@@ -13,19 +13,19 @@
 // Test that we trust the explicit type of a parameter.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _trustParameters:[exact=JSUInt31]*/
+/*member: _trustParameters:[exact=JSUInt31|powerset=0]*/
 _trustParameters(
   int
-  /*spec.Union([exact=JSString], [exact=JSUInt31])*/
-  /*prod.[exact=JSUInt31]*/
+  /*spec.Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+  /*prod.[exact=JSUInt31|powerset=0]*/
   i,
 ) {
   return i;
 }
 
-/*member: trustParameters:[null]*/
+/*member: trustParameters:[null|powerset=1]*/
 trustParameters() {
   dynamic f = _trustParameters;
   Expect.equals(0, f(0));
-  Expect.throws(/*[null|subclass=Object]*/ () => f('foo'));
+  Expect.throws(/*[null|subclass=Object|powerset=1]*/ () => f('foo'));
 }
diff --git a/pkg/compiler/test/inference/data/postfix.dart b/pkg/compiler/test/inference/data/postfix.dart
index 4dd52f2..6c55d30 100644
--- a/pkg/compiler/test/inference/data/postfix.dart
+++ b/pkg/compiler/test/inference/data/postfix.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   localPostfixInc();
   localPostfixDec();
@@ -18,146 +18,146 @@
 // Postfix increment on local variable.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: localPostfixInc:[exact=JSUInt31]*/
+/*member: localPostfixInc:[exact=JSUInt31|powerset=0]*/
 localPostfixInc() {
   var local;
   if (local == null) {
     local = 0;
   }
-  return local /*invoke: [exact=JSUInt31]*/ ++;
+  return local /*invoke: [exact=JSUInt31|powerset=0]*/ ++;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Postfix decrement on local variable.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: localPostfixDec:[exact=JSUInt31]*/
+/*member: localPostfixDec:[exact=JSUInt31|powerset=0]*/
 localPostfixDec() {
   var local;
   if (local == null) {
     local = 0;
   }
-  return local /*invoke: [exact=JSUInt31]*/ --;
+  return local /*invoke: [exact=JSUInt31|powerset=0]*/ --;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Postfix increment on static field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _staticField1:[null|subclass=JSPositiveInt]*/
+/*member: _staticField1:[null|subclass=JSPositiveInt|powerset=1]*/
 var _staticField1;
 
-/*member: staticFieldPostfixInc:[subclass=JSPositiveInt]*/
+/*member: staticFieldPostfixInc:[subclass=JSPositiveInt|powerset=0]*/
 staticFieldPostfixInc() {
   if (_staticField1 == null) {
     _staticField1 = 0;
   }
-  return _staticField1 /*invoke: [null|subclass=JSPositiveInt]*/ ++;
+  return _staticField1 /*invoke: [null|subclass=JSPositiveInt|powerset=1]*/ ++;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Postfix decrement on static field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _staticField2:[null|subclass=JSInt]*/
+/*member: _staticField2:[null|subclass=JSInt|powerset=1]*/
 var _staticField2;
 
-/*member: staticFieldPostfixDec:[subclass=JSInt]*/
+/*member: staticFieldPostfixDec:[subclass=JSInt|powerset=0]*/
 staticFieldPostfixDec() {
   if (_staticField2 == null) {
     _staticField2 = 0;
   }
-  return _staticField2 /*invoke: [null|subclass=JSInt]*/ --;
+  return _staticField2 /*invoke: [null|subclass=JSInt|powerset=1]*/ --;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Postfix increment on instance field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
-  /*member: Class1.field1:[null|subclass=JSPositiveInt]*/
+  /*member: Class1.field1:[null|subclass=JSPositiveInt|powerset=1]*/
   var field1;
 }
 
-/*member: instanceFieldPostfixInc:[subclass=JSPositiveInt]*/
+/*member: instanceFieldPostfixInc:[subclass=JSPositiveInt|powerset=0]*/
 instanceFieldPostfixInc() {
   var c = Class1();
-  if (c. /*[exact=Class1]*/ field1 == null) {
-    c. /*update: [exact=Class1]*/ field1 = 0;
+  if (c. /*[exact=Class1|powerset=0]*/ field1 == null) {
+    c. /*update: [exact=Class1|powerset=0]*/ field1 = 0;
   }
   return c
       .
-      /*[exact=Class1]*/
-      /*update: [exact=Class1]*/
-      field1 /*invoke: [null|subclass=JSPositiveInt]*/ ++;
+      /*[exact=Class1|powerset=0]*/
+      /*update: [exact=Class1|powerset=0]*/
+      field1 /*invoke: [null|subclass=JSPositiveInt|powerset=1]*/ ++;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Postfix decrement on instance field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class2.:[exact=Class2]*/
+/*member: Class2.:[exact=Class2|powerset=0]*/
 class Class2 {
-  /*member: Class2.field2:[null|subclass=JSInt]*/
+  /*member: Class2.field2:[null|subclass=JSInt|powerset=1]*/
   var field2;
 }
 
-/*member: instanceFieldPostfixDec:[subclass=JSInt]*/
+/*member: instanceFieldPostfixDec:[subclass=JSInt|powerset=0]*/
 instanceFieldPostfixDec() {
   var c = Class2();
-  if (c. /*[exact=Class2]*/ field2 == null) {
-    c. /*update: [exact=Class2]*/ field2 = 0;
+  if (c. /*[exact=Class2|powerset=0]*/ field2 == null) {
+    c. /*update: [exact=Class2|powerset=0]*/ field2 = 0;
   }
   return c
       .
-      /*[exact=Class2]*/
-      /*update: [exact=Class2]*/
-      field2 /*invoke: [null|subclass=JSInt]*/ --;
+      /*[exact=Class2|powerset=0]*/
+      /*update: [exact=Class2|powerset=0]*/
+      field2 /*invoke: [null|subclass=JSInt|powerset=1]*/ --;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Conditional postfix increment on instance field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class3.:[exact=Class3]*/
+/*member: Class3.:[exact=Class3|powerset=0]*/
 class Class3 {
-  /*member: Class3.field3:[null|subclass=JSPositiveInt]*/
+  /*member: Class3.field3:[null|subclass=JSPositiveInt|powerset=1]*/
   var field3;
 }
 
-/*member: conditionalInstanceFieldPostfixInc:[null|subclass=JSPositiveInt]*/
+/*member: conditionalInstanceFieldPostfixInc:[null|subclass=JSPositiveInt|powerset=1]*/
 conditionalInstanceFieldPostfixInc() {
   var c = Class3();
-  if (c. /*[exact=Class3]*/ field3 == null) {
-    c. /*update: [exact=Class3]*/ field3 = 0;
+  if (c. /*[exact=Class3|powerset=0]*/ field3 == null) {
+    c. /*update: [exact=Class3|powerset=0]*/ field3 = 0;
   }
   return c
       ?.
-      /*[exact=Class3]*/
-      /*update: [exact=Class3]*/
-      field3 /*invoke: [null|subclass=JSPositiveInt]*/ ++;
+      /*[exact=Class3|powerset=0]*/
+      /*update: [exact=Class3|powerset=0]*/
+      field3 /*invoke: [null|subclass=JSPositiveInt|powerset=1]*/ ++;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Conditional postfix decrement on instance field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class4.:[exact=Class4]*/
+/*member: Class4.:[exact=Class4|powerset=0]*/
 class Class4 {
-  /*member: Class4.field4:[null|subclass=JSInt]*/
+  /*member: Class4.field4:[null|subclass=JSInt|powerset=1]*/
   var field4;
 }
 
-/*member: conditionalInstanceFieldPostfixDec:[null|subclass=JSInt]*/
+/*member: conditionalInstanceFieldPostfixDec:[null|subclass=JSInt|powerset=1]*/
 conditionalInstanceFieldPostfixDec() {
   var c = Class4();
-  if (c. /*[exact=Class4]*/ field4 == null) {
-    c. /*update: [exact=Class4]*/ field4 = 0;
+  if (c. /*[exact=Class4|powerset=0]*/ field4 == null) {
+    c. /*update: [exact=Class4|powerset=0]*/ field4 = 0;
   }
   return c
       ?.
-      /*[exact=Class4]*/
-      /*update: [exact=Class4]*/
-      field4 /*invoke: [null|subclass=JSInt]*/ --;
+      /*[exact=Class4|powerset=0]*/
+      /*update: [exact=Class4|powerset=0]*/
+      field4 /*invoke: [null|subclass=JSInt|powerset=1]*/ --;
 }
diff --git a/pkg/compiler/test/inference/data/postfix_prefix.dart b/pkg/compiler/test/inference/data/postfix_prefix.dart
index 67f1c92..8ae790a 100644
--- a/pkg/compiler/test/inference/data/postfix_prefix.dart
+++ b/pkg/compiler/test/inference/data/postfix_prefix.dart
@@ -2,121 +2,128 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: index:[empty]*/
+/*member: index:[empty|powerset=0]*/
 dynamic get index => throw '';
 
-/*member: A.:[exact=A]*/
+/*member: A.:[exact=A|powerset=0]*/
 class A {
-  /*member: A.foo:Value([exact=JSString], value: "string")*/
+  /*member: A.foo:Value([exact=JSString|powerset=0], value: "string", powerset: 0)*/
   get foo => 'string';
 
-  set foo(/*[subclass=JSNumber]*/ value) {}
+  set foo(/*[subclass=JSNumber|powerset=0]*/ value) {}
 
-  /*member: A.[]:Value([exact=JSString], value: "string")*/
-  operator [](/*[empty]*/ index) => 'string';
+  /*member: A.[]:Value([exact=JSString|powerset=0], value: "string", powerset: 0)*/
+  operator [](/*[empty|powerset=0]*/ index) => 'string';
 
-  /*member: A.[]=:[null]*/
-  operator []=(/*[empty]*/ index, /*[subclass=JSNumber]*/ value) {}
+  /*member: A.[]=:[null|powerset=1]*/
+  operator []=(
+    /*[empty|powerset=0]*/ index,
+    /*[subclass=JSNumber|powerset=0]*/ value,
+  ) {}
 
-  /*member: A.returnDynamic1:Union([exact=JSString], [exact=JSUInt31])*/
-  returnDynamic1() => /*[subclass=A]*/ /*update: [subclass=A]*/
-      foo /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ --;
+  /*member: A.returnDynamic1:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+  returnDynamic1() => /*[subclass=A|powerset=0]*/ /*update: [subclass=A|powerset=0]*/
+      foo /*invoke: Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ --;
 
-  /*member: A.returnNum1:[subclass=JSNumber]*/
-  returnNum1() => /*invoke: Union([exact=JSString], [exact=JSUInt31])*/
-      -- /*[subclass=A]*/ /*update: [subclass=A]*/ foo;
+  /*member: A.returnNum1:[subclass=JSNumber|powerset=0]*/
+  returnNum1() => /*invoke: Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+      -- /*[subclass=A|powerset=0]*/ /*update: [subclass=A|powerset=0]*/ foo;
 
-  /*member: A.returnNum2:[subclass=JSNumber]*/
-  returnNum2() => /*[subclass=A]*/ /*update: [subclass=A]*/
-      foo /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ -= 42;
-
-  /*member: A.returnDynamic2:Union([exact=JSString], [exact=JSUInt31])*/
-  returnDynamic2() =>
-      this /*[subclass=A]*/ /*update: [subclass=A]*/ [index] /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ --;
-
-  /*member: A.returnNum3:[subclass=JSNumber]*/
-  returnNum3() => /*invoke: Union([exact=JSString], [exact=JSUInt31])*/
-      --this /*[subclass=A]*/ /*update: [subclass=A]*/ [index];
-
-  /*member: A.returnNum4:[subclass=JSNumber]*/
-  returnNum4() =>
-      this /*[subclass=A]*/ /*update: [subclass=A]*/ [index] /*invoke: Union([exact=JSString], [exact=JSUInt31])*/ -=
+  /*member: A.returnNum2:[subclass=JSNumber|powerset=0]*/
+  returnNum2() => /*[subclass=A|powerset=0]*/ /*update: [subclass=A|powerset=0]*/
+      foo /*invoke: Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ -=
           42;
 
-  /*member: A.returnEmpty3:[empty]*/
+  /*member: A.returnDynamic2:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+  returnDynamic2() =>
+      this /*[subclass=A|powerset=0]*/ /*update: [subclass=A|powerset=0]*/ [index] /*invoke: Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ --;
+
+  /*member: A.returnNum3:[subclass=JSNumber|powerset=0]*/
+  returnNum3() => /*invoke: Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+      --this /*[subclass=A|powerset=0]*/ /*update: [subclass=A|powerset=0]*/ [index];
+
+  /*member: A.returnNum4:[subclass=JSNumber|powerset=0]*/
+  returnNum4() =>
+      this /*[subclass=A|powerset=0]*/ /*update: [subclass=A|powerset=0]*/ [index] /*invoke: Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ -=
+          42;
+
+  /*member: A.returnEmpty3:[empty|powerset=0]*/
   returnEmpty3() {
     dynamic a = this;
     return a
-        . /*[subclass=A]*/ /*update: [subclass=A]*/ bar /*invoke: [empty]*/ --;
+        . /*[subclass=A|powerset=0]*/ /*update: [subclass=A|powerset=0]*/ bar /*invoke: [empty|powerset=0]*/ --;
   }
 
-  /*member: A.returnEmpty1:[empty]*/
+  /*member: A.returnEmpty1:[empty|powerset=0]*/
   returnEmpty1() {
     dynamic a = this;
-    return /*invoke: [empty]*/ --a
-        . /*[subclass=A]*/ /*update: [subclass=A]*/ bar;
+    return /*invoke: [empty|powerset=0]*/ --a
+        . /*[subclass=A|powerset=0]*/ /*update: [subclass=A|powerset=0]*/ bar;
   }
 
-  /*member: A.returnEmpty2:[empty]*/
+  /*member: A.returnEmpty2:[empty|powerset=0]*/
   returnEmpty2() {
     dynamic a = this;
-    return a. /*[subclass=A]*/ /*update: [subclass=A]*/ bar /*invoke: [empty]*/ -=
+    return a. /*[subclass=A|powerset=0]*/ /*update: [subclass=A|powerset=0]*/ bar /*invoke: [empty|powerset=0]*/ -=
         42;
   }
 }
 
-/*member: B.:[exact=B]*/
+/*member: B.:[exact=B|powerset=0]*/
 class B extends A {
-  /*member: B.foo:[exact=JSUInt31]*/
+  /*member: B.foo:[exact=JSUInt31|powerset=0]*/
   get foo => 42;
-  /*member: B.[]:[exact=JSUInt31]*/
-  operator [](/*[empty]*/ index) => 42;
+  /*member: B.[]:[exact=JSUInt31|powerset=0]*/
+  operator [](/*[empty|powerset=0]*/ index) => 42;
 
-  /*member: B.returnString1:Value([exact=JSString], value: "string")*/
+  /*member: B.returnString1:Value([exact=JSString|powerset=0], value: "string", powerset: 0)*/
   returnString1() =>
-      super.foo /*invoke: Value([exact=JSString], value: "string")*/ --;
+      super
+          .foo /*invoke: Value([exact=JSString|powerset=0], value: "string", powerset: 0)*/ --;
 
-  /*member: B.returnDynamic1:[empty]*/
+  /*member: B.returnDynamic1:[empty|powerset=0]*/
   returnDynamic1() =>
-      /*invoke: Value([exact=JSString], value: "string")*/
+      /*invoke: Value([exact=JSString|powerset=0], value: "string", powerset: 0)*/
       --super.foo;
 
-  /*member: B.returnDynamic2:[empty]*/
+  /*member: B.returnDynamic2:[empty|powerset=0]*/
   returnDynamic2() =>
-      super.foo /*invoke: Value([exact=JSString], value: "string")*/ -= 42;
+      super.foo /*invoke: Value([exact=JSString|powerset=0], value: "string", powerset: 0)*/ -=
+          42;
 
-  /*member: B.returnString2:Value([exact=JSString], value: "string")*/
+  /*member: B.returnString2:Value([exact=JSString|powerset=0], value: "string", powerset: 0)*/
   returnString2() =>
-      super[index] /*invoke: Value([exact=JSString], value: "string")*/ --;
+      super[index] /*invoke: Value([exact=JSString|powerset=0], value: "string", powerset: 0)*/ --;
 
-  /*member: B.returnDynamic3:[empty]*/
+  /*member: B.returnDynamic3:[empty|powerset=0]*/
   returnDynamic3() =>
-      /*invoke: Value([exact=JSString], value: "string")*/
+      /*invoke: Value([exact=JSString|powerset=0], value: "string", powerset: 0)*/
       --super[index];
 
-  /*member: B.returnDynamic4:[empty]*/
+  /*member: B.returnDynamic4:[empty|powerset=0]*/
   returnDynamic4() =>
-      super[index] /*invoke: Value([exact=JSString], value: "string")*/ -= 42;
+      super[index] /*invoke: Value([exact=JSString|powerset=0], value: "string", powerset: 0)*/ -=
+          42;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   A()
-    .. /*invoke: [exact=A]*/ returnNum1()
-    .. /*invoke: [exact=A]*/ returnNum2()
-    .. /*invoke: [exact=A]*/ returnNum3()
-    .. /*invoke: [exact=A]*/ returnNum4()
-    .. /*invoke: [exact=A]*/ returnDynamic1()
-    .. /*invoke: [exact=A]*/ returnDynamic2()
-    .. /*invoke: [exact=A]*/ returnEmpty1()
-    .. /*invoke: [exact=A]*/ returnEmpty2()
-    .. /*invoke: [exact=A]*/ returnEmpty3();
+    .. /*invoke: [exact=A|powerset=0]*/ returnNum1()
+    .. /*invoke: [exact=A|powerset=0]*/ returnNum2()
+    .. /*invoke: [exact=A|powerset=0]*/ returnNum3()
+    .. /*invoke: [exact=A|powerset=0]*/ returnNum4()
+    .. /*invoke: [exact=A|powerset=0]*/ returnDynamic1()
+    .. /*invoke: [exact=A|powerset=0]*/ returnDynamic2()
+    .. /*invoke: [exact=A|powerset=0]*/ returnEmpty1()
+    .. /*invoke: [exact=A|powerset=0]*/ returnEmpty2()
+    .. /*invoke: [exact=A|powerset=0]*/ returnEmpty3();
 
   B()
-    .. /*invoke: [exact=B]*/ returnString1()
-    .. /*invoke: [exact=B]*/ returnString2()
-    .. /*invoke: [exact=B]*/ returnDynamic1()
-    .. /*invoke: [exact=B]*/ returnDynamic2()
-    .. /*invoke: [exact=B]*/ returnDynamic3()
-    .. /*invoke: [exact=B]*/ returnDynamic4();
+    .. /*invoke: [exact=B|powerset=0]*/ returnString1()
+    .. /*invoke: [exact=B|powerset=0]*/ returnString2()
+    .. /*invoke: [exact=B|powerset=0]*/ returnDynamic1()
+    .. /*invoke: [exact=B|powerset=0]*/ returnDynamic2()
+    .. /*invoke: [exact=B|powerset=0]*/ returnDynamic3()
+    .. /*invoke: [exact=B|powerset=0]*/ returnDynamic4();
 }
diff --git a/pkg/compiler/test/inference/data/prefix.dart b/pkg/compiler/test/inference/data/prefix.dart
index a988ffd..5d82850 100644
--- a/pkg/compiler/test/inference/data/prefix.dart
+++ b/pkg/compiler/test/inference/data/prefix.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   localPrefixInc();
   localPrefixDec();
@@ -18,78 +18,78 @@
 // Prefix increment on local variable.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: localPrefixInc:[subclass=JSUInt32]*/
+/*member: localPrefixInc:[subclass=JSUInt32|powerset=0]*/
 localPrefixInc() {
   var local;
   if (local == null) {
     local = 0;
   }
-  return /*invoke: [exact=JSUInt31]*/ ++local;
+  return /*invoke: [exact=JSUInt31|powerset=0]*/ ++local;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Prefix decrement on local variable.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: localPrefixDec:[subclass=JSInt]*/
+/*member: localPrefixDec:[subclass=JSInt|powerset=0]*/
 localPrefixDec() {
   var local;
   if (local == null) {
     local = 0;
   }
-  return /*invoke: [exact=JSUInt31]*/ --local;
+  return /*invoke: [exact=JSUInt31|powerset=0]*/ --local;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Prefix increment on static field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _staticField1:[null|subclass=JSPositiveInt]*/
+/*member: _staticField1:[null|subclass=JSPositiveInt|powerset=1]*/
 var _staticField1;
 
-/*member: staticFieldPrefixInc:[subclass=JSPositiveInt]*/
+/*member: staticFieldPrefixInc:[subclass=JSPositiveInt|powerset=0]*/
 staticFieldPrefixInc() {
   if (_staticField1 == null) {
     _staticField1 = 0;
   }
-  return /*invoke: [null|subclass=JSPositiveInt]*/ ++_staticField1;
+  return /*invoke: [null|subclass=JSPositiveInt|powerset=1]*/ ++_staticField1;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Prefix decrement on static field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _staticField2:[null|subclass=JSInt]*/
+/*member: _staticField2:[null|subclass=JSInt|powerset=1]*/
 var _staticField2;
 
-/*member: staticFieldPrefixDec:[subclass=JSInt]*/
+/*member: staticFieldPrefixDec:[subclass=JSInt|powerset=0]*/
 staticFieldPrefixDec() {
   if (_staticField2 == null) {
     _staticField2 = 0;
   }
-  return /*invoke: [null|subclass=JSInt]*/ --_staticField2;
+  return /*invoke: [null|subclass=JSInt|powerset=1]*/ --_staticField2;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Prefix increment on instance field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
-  /*member: Class1.field1:[null|subclass=JSPositiveInt]*/
+  /*member: Class1.field1:[null|subclass=JSPositiveInt|powerset=1]*/
   var field1;
 }
 
-/*member: instanceFieldPrefixInc:[subclass=JSPositiveInt]*/
+/*member: instanceFieldPrefixInc:[subclass=JSPositiveInt|powerset=0]*/
 instanceFieldPrefixInc() {
   var c = Class1();
-  if (c. /*[exact=Class1]*/ field1 == null) {
-    c. /*update: [exact=Class1]*/ field1 = 0;
+  if (c. /*[exact=Class1|powerset=0]*/ field1 == null) {
+    c. /*update: [exact=Class1|powerset=0]*/ field1 = 0;
   }
-  return /*invoke: [null|subclass=JSPositiveInt]*/ ++c
+  return /*invoke: [null|subclass=JSPositiveInt|powerset=1]*/ ++c
       .
-      /*[exact=Class1]*/
-      /*update: [exact=Class1]*/
+      /*[exact=Class1|powerset=0]*/
+      /*update: [exact=Class1|powerset=0]*/
       field1;
 }
 
@@ -97,22 +97,22 @@
 // Prefix decrement on instance field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class2.:[exact=Class2]*/
+/*member: Class2.:[exact=Class2|powerset=0]*/
 class Class2 {
-  /*member: Class2.field2:[null|subclass=JSInt]*/
+  /*member: Class2.field2:[null|subclass=JSInt|powerset=1]*/
   var field2;
 }
 
-/*member: instanceFieldPrefixDec:[subclass=JSInt]*/
+/*member: instanceFieldPrefixDec:[subclass=JSInt|powerset=0]*/
 instanceFieldPrefixDec() {
   var c = Class2();
-  if (c. /*[exact=Class2]*/ field2 == null) {
-    c. /*update: [exact=Class2]*/ field2 = 0;
+  if (c. /*[exact=Class2|powerset=0]*/ field2 == null) {
+    c. /*update: [exact=Class2|powerset=0]*/ field2 = 0;
   }
-  return /*invoke: [null|subclass=JSInt]*/ --c
+  return /*invoke: [null|subclass=JSInt|powerset=1]*/ --c
       .
-      /*[exact=Class2]*/
-      /*update: [exact=Class2]*/
+      /*[exact=Class2|powerset=0]*/
+      /*update: [exact=Class2|powerset=0]*/
       field2;
 }
 
@@ -120,22 +120,22 @@
 // Conditional prefix increment on instance field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class3.:[exact=Class3]*/
+/*member: Class3.:[exact=Class3|powerset=0]*/
 class Class3 {
-  /*member: Class3.field3:[null|subclass=JSPositiveInt]*/
+  /*member: Class3.field3:[null|subclass=JSPositiveInt|powerset=1]*/
   var field3;
 }
 
-/*member: conditionalInstanceFieldPrefixInc:[null|subclass=JSPositiveInt]*/
+/*member: conditionalInstanceFieldPrefixInc:[null|subclass=JSPositiveInt|powerset=1]*/
 conditionalInstanceFieldPrefixInc() {
   var c = Class3();
-  if (c. /*[exact=Class3]*/ field3 == null) {
-    c. /*update: [exact=Class3]*/ field3 = 0;
+  if (c. /*[exact=Class3|powerset=0]*/ field3 == null) {
+    c. /*update: [exact=Class3|powerset=0]*/ field3 = 0;
   }
-  return /*invoke: [null|subclass=JSPositiveInt]*/ ++c
+  return /*invoke: [null|subclass=JSPositiveInt|powerset=1]*/ ++c
       ?.
-      /*[exact=Class3]*/
-      /*update: [exact=Class3]*/
+      /*[exact=Class3|powerset=0]*/
+      /*update: [exact=Class3|powerset=0]*/
       field3;
 }
 
@@ -143,21 +143,21 @@
 // Conditional prefix decrement on instance field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class4.:[exact=Class4]*/
+/*member: Class4.:[exact=Class4|powerset=0]*/
 class Class4 {
-  /*member: Class4.field4:[null|subclass=JSInt]*/
+  /*member: Class4.field4:[null|subclass=JSInt|powerset=1]*/
   var field4;
 }
 
-/*member: conditionalInstanceFieldPrefixDec:[null|subclass=JSInt]*/
+/*member: conditionalInstanceFieldPrefixDec:[null|subclass=JSInt|powerset=1]*/
 conditionalInstanceFieldPrefixDec() {
   var c = Class4();
-  if (c. /*[exact=Class4]*/ field4 == null) {
-    c. /*update: [exact=Class4]*/ field4 = 0;
+  if (c. /*[exact=Class4|powerset=0]*/ field4 == null) {
+    c. /*update: [exact=Class4|powerset=0]*/ field4 = 0;
   }
-  return /*invoke: [null|subclass=JSInt]*/ --c
+  return /*invoke: [null|subclass=JSInt|powerset=1]*/ --c
       ?.
-      /*[exact=Class4]*/
-      /*update: [exact=Class4]*/
+      /*[exact=Class4|powerset=0]*/
+      /*update: [exact=Class4|powerset=0]*/
       field4;
 }
diff --git a/pkg/compiler/test/inference/data/record_1.dart b/pkg/compiler/test/inference/data/record_1.dart
index 41fb5cb..6c8bd92 100644
--- a/pkg/compiler/test/inference/data/record_1.dart
+++ b/pkg/compiler/test/inference/data/record_1.dart
@@ -2,37 +2,37 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   useRecord1();
   useRecord2();
   useRecord3();
 }
 
-/*member: getRecord1:[Record(RecordShape(2), [[exact=JSUInt31], [exact=JSUInt31]])]*/
+/*member: getRecord1:[Record(RecordShape(2), [[exact=JSUInt31|powerset=0], [exact=JSUInt31|powerset=0]], powerset: 0)]*/
 (num, num) getRecord1() => (1, 1);
-/*member: getRecord2:[Record(RecordShape(2), [Value([exact=JSBool], value: true), Value([exact=JSBool], value: false)])]*/
+/*member: getRecord2:[Record(RecordShape(2), [Value([exact=JSBool|powerset=0], value: true, powerset: 0), Value([exact=JSBool|powerset=0], value: false, powerset: 0)], powerset: 0)]*/
 (bool, bool) getRecord2() => (true, false);
-/*member: getRecord3:[Record(RecordShape(2), [Value([exact=JSString], value: "a"), Value([exact=JSString], value: "b")])]*/
+/*member: getRecord3:[Record(RecordShape(2), [Value([exact=JSString|powerset=0], value: "a", powerset: 0), Value([exact=JSString|powerset=0], value: "b", powerset: 0)], powerset: 0)]*/
 dynamic getRecord3() => ('a', 'b');
 
-/*member: useRecord1:[exact=JSUInt31]*/
+/*member: useRecord1:[exact=JSUInt31|powerset=0]*/
 useRecord1() {
   final r = getRecord1();
   return r
-      . /*[Record(RecordShape(2), [[exact=JSUInt31], [exact=JSUInt31]])]*/ $1;
+      . /*[Record(RecordShape(2), [[exact=JSUInt31|powerset=0], [exact=JSUInt31|powerset=0]], powerset: 0)]*/ $1;
 }
 
-/*member: useRecord2:Value([exact=JSBool], value: false)*/
+/*member: useRecord2:Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/
 useRecord2() {
   final r = getRecord2();
   return r
-      . /*[Record(RecordShape(2), [Value([exact=JSBool], value: true), Value([exact=JSBool], value: false)])]*/ $2;
+      . /*[Record(RecordShape(2), [Value([exact=JSBool|powerset=0], value: true, powerset: 0), Value([exact=JSBool|powerset=0], value: false, powerset: 0)], powerset: 0)]*/ $2;
 }
 
-/*member: useRecord3:Value([exact=JSString], value: "b")*/
+/*member: useRecord3:Value([exact=JSString|powerset=0], value: "b", powerset: 0)*/
 useRecord3() {
   final r = getRecord3();
   return r
-      . /*[Record(RecordShape(2), [Value([exact=JSString], value: "a"), Value([exact=JSString], value: "b")])]*/ $2;
+      . /*[Record(RecordShape(2), [Value([exact=JSString|powerset=0], value: "a", powerset: 0), Value([exact=JSString|powerset=0], value: "b", powerset: 0)], powerset: 0)]*/ $2;
 }
diff --git a/pkg/compiler/test/inference/data/record_2.dart b/pkg/compiler/test/inference/data/record_2.dart
index 2d6b5d1..22594d6 100644
--- a/pkg/compiler/test/inference/data/record_2.dart
+++ b/pkg/compiler/test/inference/data/record_2.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   useRecord1(true);
   useRecord1(false);
@@ -16,48 +16,48 @@
   useRecord5(false);
 }
 
-/*member: getRecord1:[Record(RecordShape(2), [[exact=JSUInt31], [exact=JSUInt31]])]*/
+/*member: getRecord1:[Record(RecordShape(2), [[exact=JSUInt31|powerset=0], [exact=JSUInt31|powerset=0]], powerset: 0)]*/
 (num, num) getRecord1() => (1, 1);
-/*member: getRecord2:[Record(RecordShape(2), [Value([exact=JSBool], value: true), Value([exact=JSBool], value: false)])]*/
+/*member: getRecord2:[Record(RecordShape(2), [Value([exact=JSBool|powerset=0], value: true, powerset: 0), Value([exact=JSBool|powerset=0], value: false, powerset: 0)], powerset: 0)]*/
 (bool, bool) getRecord2() => (true, false);
-/*member: getRecord3:[Record(RecordShape(2), [Value([exact=JSString], value: "a"), Container([exact=JSUnmodifiableArray], element: [empty], length: 0)])]*/
+/*member: getRecord3:[Record(RecordShape(2), [Value([exact=JSString|powerset=0], value: "a", powerset: 0), Container([exact=JSUnmodifiableArray|powerset=0], element: [empty|powerset=0], length: 0, powerset: 0)], powerset: 0)]*/
 dynamic getRecord3() => ('a', const []);
-/*member: getRecord4:[Record(RecordShape(2), [Union([exact=JSBool], [exact=JSUInt31]), Union([exact=JSBool], [exact=JSUInt31])])]*/
-dynamic getRecord4(bool /*[exact=JSBool]*/ b) =>
+/*member: getRecord4:[Record(RecordShape(2), [Union([exact=JSBool|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0), Union([exact=JSBool|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)], powerset: 0)]*/
+dynamic getRecord4(bool /*[exact=JSBool|powerset=0]*/ b) =>
     b ? getRecord1() : getRecord2();
 
-/*member: useRecord1:Union([exact=JSBool], [exact=JSUInt31])*/
-useRecord1(bool /*[exact=JSBool]*/ b) {
+/*member: useRecord1:Union([exact=JSBool|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+useRecord1(bool /*[exact=JSBool|powerset=0]*/ b) {
   final r = getRecord4(b);
   return r
-      . /*[Record(RecordShape(2), [Union([exact=JSBool], [exact=JSUInt31]), Union([exact=JSBool], [exact=JSUInt31])])]*/ $2;
+      . /*[Record(RecordShape(2), [Union([exact=JSBool|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0), Union([exact=JSBool|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)], powerset: 0)]*/ $2;
 }
 
-/*member: useRecord2:Value([exact=JSBool], value: false)*/
-useRecord2(bool /*[exact=JSBool]*/ b) {
+/*member: useRecord2:Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/
+useRecord2(bool /*[exact=JSBool|powerset=0]*/ b) {
   final r = b ? getRecord2() : getRecord2();
   return r
-      . /*[Record(RecordShape(2), [Value([exact=JSBool], value: true), Value([exact=JSBool], value: false)])]*/ $2;
+      . /*[Record(RecordShape(2), [Value([exact=JSBool|powerset=0], value: true, powerset: 0), Value([exact=JSBool|powerset=0], value: false, powerset: 0)], powerset: 0)]*/ $2;
 }
 
-/*member: useRecord3:Union([exact=JSBool], [exact=JSUInt31])*/
-useRecord3(bool /*[exact=JSBool]*/ b) {
+/*member: useRecord3:Union([exact=JSBool|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+useRecord3(bool /*[exact=JSBool|powerset=0]*/ b) {
   final r = b ? getRecord2() : getRecord1();
   return r
-      . /*[Record(RecordShape(2), [Union([exact=JSBool], [exact=JSUInt31]), Union([exact=JSBool], [exact=JSUInt31])])]*/ $2;
+      . /*[Record(RecordShape(2), [Union([exact=JSBool|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0), Union([exact=JSBool|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)], powerset: 0)]*/ $2;
 }
 
-/*member: useRecord4:Union([exact=JSBool], [exact=JSUnmodifiableArray])*/
-useRecord4(bool /*[exact=JSBool]*/ b) {
+/*member: useRecord4:Union([exact=JSBool|powerset=0], [exact=JSUnmodifiableArray|powerset=0], powerset: 0)*/
+useRecord4(bool /*[exact=JSBool|powerset=0]*/ b) {
   final r = b ? getRecord2() : getRecord3();
   return r
-      . /*[Record(RecordShape(2), [Union([exact=JSBool], [exact=JSString]), Union([exact=JSBool], [exact=JSUnmodifiableArray])])]*/ $2;
+      . /*[Record(RecordShape(2), [Union([exact=JSBool|powerset=0], [exact=JSString|powerset=0], powerset: 0), Union([exact=JSBool|powerset=0], [exact=JSUnmodifiableArray|powerset=0], powerset: 0)], powerset: 0)]*/ $2;
 }
 
-/*member: useRecord5:Union([exact=JSString], [exact=JSUInt31])*/
-useRecord5(bool /*[exact=JSBool]*/ b) {
-  final c = /*[Record(RecordShape(2), [Value([exact=JSString], value: "a"), Value([exact=JSString], value: "b")])]*/
+/*member: useRecord5:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+useRecord5(bool /*[exact=JSBool|powerset=0]*/ b) {
+  final c = /*[Record(RecordShape(2), [Value([exact=JSString|powerset=0], value: "a", powerset: 0), Value([exact=JSString|powerset=0], value: "b", powerset: 0)], powerset: 0)]*/
       () => ('a', 'b');
   return (b ? c() : (3, 4))
-      . /*[Record(RecordShape(2), [Union([exact=JSString], [exact=JSUInt31]), Union([exact=JSString], [exact=JSUInt31])])]*/ $1;
+      . /*[Record(RecordShape(2), [Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0), Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)], powerset: 0)]*/ $1;
 }
diff --git a/pkg/compiler/test/inference/data/record_3.dart b/pkg/compiler/test/inference/data/record_3.dart
index d38a6fc..c9ac5e0 100644
--- a/pkg/compiler/test/inference/data/record_3.dart
+++ b/pkg/compiler/test/inference/data/record_3.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 void main() {
   useRecords1(true);
   useRecords1(false);
@@ -20,40 +20,43 @@
   useRecords7(false);
 }
 
-/*member: getRecord1:[Record(RecordShape(3), [[exact=JSUInt31], [exact=JSUInt31], [exact=JSUInt31]])]*/
+/*member: getRecord1:[Record(RecordShape(3), [[exact=JSUInt31|powerset=0], [exact=JSUInt31|powerset=0], [exact=JSUInt31|powerset=0]], powerset: 0)]*/
 getRecord1() => (1, 2, 3);
-/*member: getRecord2:[Record(RecordShape(1), [Value([exact=JSString], value: "a")])]*/
+/*member: getRecord2:[Record(RecordShape(1), [Value([exact=JSString|powerset=0], value: "a", powerset: 0)], powerset: 0)]*/
 getRecord2() => ('a',);
-/*member: getRecord3:[Record(RecordShape(0, {age, name}), [[exact=JSUInt31], Value([exact=JSString], value: "Alice")])]*/
+/*member: getRecord3:[Record(RecordShape(0, {age, name}), [[exact=JSUInt31|powerset=0], Value([exact=JSString|powerset=0], value: "Alice", powerset: 0)], powerset: 0)]*/
 getRecord3() => (name: 'Alice', age: 28);
-/*member: getRecord4:[Record(RecordShape(0, {height, name}), [[exact=JSUInt31], Value([exact=JSString], value: "Bob")])]*/
+/*member: getRecord4:[Record(RecordShape(0, {height, name}), [[exact=JSUInt31|powerset=0], Value([exact=JSString|powerset=0], value: "Bob", powerset: 0)], powerset: 0)]*/
 getRecord4() => (name: 'Bob', height: 28);
-/*member: getUnion:Union([exact=JSString], [exact=JSUInt31])*/
-getUnion(bool /*[exact=JSBool]*/ b) => b ? 3 : 'a';
+/*member: getUnion:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+getUnion(bool /*[exact=JSBool|powerset=0]*/ b) => b ? 3 : 'a';
 
-/*member: useRecords1:Union([exact=JSString], [exact=JSUInt31])*/
-useRecords1(bool /*[exact=JSBool]*/ b) {
+/*member: useRecords1:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+useRecords1(bool /*[exact=JSBool|powerset=0]*/ b) {
   return (b ? getRecord1() : getRecord2())
-      . /*Union([exact=_Record_1], [exact=_Record_3])*/ $1;
+      . /*Union([exact=_Record_1|powerset=0], [exact=_Record_3|powerset=0], powerset: 0)*/ $1;
 }
 
-/*member: useRecords2:Union([exact=_Record_1], [exact=_Record_3])*/
-useRecords2(bool /*[exact=JSBool]*/ b) {
+/*member: useRecords2:Union([exact=_Record_1|powerset=0], [exact=_Record_3|powerset=0], powerset: 0)*/
+useRecords2(bool /*[exact=JSBool|powerset=0]*/ b) {
   return b ? getRecord1() : getRecord2();
 }
 
-/*member: useRecords3:Union([exact=_Record_1], [exact=_Record_2_age_name])*/
-useRecords3(bool /*[exact=JSBool]*/ b) {
+/*member: useRecords3:Union([exact=_Record_1|powerset=0], [exact=_Record_2_age_name|powerset=0], powerset: 0)*/
+useRecords3(bool /*[exact=JSBool|powerset=0]*/ b) {
   return b ? getRecord2() : getRecord3();
 }
 
-/*member: useRecords4:Union([exact=_Record_2_age_name], [exact=_Record_3])*/
-useRecords4(bool /*[exact=JSBool]*/ b) {
+/*member: useRecords4:Union([exact=_Record_2_age_name|powerset=0], [exact=_Record_3|powerset=0], powerset: 0)*/
+useRecords4(bool /*[exact=JSBool|powerset=0]*/ b) {
   return b ? getRecord1() : getRecord3();
 }
 
-/*member: useRecords5:Union([exact=_Record_1], [exact=_Record_2_age_name], [exact=_Record_3])*/
-useRecords5(bool /*[exact=JSBool]*/ b1, bool /*[exact=JSBool]*/ b2) {
+/*member: useRecords5:Union([exact=_Record_1|powerset=0], [exact=_Record_2_age_name|powerset=0], [exact=_Record_3|powerset=0], powerset: 0)*/
+useRecords5(
+  bool /*[exact=JSBool|powerset=0]*/ b1,
+  bool /*[exact=JSBool|powerset=0]*/ b2,
+) {
   return b1
       ? getRecord2()
       : b2
@@ -61,12 +64,12 @@
       : getRecord1();
 }
 
-/*member: useRecords6:Union([exact=_Record_2_age_name], [exact=_Record_2_height_name])*/
-useRecords6(bool /*[exact=JSBool]*/ b) {
+/*member: useRecords6:Union([exact=_Record_2_age_name|powerset=0], [exact=_Record_2_height_name|powerset=0], powerset: 0)*/
+useRecords6(bool /*[exact=JSBool|powerset=0]*/ b) {
   return b ? getRecord3() : getRecord4();
 }
 
-/*member: useRecords7:Union([exact=JSString], [exact=JSUInt31], [exact=_Record_1])*/
-useRecords7(bool /*[exact=JSBool]*/ b) {
+/*member: useRecords7:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], [exact=_Record_1|powerset=0], powerset: 0)*/
+useRecords7(bool /*[exact=JSBool|powerset=0]*/ b) {
   return b ? getUnion(b) : getRecord2();
 }
diff --git a/pkg/compiler/test/inference/data/record_4.dart b/pkg/compiler/test/inference/data/record_4.dart
index 22c2f7c..293839c 100644
--- a/pkg/compiler/test/inference/data/record_4.dart
+++ b/pkg/compiler/test/inference/data/record_4.dart
@@ -1,29 +1,29 @@
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 void main() {
   testList();
   testClosure1();
 }
 
-/*member: testList:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: null)*/
+/*member: testList:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: null, powerset: 0)*/
 testList() {
   dynamic list = [];
   final rec = (list, 3);
   final myList =
-      rec. /*[Record(RecordShape(2), [Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: null), [exact=JSUInt31]])]*/ $1;
+      rec. /*[Record(RecordShape(2), [Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: null, powerset: 0), [exact=JSUInt31|powerset=0]], powerset: 0)]*/ $1;
   myList
-      . /*invoke: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: null)*/ add(
+      . /*invoke: Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: null, powerset: 0)*/ add(
         1,
       );
   return list;
 }
 
-/*member: testClosure1:Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 2)*/
+/*member: testClosure1:Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 2, powerset: 0)*/
 testClosure1() {
   return getRecord()
-      . /*[Record(RecordShape(2), [Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 2), [exact=JSUInt31]])]*/ $1;
+      . /*[Record(RecordShape(2), [Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 2, powerset: 0), [exact=JSUInt31|powerset=0]], powerset: 0)]*/ $1;
 }
 
-/*member: getRecord:[Record(RecordShape(2), [Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 2), [exact=JSUInt31]])]*/
+/*member: getRecord:[Record(RecordShape(2), [Container([exact=JSExtendableArray|powerset=0], element: [exact=JSUInt31|powerset=0], length: 2, powerset: 0), [exact=JSUInt31|powerset=0]], powerset: 0)]*/
 getRecord() {
   return ([1, 2], 3);
 }
diff --git a/pkg/compiler/test/inference/data/redirecting_factory.dart b/pkg/compiler/test/inference/data/redirecting_factory.dart
index e19418a..817cd36 100644
--- a/pkg/compiler/test/inference/data/redirecting_factory.dart
+++ b/pkg/compiler/test/inference/data/redirecting_factory.dart
@@ -3,16 +3,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class B implements A {
-  /*member: B.foo:[exact=B]*/
-  B.foo([int? /*[null]*/ x]);
+  /*member: B.foo:[exact=B|powerset=0]*/
+  B.foo([int? /*[null|powerset=1]*/ x]);
 }
 
 class A {
-  /*member: A._#foo#tearOff:[exact=B]*/
-  factory A.foo([int /*[null]*/ x]) = B.foo;
+  /*member: A._#foo#tearOff:[exact=B|powerset=0]*/
+  factory A.foo([int /*[null|powerset=1]*/ x]) = B.foo;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 void main() {
   final f = A.foo;
   f();
diff --git a/pkg/compiler/test/inference/data/refine_captured_locals.dart b/pkg/compiler/test/inference/data/refine_captured_locals.dart
index 466cd04..6eba60d 100644
--- a/pkg/compiler/test/inference/data/refine_captured_locals.dart
+++ b/pkg/compiler/test/inference/data/refine_captured_locals.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   refineBeforeCapture();
   refineAfterCapture();
@@ -14,23 +14,23 @@
 // Refine a local before it has been captured.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
-  /*member: Class1.method1:[null]*/
+  /*member: Class1.method1:[null|powerset=1]*/
   method1() {}
 }
 
-/*member: _refineBeforeCapture:[exact=Class1]*/
-_refineBeforeCapture(/*[null|exact=Class1]*/ o) {
-  o. /*invoke: [null|exact=Class1]*/ method1();
-  o. /*invoke: [exact=Class1]*/ method1();
+/*member: _refineBeforeCapture:[exact=Class1|powerset=0]*/
+_refineBeforeCapture(/*[null|exact=Class1|powerset=1]*/ o) {
+  o. /*invoke: [null|exact=Class1|powerset=1]*/ method1();
+  o. /*invoke: [exact=Class1|powerset=0]*/ method1();
 
-  /*[exact=Class1]*/
+  /*[exact=Class1|powerset=0]*/
   localFunction() => o;
   return localFunction();
 }
 
-/*member: refineBeforeCapture:[null]*/
+/*member: refineBeforeCapture:[null|powerset=1]*/
 refineBeforeCapture() {
   _refineBeforeCapture(new Class1());
   _refineBeforeCapture(null);
@@ -40,27 +40,29 @@
 // Refine a local after it has been captured.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class3.:[exact=Class3]*/
+/*member: Class3.:[exact=Class3|powerset=0]*/
 class Class3 {
-  /*member: Class3.method3:[null]*/
+  /*member: Class3.method3:[null|powerset=1]*/
   method3() {}
 }
 
-/*member: Class4.:[exact=Class4]*/
+/*member: Class4.:[exact=Class4|powerset=0]*/
 class Class4 {}
 
-/*member: _refineAfterCapture:Union([exact=Class3], [exact=Class4])*/
-_refineAfterCapture(/*Union([exact=Class3], [exact=Class4])*/ o) {
-  /*Union([exact=Class3], [exact=Class4])*/
+/*member: _refineAfterCapture:Union([exact=Class3|powerset=0], [exact=Class4|powerset=0], powerset: 0)*/
+_refineAfterCapture(
+  /*Union([exact=Class3|powerset=0], [exact=Class4|powerset=0], powerset: 0)*/ o,
+) {
+  /*Union([exact=Class3|powerset=0], [exact=Class4|powerset=0], powerset: 0)*/
   localFunction() => o;
 
-  o. /*invoke: Union([exact=Class3], [exact=Class4])*/ method3();
-  o. /*invoke: Union([exact=Class3], [exact=Class4])*/ method3();
+  o. /*invoke: Union([exact=Class3|powerset=0], [exact=Class4|powerset=0], powerset: 0)*/ method3();
+  o. /*invoke: Union([exact=Class3|powerset=0], [exact=Class4|powerset=0], powerset: 0)*/ method3();
 
   return localFunction();
 }
 
-/*member: refineAfterCapture:[null]*/
+/*member: refineAfterCapture:[null|powerset=1]*/
 refineAfterCapture() {
   _refineAfterCapture(new Class3());
   _refineAfterCapture(new Class4());
@@ -70,31 +72,33 @@
 // Refine a local after it has been captured in a nested local function.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class5.:[exact=Class5]*/
+/*member: Class5.:[exact=Class5|powerset=0]*/
 class Class5 {
-  /*member: Class5.method5:[null]*/
+  /*member: Class5.method5:[null|powerset=1]*/
   method5() {}
 }
 
-/*member: Class6.:[exact=Class6]*/
+/*member: Class6.:[exact=Class6|powerset=0]*/
 class Class6 {}
 
-/*member: _refineAfterNestedCapture:Union([exact=Class5], [exact=Class6])*/
-_refineAfterNestedCapture(/*Union([exact=Class5], [exact=Class6])*/ o) {
-  /*Union([exact=Class5], [exact=Class6])*/
+/*member: _refineAfterNestedCapture:Union([exact=Class5|powerset=0], [exact=Class6|powerset=0], powerset: 0)*/
+_refineAfterNestedCapture(
+  /*Union([exact=Class5|powerset=0], [exact=Class6|powerset=0], powerset: 0)*/ o,
+) {
+  /*Union([exact=Class5|powerset=0], [exact=Class6|powerset=0], powerset: 0)*/
   localFunction() {
-    /*Union([exact=Class5], [exact=Class6])*/
+    /*Union([exact=Class5|powerset=0], [exact=Class6|powerset=0], powerset: 0)*/
     nestedFunction() => o;
     return nestedFunction();
   }
 
-  o. /*invoke: Union([exact=Class5], [exact=Class6])*/ method5();
-  o. /*invoke: Union([exact=Class5], [exact=Class6])*/ method5();
+  o. /*invoke: Union([exact=Class5|powerset=0], [exact=Class6|powerset=0], powerset: 0)*/ method5();
+  o. /*invoke: Union([exact=Class5|powerset=0], [exact=Class6|powerset=0], powerset: 0)*/ method5();
 
   return localFunction();
 }
 
-/*member: refineAfterNestedCapture:[null]*/
+/*member: refineAfterNestedCapture:[null|powerset=1]*/
 refineAfterNestedCapture() {
   _refineAfterNestedCapture(new Class5());
   _refineAfterNestedCapture(new Class6());
@@ -104,24 +108,28 @@
 // Refine a local in a local function after it has been captured.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class7.:[exact=Class7]*/
+/*member: Class7.:[exact=Class7|powerset=0]*/
 class Class7 {
-  /*member: Class7.method7:[null]*/
+  /*member: Class7.method7:[null|powerset=1]*/
   method7() {}
 }
 
-/*member: Class8.:[exact=Class8]*/
+/*member: Class8.:[exact=Class8|powerset=0]*/
 class Class8 {}
 
-/*member: _refineAfterCaptureInNested:Union([exact=Class7], [exact=Class8])*/
-_refineAfterCaptureInNested(/*Union([exact=Class7], [exact=Class8])*/ o) {
-  /*Union([exact=Class7], [exact=Class8])*/
-  localFunction(/*Union([exact=Class7], [exact=Class8])*/ p) {
-    /*Union([exact=Class7], [exact=Class8])*/
+/*member: _refineAfterCaptureInNested:Union([exact=Class7|powerset=0], [exact=Class8|powerset=0], powerset: 0)*/
+_refineAfterCaptureInNested(
+  /*Union([exact=Class7|powerset=0], [exact=Class8|powerset=0], powerset: 0)*/ o,
+) {
+  /*Union([exact=Class7|powerset=0], [exact=Class8|powerset=0], powerset: 0)*/
+  localFunction(
+    /*Union([exact=Class7|powerset=0], [exact=Class8|powerset=0], powerset: 0)*/ p,
+  ) {
+    /*Union([exact=Class7|powerset=0], [exact=Class8|powerset=0], powerset: 0)*/
     nestedFunction() => p;
 
-    p. /*invoke: Union([exact=Class7], [exact=Class8])*/ method7();
-    p. /*invoke: Union([exact=Class7], [exact=Class8])*/ method7();
+    p. /*invoke: Union([exact=Class7|powerset=0], [exact=Class8|powerset=0], powerset: 0)*/ method7();
+    p. /*invoke: Union([exact=Class7|powerset=0], [exact=Class8|powerset=0], powerset: 0)*/ method7();
 
     return nestedFunction();
   }
@@ -129,7 +137,7 @@
   return localFunction(o);
 }
 
-/*member: refineAfterCaptureInNested:[null]*/
+/*member: refineAfterCaptureInNested:[null|powerset=1]*/
 refineAfterCaptureInNested() {
   _refineAfterCaptureInNested(new Class7());
   _refineAfterCaptureInNested(new Class8());
diff --git a/pkg/compiler/test/inference/data/refine_locals.dart b/pkg/compiler/test/inference/data/refine_locals.dart
index 4e8d40d8..b732140 100644
--- a/pkg/compiler/test/inference/data/refine_locals.dart
+++ b/pkg/compiler/test/inference/data/refine_locals.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   refineToClass();
   refineToClosure();
@@ -13,96 +13,98 @@
 // accesses and updates.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
-  /*member: Class1.method0:[null]*/
+  /*member: Class1.method0:[null|powerset=1]*/
   method0() {}
-  /*member: Class1.method1:[null]*/
+  /*member: Class1.method1:[null|powerset=1]*/
   method1() {}
-  /*member: Class1.field0:[null|exact=JSUInt31]*/
+  /*member: Class1.field0:[null|exact=JSUInt31|powerset=1]*/
   var field0;
-  /*member: Class1.field1:[null|exact=JSUInt31]*/
+  /*member: Class1.field1:[null|exact=JSUInt31|powerset=1]*/
   var field1;
 }
 
-/*member: Class2.:[exact=Class2]*/
+/*member: Class2.:[exact=Class2|powerset=0]*/
 class Class2 {
-  /*member: Class2.method0:[null]*/
+  /*member: Class2.method0:[null|powerset=1]*/
   method0() {}
-  /*member: Class2.method2:[null]*/
+  /*member: Class2.method2:[null|powerset=1]*/
   method2() {}
-  /*member: Class2.field0:[null]*/
+  /*member: Class2.field0:[null|powerset=1]*/
   var field0;
-  /*member: Class2.field2:[null]*/
+  /*member: Class2.field2:[null|powerset=1]*/
   var field2;
 }
 
-/*member: _refineUnion:Union([exact=Class1], [exact=Class2])*/
-_refineUnion(/*Union(null, [exact=Class1], [exact=Class2])*/ o) {
-  o. /*invoke: Union(null, [exact=Class1], [exact=Class2])*/ method0();
-  o. /*invoke: Union([exact=Class1], [exact=Class2])*/ method1();
-  o. /*invoke: Union([exact=Class1], [exact=Class2])*/ method2();
+/*member: _refineUnion:Union([exact=Class1|powerset=0], [exact=Class2|powerset=0], powerset: 0)*/
+_refineUnion(
+  /*Union(null, [exact=Class1|powerset=0], [exact=Class2|powerset=0], powerset: 1)*/ o,
+) {
+  o. /*invoke: Union(null, [exact=Class1|powerset=0], [exact=Class2|powerset=0], powerset: 1)*/ method0();
+  o. /*invoke: Union([exact=Class1|powerset=0], [exact=Class2|powerset=0], powerset: 0)*/ method1();
+  o. /*invoke: Union([exact=Class1|powerset=0], [exact=Class2|powerset=0], powerset: 0)*/ method2();
   return o;
 }
 
-/*member: _refineFromMethod:[exact=Class1]*/
-_refineFromMethod(/*[null|exact=Class1]*/ o) {
-  o. /*invoke: [null|exact=Class1]*/ method0();
-  o. /*invoke: [exact=Class1]*/ method1();
+/*member: _refineFromMethod:[exact=Class1|powerset=0]*/
+_refineFromMethod(/*[null|exact=Class1|powerset=1]*/ o) {
+  o. /*invoke: [null|exact=Class1|powerset=1]*/ method0();
+  o. /*invoke: [exact=Class1|powerset=0]*/ method1();
   return o;
 }
 
-/*member: _refineFromGetter:[exact=Class2]*/
-_refineFromGetter(/*[null|exact=Class2]*/ o) {
-  o. /*[null|exact=Class2]*/ field0;
-  o. /*[exact=Class2]*/ field2;
+/*member: _refineFromGetter:[exact=Class2|powerset=0]*/
+_refineFromGetter(/*[null|exact=Class2|powerset=1]*/ o) {
+  o. /*[null|exact=Class2|powerset=1]*/ field0;
+  o. /*[exact=Class2|powerset=0]*/ field2;
   return o;
 }
 
-/*member: _refineFromSetter:[exact=Class1]*/
-_refineFromSetter(/*[null|exact=Class1]*/ o) {
-  o. /*update: [null|exact=Class1]*/ field0 = 0;
-  o. /*update: [exact=Class1]*/ field1 = 0;
+/*member: _refineFromSetter:[exact=Class1|powerset=0]*/
+_refineFromSetter(/*[null|exact=Class1|powerset=1]*/ o) {
+  o. /*update: [null|exact=Class1|powerset=1]*/ field0 = 0;
+  o. /*update: [exact=Class1|powerset=0]*/ field1 = 0;
   return o;
 }
 
-/*member: _noRefinementNullAware:[null|exact=Class1]*/
-_noRefinementNullAware(/*[null|exact=Class1]*/ o) {
+/*member: _noRefinementNullAware:[null|exact=Class1|powerset=1]*/
+_noRefinementNullAware(/*[null|exact=Class1|powerset=1]*/ o) {
   o
       ?.
-      /*invoke: [exact=Class1]*/
+      /*invoke: [exact=Class1|powerset=0]*/
       method1();
   return o;
 }
 
-/*member: _noRefinementNullSelectors:[exact=Class2]*/
-_noRefinementNullSelectors(/*[null|exact=Class2]*/ o) {
-  o /*invoke: [null|exact=Class2]*/ == 2;
-  o. /*[null|exact=Class2]*/ hashCode;
-  o. /*[null|exact=Class2]*/ runtimeType;
-  o. /*[null|exact=Class2]*/ toString;
-  o. /*[null|exact=Class2]*/ noSuchMethod;
-  o. /*invoke: [null|exact=Class2]*/ toString();
-  o. /*invoke: [null|exact=Class2]*/ noSuchMethod(
+/*member: _noRefinementNullSelectors:[exact=Class2|powerset=0]*/
+_noRefinementNullSelectors(/*[null|exact=Class2|powerset=1]*/ o) {
+  o /*invoke: [null|exact=Class2|powerset=1]*/ == 2;
+  o. /*[null|exact=Class2|powerset=1]*/ hashCode;
+  o. /*[null|exact=Class2|powerset=1]*/ runtimeType;
+  o. /*[null|exact=Class2|powerset=1]*/ toString;
+  o. /*[null|exact=Class2|powerset=1]*/ noSuchMethod;
+  o. /*invoke: [null|exact=Class2|powerset=1]*/ toString();
+  o. /*invoke: [null|exact=Class2|powerset=1]*/ noSuchMethod(
     null as dynamic,
   ); // assumed to throw.
-  o. /*[exact=Class2]*/ toString;
+  o. /*[exact=Class2|powerset=0]*/ toString;
   return o;
 }
 
-/*member: _noRefinementUpdatedVariable:[null|exact=Class1]*/
-_noRefinementUpdatedVariable(/*[null|exact=Class1]*/ o) {
-  (o = o). /*invoke: [null|exact=Class1]*/ method1();
-  (o = o). /*invoke: [null|exact=Class1]*/ method0();
+/*member: _noRefinementUpdatedVariable:[null|exact=Class1|powerset=1]*/
+_noRefinementUpdatedVariable(/*[null|exact=Class1|powerset=1]*/ o) {
+  (o = o). /*invoke: [null|exact=Class1|powerset=1]*/ method1();
+  (o = o). /*invoke: [null|exact=Class1|powerset=1]*/ method0();
   return o;
 }
 
-/*member: _condition:Value([exact=JSBool], value: false)*/
+/*member: _condition:Value([exact=JSBool|powerset=0], value: false, powerset: 0)*/
 @pragma('dart2js:assumeDynamic')
 @pragma('dart2js:noInline')
 get _condition => false;
 
-/*member: refineToClass:[null]*/
+/*member: refineToClass:[null|powerset=1]*/
 refineToClass() {
   var nullOrClass1 = _condition ? null : Class1();
   var nullOrClass2 = _condition ? null : Class2();
@@ -121,21 +123,21 @@
 // Refine the type of a local variable through a sequence of invocations.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _refineToClosureLocal:[subclass=Closure]*/
+/*member: _refineToClosureLocal:[subclass=Closure|powerset=0]*/
 _refineToClosureLocal() {
-  var f = /*[null]*/ ({/*[exact=JSUInt31]*/ a}) {};
+  var f = /*[null|powerset=1]*/ ({/*[exact=JSUInt31|powerset=0]*/ a}) {};
   f(a: 0);
   return f;
 }
 
-/*member: _refineToClosureLocalCall:[subclass=Closure]*/
+/*member: _refineToClosureLocalCall:[subclass=Closure|powerset=0]*/
 _refineToClosureLocalCall() {
-  var f = /*[null]*/ ({/*[exact=JSUInt31]*/ b}) {};
+  var f = /*[null|powerset=1]*/ ({/*[exact=JSUInt31|powerset=0]*/ b}) {};
   f.call(b: 0);
   return f;
 }
 
-/*member: refineToClosure:[null]*/
+/*member: refineToClosure:[null|powerset=1]*/
 refineToClosure() {
   _refineToClosureLocal();
   _refineToClosureLocalCall();
diff --git a/pkg/compiler/test/inference/data/refine_order.dart b/pkg/compiler/test/inference/data/refine_order.dart
index b32dfd6..33175d2 100644
--- a/pkg/compiler/test/inference/data/refine_order.dart
+++ b/pkg/compiler/test/inference/data/refine_order.dart
@@ -2,16 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: Class.:[exact=Class]*/
+/*member: Class.:[exact=Class|powerset=0]*/
 class Class {
-  /*member: Class.field:[exact=JSUInt31]*/
+  /*member: Class.field:[exact=JSUInt31|powerset=0]*/
   var field = 42;
 
-  /*member: Class.method:[null]*/
-  method([/*[null|exact=JSUInt31]*/ a, /*[null|exact=JSUInt31]*/ b]) {}
+  /*member: Class.method:[null|powerset=1]*/
+  method([
+    /*[null|exact=JSUInt31|powerset=1]*/ a,
+    /*[null|exact=JSUInt31|powerset=1]*/ b,
+  ]) {}
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   Class();
   statementOrderFieldAccess(null);
@@ -31,129 +34,133 @@
 // Accesses in statements.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: statementOrderFieldAccess:[null]*/
+/*member: statementOrderFieldAccess:[null|powerset=1]*/
 @pragma('dart2js:assumeDynamic')
-statementOrderFieldAccess(/*[null|subclass=Object]*/ o) {
+statementOrderFieldAccess(/*[null|subclass=Object|powerset=1]*/ o) {
   o.field;
-  o. /*[subclass=Object]*/ field;
+  o. /*[subclass=Object|powerset=0]*/ field;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Updates in statements.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: statementOrderFieldUpdate:[null]*/
+/*member: statementOrderFieldUpdate:[null|powerset=1]*/
 @pragma('dart2js:assumeDynamic')
-statementOrderFieldUpdate(/*[null|subclass=Object]*/ o) {
+statementOrderFieldUpdate(/*[null|subclass=Object|powerset=1]*/ o) {
   o.field = 42;
-  o. /*update: [subclass=Object]*/ field = 42;
+  o. /*update: [subclass=Object|powerset=0]*/ field = 42;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Invocations in statements.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: statementOrderInvocation:[null]*/
+/*member: statementOrderInvocation:[null|powerset=1]*/
 @pragma('dart2js:assumeDynamic')
-statementOrderInvocation(/*[null|subclass=Object]*/ o) {
+statementOrderInvocation(/*[null|subclass=Object|powerset=1]*/ o) {
   o.method(null);
-  o. /*invoke: [subclass=Object]*/ method(null);
+  o. /*invoke: [subclass=Object|powerset=0]*/ method(null);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Access in argument before method call.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: receiverVsArgument:[null]*/
+/*member: receiverVsArgument:[null|powerset=1]*/
 @pragma('dart2js:assumeDynamic')
-receiverVsArgument(/*[null|subclass=Object]*/ o) {
+receiverVsArgument(/*[null|subclass=Object|powerset=1]*/ o) {
   // TODO(johnniwinther): The arguments should refine the receiver.
   o.method(o.field);
-  o. /*[subclass=Object]*/ field;
+  o. /*[subclass=Object|powerset=0]*/ field;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Access in multiple arguments.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: argumentsOrder:[null]*/
+/*member: argumentsOrder:[null|powerset=1]*/
 @pragma('dart2js:assumeDynamic')
-argumentsOrder(/*[null|subclass=Object]*/ o) {
+argumentsOrder(/*[null|subclass=Object|powerset=1]*/ o) {
   // TODO(johnniwinther): The arguments should refine the receiver.
-  o.method(o.field, o. /*[subclass=Object]*/ field);
-  o. /*[subclass=Object]*/ field;
+  o.method(o.field, o. /*[subclass=Object|powerset=0]*/ field);
+  o. /*[subclass=Object|powerset=0]*/ field;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Access in both sides of an operator call.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: operatorOrder:[null]*/
+/*member: operatorOrder:[null|powerset=1]*/
 @pragma('dart2js:assumeDynamic')
-operatorOrder(/*[null|subclass=Object]*/ o) {
-  o.field /*invoke: [exact=JSUInt31]*/ < o. /*[subclass=Object]*/ field;
-  o. /*[subclass=Object]*/ field;
+operatorOrder(/*[null|subclass=Object|powerset=1]*/ o) {
+  o.field /*invoke: [exact=JSUInt31|powerset=0]*/ <
+      o. /*[subclass=Object|powerset=0]*/ field;
+  o. /*[subclass=Object|powerset=0]*/ field;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Assign after access in right-hand side.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: updateVsRhs:[null]*/
+/*member: updateVsRhs:[null|powerset=1]*/
 @pragma('dart2js:assumeDynamic')
-updateVsRhs(/*[null|subclass=Object]*/ o) {
+updateVsRhs(/*[null|subclass=Object|powerset=1]*/ o) {
   // TODO(johnniwinther): The right-hand side should refine the left-hand side
   // receiver.
   o.field = o.field;
-  o. /*[subclass=Object]*/ field;
+  o. /*[subclass=Object|powerset=0]*/ field;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Access in both sides of a logical or.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: logicalOr:[null]*/
+/*member: logicalOr:[null|powerset=1]*/
 @pragma('dart2js:assumeDynamic')
-logicalOr(/*[null|subclass=Object]*/ o) {
-  o.field || o. /*[subclass=Object]*/ field;
-  o. /*[subclass=Object]*/ field;
+logicalOr(/*[null|subclass=Object|powerset=1]*/ o) {
+  o.field || o. /*[subclass=Object|powerset=0]*/ field;
+  o. /*[subclass=Object|powerset=0]*/ field;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Access in condition of a conditional expression.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: conditionalCondition:[null]*/
+/*member: conditionalCondition:[null|powerset=1]*/
 @pragma('dart2js:assumeDynamic')
-conditionalCondition(/*[null|subclass=Object]*/ o) {
-  o.field ? o. /*[subclass=Object]*/ field : o. /*[subclass=Object]*/ field;
-  o. /*[subclass=Object]*/ field;
+conditionalCondition(/*[null|subclass=Object|powerset=1]*/ o) {
+  o.field
+      ? o. /*[subclass=Object|powerset=0]*/ field
+      : o. /*[subclass=Object|powerset=0]*/ field;
+  o. /*[subclass=Object|powerset=0]*/ field;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Access both branches of a conditional expression.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _#flag:[exact=_Cell]*/
-late bool /*Value([exact=JSBool], value: true)*/ /*update: [exact=_Cell]*/ flag;
+/*member: _#flag:[exact=_Cell|powerset=0]*/
+late bool /*Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/ /*update: [exact=_Cell|powerset=0]*/
+flag;
 
-/*member: conditionalBothBranches:[null]*/
+/*member: conditionalBothBranches:[null|powerset=1]*/
 @pragma('dart2js:assumeDynamic')
-conditionalBothBranches(/*[null|subclass=Object]*/ o) {
+conditionalBothBranches(/*[null|subclass=Object|powerset=1]*/ o) {
   // ignore: DEAD_CODE
   (flag = true) ? o.field : o.field;
-  o. /*[subclass=Object]*/ field;
+  o. /*[subclass=Object|powerset=0]*/ field;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Access in only one branch of a conditional expression.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: conditionalOneBranchOnly:[null]*/
+/*member: conditionalOneBranchOnly:[null|powerset=1]*/
 @pragma('dart2js:assumeDynamic')
-conditionalOneBranchOnly(/*[null|subclass=Object]*/ o) {
+conditionalOneBranchOnly(/*[null|subclass=Object|powerset=1]*/ o) {
   // ignore: DEAD_CODE
   (flag = true) ? o.field : null;
   o.field;
-  o. /*[subclass=Object]*/ field;
+  o. /*[subclass=Object|powerset=0]*/ field;
 }
diff --git a/pkg/compiler/test/inference/data/return.dart b/pkg/compiler/test/inference/data/return.dart
index 01a574f..389ed5b 100644
--- a/pkg/compiler/test/inference/data/return.dart
+++ b/pkg/compiler/test/inference/data/return.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   return null;
 }
diff --git a/pkg/compiler/test/inference/data/shift_right_unsigned.dart b/pkg/compiler/test/inference/data/shift_right_unsigned.dart
index 22132d2..2c05a40 100644
--- a/pkg/compiler/test/inference/data/shift_right_unsigned.dart
+++ b/pkg/compiler/test/inference/data/shift_right_unsigned.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   g1 = -1;
   g1 = 2;
@@ -12,27 +12,27 @@
   test4();
 }
 
-/*member: g1:[subclass=JSInt]*/
+/*member: g1:[subclass=JSInt|powerset=0]*/
 int g1 = 0;
 
-/*member: test1:[exact=JSUInt31]*/
+/*member: test1:[exact=JSUInt31|powerset=0]*/
 test1() {
   int a = 1234;
   int b = 2;
-  return a /*invoke: [exact=JSUInt31]*/ >>> b;
+  return a /*invoke: [exact=JSUInt31|powerset=0]*/ >>> b;
 }
 
-/*member: test2:[subclass=JSUInt32]*/
+/*member: test2:[subclass=JSUInt32|powerset=0]*/
 test2() {
-  return g1 /*invoke: [subclass=JSInt]*/ >>> g1;
+  return g1 /*invoke: [subclass=JSInt|powerset=0]*/ >>> g1;
 }
 
-/*member: test3:[subclass=JSUInt32]*/
+/*member: test3:[subclass=JSUInt32|powerset=0]*/
 test3() {
-  return g1 /*invoke: [subclass=JSInt]*/ >>> 1;
+  return g1 /*invoke: [subclass=JSInt|powerset=0]*/ >>> 1;
 }
 
-/*member: test4:[exact=JSUInt31]*/
+/*member: test4:[exact=JSUInt31|powerset=0]*/
 test4() {
-  return 10 /*invoke: [exact=JSUInt31]*/ >>> g1;
+  return 10 /*invoke: [exact=JSUInt31|powerset=0]*/ >>> g1;
 }
diff --git a/pkg/compiler/test/inference/data/simple.dart b/pkg/compiler/test/inference/data/simple.dart
index 47b8c18..04231a0 100644
--- a/pkg/compiler/test/inference/data/simple.dart
+++ b/pkg/compiler/test/inference/data/simple.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   zero();
   one();
@@ -28,84 +28,84 @@
 /// Return a zero integer literal.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: zero:[exact=JSUInt31]*/
+/*member: zero:[exact=JSUInt31|powerset=0]*/
 zero() => 0;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return a positive integer literal.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: one:[exact=JSUInt31]*/
+/*member: one:[exact=JSUInt31|powerset=0]*/
 one() => 1;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return a double literal.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: half:[exact=JSNumNotInt]*/
+/*member: half:[exact=JSNumNotInt|powerset=0]*/
 half() => 0.5;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return an integer valued zero double literal.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: zeroPointZero:[exact=JSUInt31]*/
+/*member: zeroPointZero:[exact=JSUInt31|powerset=0]*/
 zeroPointZero() => 0.0;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return an integer valued double literal.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: onePointZero:[exact=JSUInt31]*/
+/*member: onePointZero:[exact=JSUInt31|powerset=0]*/
 onePointZero() => 1.0;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return a >31bit integer literal.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: large:[subclass=JSUInt32]*/
+/*member: large:[subclass=JSUInt32|powerset=0]*/
 large() => 2147483648;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return a >32bit integer literal.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: huge:[subclass=JSPositiveInt]*/
+/*member: huge:[subclass=JSPositiveInt|powerset=0]*/
 huge() => 4294967296;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return a negative integer literal.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: minusOne:[subclass=JSInt]*/
+/*member: minusOne:[subclass=JSInt|powerset=0]*/
 minusOne() => -1;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return a negative double literal.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: minusHalf:[exact=JSNumNotInt]*/
+/*member: minusHalf:[exact=JSNumNotInt|powerset=0]*/
 minusHalf() => -0.5;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return an empty string.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: emptyString:Value([exact=JSString], value: "")*/
+/*member: emptyString:Value([exact=JSString|powerset=0], value: "", powerset: 0)*/
 emptyString() => '';
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return a non-empty string.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: nonEmptyString:Value([exact=JSString], value: "foo")*/
+/*member: nonEmptyString:Value([exact=JSString|powerset=0], value: "foo", powerset: 0)*/
 nonEmptyString() => 'foo';
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return a string juxtaposition.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: stringJuxtaposition:Value([exact=JSString], value: "foobar")*/
+/*member: stringJuxtaposition:Value([exact=JSString|powerset=0], value: "foobar", powerset: 0)*/
 stringJuxtaposition() =>
     'foo'
     'bar';
@@ -114,29 +114,29 @@
 /// Return a string constant interpolation.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: stringConstantInterpolation:Value([exact=JSString], value: "foobar")*/
+/*member: stringConstantInterpolation:Value([exact=JSString|powerset=0], value: "foobar", powerset: 0)*/
 stringConstantInterpolation() => 'foo${'bar'}';
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return a string non-constant interpolation.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _method1:[exact=JSBool]*/
-_method1(/*[exact=JSBool]*/ c) => c;
+/*member: _method1:[exact=JSBool|powerset=0]*/
+_method1(/*[exact=JSBool|powerset=0]*/ c) => c;
 
-/*member: stringNonConstantInterpolation:[exact=JSString]*/
+/*member: stringNonConstantInterpolation:[exact=JSString|powerset=0]*/
 stringNonConstantInterpolation() => 'foo${_method1(true)}${_method1(false)}';
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return a symbol literal.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: symbolLiteral:[exact=Symbol]*/
+/*member: symbolLiteral:[exact=Symbol|powerset=0]*/
 symbolLiteral() => #main;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Return a type literal.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: typeLiteral:[exact=_Type]*/
+/*member: typeLiteral:[exact=_Type|powerset=0]*/
 typeLiteral() => Object;
diff --git a/pkg/compiler/test/inference/data/static.dart b/pkg/compiler/test/inference/data/static.dart
index 5dcc120..cee7783 100644
--- a/pkg/compiler/test/inference/data/static.dart
+++ b/pkg/compiler/test/inference/data/static.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   simpleStaticCall();
   staticCallWithPositionalArguments1();
@@ -39,10 +39,10 @@
 /// Call a static method that has a constant return value.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: simpleStaticCall:[exact=JSUInt31]*/
+/*member: simpleStaticCall:[exact=JSUInt31|powerset=0]*/
 simpleStaticCall() => _returnInt();
 
-/*member: _returnInt:[exact=JSUInt31]*/
+/*member: _returnInt:[exact=JSUInt31|powerset=0]*/
 _returnInt() => 0;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -50,162 +50,168 @@
 /// is returned.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: staticCallWithPositionalArguments1:[exact=JSUInt31]*/
+/*member: staticCallWithPositionalArguments1:[exact=JSUInt31|powerset=0]*/
 staticCallWithPositionalArguments1() => _returnFirst(0, 0.5);
 
-/*member: _returnFirst:[exact=JSUInt31]*/
-_returnFirst(/*[exact=JSUInt31]*/ a, /*[exact=JSNumNotInt]*/ b) => a;
+/*member: _returnFirst:[exact=JSUInt31|powerset=0]*/
+_returnFirst(
+  /*[exact=JSUInt31|powerset=0]*/ a,
+  /*[exact=JSNumNotInt|powerset=0]*/ b,
+) => a;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Call a static method that has two positional parameters, the second argument
 /// is returned.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: staticCallWithPositionalArguments2:[exact=JSNumNotInt]*/
+/*member: staticCallWithPositionalArguments2:[exact=JSNumNotInt|powerset=0]*/
 staticCallWithPositionalArguments2() => _returnSecond(0, 0.5);
 
-/*member: _returnSecond:[exact=JSNumNotInt]*/
-_returnSecond(/*[exact=JSUInt31]*/ a, /*[exact=JSNumNotInt]*/ b) => b;
+/*member: _returnSecond:[exact=JSNumNotInt|powerset=0]*/
+_returnSecond(
+  /*[exact=JSUInt31|powerset=0]*/ a,
+  /*[exact=JSNumNotInt|powerset=0]*/ b,
+) => b;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// A static method that has an optional parameter with no explicit default
 /// value. Only one call site with no arguments.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: staticCallWithOptionalArguments1:[null]*/
+/*member: staticCallWithOptionalArguments1:[null|powerset=1]*/
 staticCallWithOptionalArguments1() => _returnDefaultNull();
 
-/*member: _returnDefaultNull:[null]*/
-_returnDefaultNull([/*[null]*/ a]) => a;
+/*member: _returnDefaultNull:[null|powerset=1]*/
+_returnDefaultNull([/*[null|powerset=1]*/ a]) => a;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// A static method that has an optional parameter with an explicit default
 /// value of `null`. Only one call site with no arguments.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: staticCallWithOptionalArguments2:[null]*/
+/*member: staticCallWithOptionalArguments2:[null|powerset=1]*/
 staticCallWithOptionalArguments2() => _returnDefaultNullExplicit();
 
-/*member: _returnDefaultNullExplicit:[null]*/
-_returnDefaultNullExplicit([/*[null]*/ a = null]) => a;
+/*member: _returnDefaultNullExplicit:[null|powerset=1]*/
+_returnDefaultNullExplicit([/*[null|powerset=1]*/ a = null]) => a;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// A static method that has an optional parameter. Only one call site with an
 /// explicit argument.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: staticCallWithOptionalArguments3:[exact=JSUInt31]*/
+/*member: staticCallWithOptionalArguments3:[exact=JSUInt31|powerset=0]*/
 staticCallWithOptionalArguments3() => _returnDefaultNullCalled(0);
 
-/*member: _returnDefaultNullCalled:[exact=JSUInt31]*/
-_returnDefaultNullCalled([/*[exact=JSUInt31]*/ a]) => a;
+/*member: _returnDefaultNullCalled:[exact=JSUInt31|powerset=0]*/
+_returnDefaultNullCalled([/*[exact=JSUInt31|powerset=0]*/ a]) => a;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// A static method that has an optional parameter. Two call sites, one
 /// with an explicit argument and one with no arguments.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: staticCallWithOptionalArguments4a:[null|exact=JSUInt31]*/
+/*member: staticCallWithOptionalArguments4a:[null|exact=JSUInt31|powerset=1]*/
 staticCallWithOptionalArguments4a() => _returnDefaultNullCalledTwice();
 
-/*member: staticCallWithOptionalArguments4b:[null|exact=JSUInt31]*/
+/*member: staticCallWithOptionalArguments4b:[null|exact=JSUInt31|powerset=1]*/
 staticCallWithOptionalArguments4b() => _returnDefaultNullCalledTwice(0);
 
-/*member: _returnDefaultNullCalledTwice:[null|exact=JSUInt31]*/
-_returnDefaultNullCalledTwice([/*[null|exact=JSUInt31]*/ a]) => a;
+/*member: _returnDefaultNullCalledTwice:[null|exact=JSUInt31|powerset=1]*/
+_returnDefaultNullCalledTwice([/*[null|exact=JSUInt31|powerset=1]*/ a]) => a;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// A static method that has an optional parameter with a default value of `0`.
 /// Only one call site with no arguments.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: staticCallWithOptionalArguments5:[exact=JSUInt31]*/
+/*member: staticCallWithOptionalArguments5:[exact=JSUInt31|powerset=0]*/
 staticCallWithOptionalArguments5() => _returnDefaultZero();
 
-/*member: _returnDefaultZero:[exact=JSUInt31]*/
-_returnDefaultZero([/*[exact=JSUInt31]*/ a = 0]) => a;
+/*member: _returnDefaultZero:[exact=JSUInt31|powerset=0]*/
+_returnDefaultZero([/*[exact=JSUInt31|powerset=0]*/ a = 0]) => a;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// A static method that has an optional parameter with a default value of `0`.
 /// Only one call site with an argument of a different type.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: staticCallWithOptionalArguments6:[exact=JSNumNotInt]*/
+/*member: staticCallWithOptionalArguments6:[exact=JSNumNotInt|powerset=0]*/
 staticCallWithOptionalArguments6() => _returnDefaultZeroCalled(0.5);
 
-/*member: _returnDefaultZeroCalled:[exact=JSNumNotInt]*/
-_returnDefaultZeroCalled([/*[exact=JSNumNotInt]*/ a = 0]) => a;
+/*member: _returnDefaultZeroCalled:[exact=JSNumNotInt|powerset=0]*/
+_returnDefaultZeroCalled([/*[exact=JSNumNotInt|powerset=0]*/ a = 0]) => a;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// A static method that has a named parameter with a default value of `0`.
 /// Only one call site with no arguments.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: staticCallWithNamedArguments1:[exact=JSUInt31]*/
+/*member: staticCallWithNamedArguments1:[exact=JSUInt31|powerset=0]*/
 staticCallWithNamedArguments1() => _returnNamedDefaultZero();
 
-/*member: _returnNamedDefaultZero:[exact=JSUInt31]*/
-_returnNamedDefaultZero({/*[exact=JSUInt31]*/ a = 0}) => a;
+/*member: _returnNamedDefaultZero:[exact=JSUInt31|powerset=0]*/
+_returnNamedDefaultZero({/*[exact=JSUInt31|powerset=0]*/ a = 0}) => a;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// A static method that has a named parameter with a default value of `0`.
 /// Only one call site with an argument of a different type.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: staticCallWithNamedArguments2:[exact=JSNumNotInt]*/
+/*member: staticCallWithNamedArguments2:[exact=JSNumNotInt|powerset=0]*/
 staticCallWithNamedArguments2() => _returnNamedDefaultZeroCalled(a: 0.5);
 
-/*member: _returnNamedDefaultZeroCalled:[exact=JSNumNotInt]*/
-_returnNamedDefaultZeroCalled({/*[exact=JSNumNotInt]*/ a = 0}) => a;
+/*member: _returnNamedDefaultZeroCalled:[exact=JSNumNotInt|powerset=0]*/
+_returnNamedDefaultZeroCalled({/*[exact=JSNumNotInt|powerset=0]*/ a = 0}) => a;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// A static method that has a named parameter. Two call sites, one with an
 /// explicit argument and one with no arguments.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: staticCallWithNamedArguments3a:[null|exact=JSNumNotInt]*/
+/*member: staticCallWithNamedArguments3a:[null|exact=JSNumNotInt|powerset=1]*/
 staticCallWithNamedArguments3a() => _returnNamedNullCalledTwice();
 
-/*member: staticCallWithNamedArguments3b:[null|exact=JSNumNotInt]*/
+/*member: staticCallWithNamedArguments3b:[null|exact=JSNumNotInt|powerset=1]*/
 staticCallWithNamedArguments3b() => _returnNamedNullCalledTwice(a: 0.5);
 
-/*member: _returnNamedNullCalledTwice:[null|exact=JSNumNotInt]*/
-_returnNamedNullCalledTwice({/*[null|exact=JSNumNotInt]*/ a}) => a;
+/*member: _returnNamedNullCalledTwice:[null|exact=JSNumNotInt|powerset=1]*/
+_returnNamedNullCalledTwice({/*[null|exact=JSNumNotInt|powerset=1]*/ a}) => a;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Call an uninitialized top level field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _field1:[null]*/
+/*member: _field1:[null|powerset=1]*/
 dynamic _field1;
 
-/*member: invokeStaticFieldUninitialized:[empty]*/
+/*member: invokeStaticFieldUninitialized:[empty|powerset=0]*/
 invokeStaticFieldUninitialized() => _field1();
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Call a top level field initialized to a tear-off of a top level method.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _method1:[exact=JSUInt31]*/
+/*member: _method1:[exact=JSUInt31|powerset=0]*/
 _method1() => 42;
 
-/*member: _field2:[subclass=Closure]*/
+/*member: _field2:[subclass=Closure|powerset=0]*/
 dynamic _field2 = _method1;
 
-/*member: invokeStaticFieldTearOff:[null|subclass=Object]*/
+/*member: invokeStaticFieldTearOff:[null|subclass=Object|powerset=1]*/
 invokeStaticFieldTearOff() => _field2();
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Call a top level field initialized to a tear-off of a top level method.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _method5:Value([exact=JSString], value: "")*/
+/*member: _method5:Value([exact=JSString|powerset=0], value: "", powerset: 0)*/
 String _method5() => '';
 
-/*member: _field5:[subclass=Closure]*/
+/*member: _field5:[subclass=Closure|powerset=0]*/
 String Function() _field5 = _method5;
 
-/*member: invokeStaticTypedFieldTearOff:[exact=JSString]*/
+/*member: invokeStaticTypedFieldTearOff:[exact=JSString|powerset=0]*/
 invokeStaticTypedFieldTearOff() => _field5();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -213,42 +219,42 @@
 /// taking one argument.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _method2:[exact=JSUInt31]*/
-_method2(/*[exact=JSUInt31]*/ o) => 42;
+/*member: _method2:[exact=JSUInt31|powerset=0]*/
+_method2(/*[exact=JSUInt31|powerset=0]*/ o) => 42;
 
-/*member: _field3:[subclass=Closure]*/
+/*member: _field3:[subclass=Closure|powerset=0]*/
 dynamic _field3 = _method2;
 
-/*member: invokeStaticFieldTearOffParameters:[null|subclass=Object]*/
+/*member: invokeStaticFieldTearOffParameters:[null|subclass=Object|powerset=1]*/
 invokeStaticFieldTearOffParameters() => _field3(42);
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Call a top level getter returning a tear-off of a top level method.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _method3:[exact=JSUInt31]*/
+/*member: _method3:[exact=JSUInt31|powerset=0]*/
 _method3() => 42;
 
-/*member: _getter1:[subclass=Closure]*/
+/*member: _getter1:[subclass=Closure|powerset=0]*/
 get _getter1 => _method3;
 
-/*member: invokeStaticGetterTearOff:[null|subclass=Object]*/
+/*member: invokeStaticGetterTearOff:[null|subclass=Object|powerset=1]*/
 invokeStaticGetterTearOff() => _getter1();
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Call a typed top level getter returning a tear-off of a top level method.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _method6:[exact=JSUInt31]*/
+/*member: _method6:[exact=JSUInt31|powerset=0]*/
 int _method6() => 0;
 
-/*member: _field7:[subclass=Closure]*/
+/*member: _field7:[subclass=Closure|powerset=0]*/
 int Function() _field7 = _method6;
 
-/*member: _getter3:[subclass=Closure]*/
+/*member: _getter3:[subclass=Closure|powerset=0]*/
 int Function() get _getter3 => _field7;
 
-/*member: invokeStaticTypedGetterTearOff:[subclass=JSInt]*/
+/*member: invokeStaticTypedGetterTearOff:[subclass=JSInt|powerset=0]*/
 invokeStaticTypedGetterTearOff() => _getter3();
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -256,13 +262,16 @@
 /// arguments.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _method4:Union([exact=JSString], [exact=JSUInt31])*/
-T _method4<T>(T /*Union([exact=JSString], [exact=JSUInt31])*/ t) => t;
+/*member: _method4:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+T _method4<T>(
+  T /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+  t,
+) => t;
 
-/*member: invokeStaticGenericMethod1:[exact=JSUInt31]*/
+/*member: invokeStaticGenericMethod1:[exact=JSUInt31|powerset=0]*/
 invokeStaticGenericMethod1() => _method4(0);
 
-/*member: invokeStaticGenericMethod2:[exact=JSString]*/
+/*member: invokeStaticGenericMethod2:[exact=JSString|powerset=0]*/
 invokeStaticGenericMethod2() => _method4('');
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -270,13 +279,13 @@
 /// arguments.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _getter2:[subclass=Closure]*/
+/*member: _getter2:[subclass=Closure|powerset=0]*/
 T Function<T>(T) get _getter2 => _method4;
 
-/*member: invokeStaticGenericGetter1:[subclass=JSInt]*/
+/*member: invokeStaticGenericGetter1:[subclass=JSInt|powerset=0]*/
 invokeStaticGenericGetter1() => _getter2(0);
 
-/*member: invokeStaticGenericGetter2:[exact=JSString]*/
+/*member: invokeStaticGenericGetter2:[exact=JSString|powerset=0]*/
 invokeStaticGenericGetter2() => _getter2('');
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -284,11 +293,11 @@
 /// arguments.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _field4:[subclass=Closure]*/
+/*member: _field4:[subclass=Closure|powerset=0]*/
 T Function<T>(T) _field4 = _method4;
 
-/*member: invokeStaticGenericField1:[subclass=JSInt]*/
+/*member: invokeStaticGenericField1:[subclass=JSInt|powerset=0]*/
 invokeStaticGenericField1() => _field4(0);
 
-/*member: invokeStaticGenericField2:[exact=JSString]*/
+/*member: invokeStaticGenericField2:[exact=JSString|powerset=0]*/
 invokeStaticGenericField2() => _field4('');
diff --git a/pkg/compiler/test/inference/data/static_get.dart b/pkg/compiler/test/inference/data/static_get.dart
index 0a3bf8a..deeda4a 100644
--- a/pkg/compiler/test/inference/data/static_get.dart
+++ b/pkg/compiler/test/inference/data/static_get.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   getTopLevelFieldUninitialized();
   getStaticFieldUninitialized();
@@ -22,10 +22,10 @@
 /// Static get of an uninitialized top level field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _field1:[null]*/
+/*member: _field1:[null|powerset=1]*/
 var _field1;
 
-/*member: getTopLevelFieldUninitialized:[null]*/
+/*member: getTopLevelFieldUninitialized:[null|powerset=1]*/
 getTopLevelFieldUninitialized() => _field1;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -33,21 +33,21 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class1 {
-  /*member: Class1.field:[null]*/
+  /*member: Class1.field:[null|powerset=1]*/
   static var field;
 }
 
-/*member: getStaticFieldUninitialized:[null]*/
+/*member: getStaticFieldUninitialized:[null|powerset=1]*/
 getStaticFieldUninitialized() => Class1.field;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Static get of an initialized top level field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _field2:[exact=JSUInt31]*/
+/*member: _field2:[exact=JSUInt31|powerset=0]*/
 var _field2 = 42;
 
-/*member: getTopLevelFieldInitialized:[exact=JSUInt31]*/
+/*member: getTopLevelFieldInitialized:[exact=JSUInt31|powerset=0]*/
 getTopLevelFieldInitialized() => _field2;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -55,11 +55,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class2 {
-  /*member: Class2.field:[exact=JSUInt31]*/
+  /*member: Class2.field:[exact=JSUInt31|powerset=0]*/
   static var field = 42;
 }
 
-/*member: getStaticFieldInitialized:[exact=JSUInt31]*/
+/*member: getStaticFieldInitialized:[exact=JSUInt31|powerset=0]*/
 getStaticFieldInitialized() => Class2.field;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -67,13 +67,13 @@
 /// null.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _method3:[exact=JSUInt31]*/
+/*member: _method3:[exact=JSUInt31|powerset=0]*/
 _method3() => 42;
 
-/*member: _field3:[null|exact=JSUInt31]*/
+/*member: _field3:[null|exact=JSUInt31|powerset=1]*/
 var _field3 = _method3();
 
-/*member: getTopLevelFieldInitializedPotentiallyNull:[null|exact=JSUInt31]*/
+/*member: getTopLevelFieldInitializedPotentiallyNull:[null|exact=JSUInt31|powerset=1]*/
 getTopLevelFieldInitializedPotentiallyNull() => _field3;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -81,24 +81,24 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class3 {
-  /*member: Class3.method:[exact=JSUInt31]*/
+  /*member: Class3.method:[exact=JSUInt31|powerset=0]*/
   static method() => 42;
 
-  /*member: Class3.field:[null|exact=JSUInt31]*/
+  /*member: Class3.field:[null|exact=JSUInt31|powerset=1]*/
   static var field = method();
 }
 
-/*member: getStaticFieldInitializedPotentiallyNull:[null|exact=JSUInt31]*/
+/*member: getStaticFieldInitializedPotentiallyNull:[null|exact=JSUInt31|powerset=1]*/
 getStaticFieldInitializedPotentiallyNull() => Class3.field;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Static get of a top level method.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _method4:[exact=JSUInt31]*/
+/*member: _method4:[exact=JSUInt31|powerset=0]*/
 _method4() => 42;
 
-/*member: getTopLevelMethod:[subclass=Closure]*/
+/*member: getTopLevelMethod:[subclass=Closure|powerset=0]*/
 getTopLevelMethod() => _method4;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -106,21 +106,21 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class4 {
-  /*member: Class4.method:[exact=JSUInt31]*/
+  /*member: Class4.method:[exact=JSUInt31|powerset=0]*/
   static method() => 42;
 }
 
-/*member: getStaticMethod:[subclass=Closure]*/
+/*member: getStaticMethod:[subclass=Closure|powerset=0]*/
 getStaticMethod() => Class4.method;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Static get of a top level getter.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _getter1:[exact=JSUInt31]*/
+/*member: _getter1:[exact=JSUInt31|powerset=0]*/
 get _getter1 => 42;
 
-/*member: getTopLevelGetter:[exact=JSUInt31]*/
+/*member: getTopLevelGetter:[exact=JSUInt31|powerset=0]*/
 getTopLevelGetter() => _getter1;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -128,9 +128,9 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class5 {
-  /*member: Class5.getter:[exact=JSUInt31]*/
+  /*member: Class5.getter:[exact=JSUInt31|powerset=0]*/
   static get getter => 42;
 }
 
-/*member: getStaticGetter:[exact=JSUInt31]*/
+/*member: getStaticGetter:[exact=JSUInt31|powerset=0]*/
 getStaticGetter() => Class5.getter;
diff --git a/pkg/compiler/test/inference/data/static_set.dart b/pkg/compiler/test/inference/data/static_set.dart
index 80c95eb..cf1bfb6 100644
--- a/pkg/compiler/test/inference/data/static_set.dart
+++ b/pkg/compiler/test/inference/data/static_set.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   setTopLevelFieldUninitialized();
   setStaticFieldUninitialized();
@@ -17,10 +17,10 @@
 /// Static set of an uninitialized top level field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: field1:[null|exact=JSUInt31]*/
+/*member: field1:[null|exact=JSUInt31|powerset=1]*/
 var field1;
 
-/*member: setTopLevelFieldUninitialized:[exact=JSUInt31]*/
+/*member: setTopLevelFieldUninitialized:[exact=JSUInt31|powerset=0]*/
 setTopLevelFieldUninitialized() => field1 = 42;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -28,21 +28,21 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class1 {
-  /*member: Class1.field:[null|exact=JSUInt31]*/
+  /*member: Class1.field:[null|exact=JSUInt31|powerset=1]*/
   static var field;
 }
 
-/*member: setStaticFieldUninitialized:[exact=JSUInt31]*/
+/*member: setStaticFieldUninitialized:[exact=JSUInt31|powerset=0]*/
 setStaticFieldUninitialized() => Class1.field = 42;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Static set of an initialized top level field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: field2:Union([exact=JSString], [exact=JSUInt31])*/
+/*member: field2:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 dynamic field2 = '';
 
-/*member: setTopLevelFieldInitialized:[exact=JSUInt31]*/
+/*member: setTopLevelFieldInitialized:[exact=JSUInt31|powerset=0]*/
 setTopLevelFieldInitialized() => field2 = 42;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -50,20 +50,20 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class2 {
-  /*member: Class2.field:Union([exact=JSString], [exact=JSUInt31])*/
+  /*member: Class2.field:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
   static dynamic field = '';
 }
 
-/*member: setStaticFieldInitialized:[exact=JSUInt31]*/
+/*member: setStaticFieldInitialized:[exact=JSUInt31|powerset=0]*/
 setStaticFieldInitialized() => Class2.field = 42;
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Static set of a top level setter.
 ////////////////////////////////////////////////////////////////////////////////
 
-set _setter1(/*[exact=JSUInt31]*/ value) {}
+set _setter1(/*[exact=JSUInt31|powerset=0]*/ value) {}
 
-/*member: setTopLevelSetter:[exact=JSUInt31]*/
+/*member: setTopLevelSetter:[exact=JSUInt31|powerset=0]*/
 setTopLevelSetter() => _setter1 = 42;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -71,8 +71,8 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Class3 {
-  static set setter(/*[exact=JSUInt31]*/ value) {}
+  static set setter(/*[exact=JSUInt31|powerset=0]*/ value) {}
 }
 
-/*member: setStaticSetter:[exact=JSUInt31]*/
+/*member: setStaticSetter:[exact=JSUInt31|powerset=0]*/
 setStaticSetter() => Class3.setter = 42;
diff --git a/pkg/compiler/test/inference/data/static_type.dart b/pkg/compiler/test/inference/data/static_type.dart
index b0a1e8b..46a795c 100644
--- a/pkg/compiler/test/inference/data/static_type.dart
+++ b/pkg/compiler/test/inference/data/static_type.dart
@@ -3,149 +3,163 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class C<T> {
-  /*member: C.field:Union([exact=JSString], [exact=JSUInt31])*/
+  /*member: C.field:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
   final T field;
 
-  /*member: C.fixedFunctionField:[subclass=Closure]*/
-  int Function() fixedFunctionField = /*[exact=JSUInt31]*/ () => 0;
+  /*member: C.fixedFunctionField:[subclass=Closure|powerset=0]*/
+  int Function() fixedFunctionField = /*[exact=JSUInt31|powerset=0]*/ () => 0;
 
-  /*member: C.functionField:[null|subclass=Closure]*/
+  /*member: C.functionField:[null|subclass=Closure|powerset=1]*/
   T Function()? functionField;
 
-  /*member: C.genericFunctionField:[null|subclass=Closure]*/
+  /*member: C.genericFunctionField:[null|subclass=Closure|powerset=1]*/
   S Function<S>(S)? genericFunctionField;
 
-  /*member: C.:[exact=C]*/
-  C(this. /*Union([exact=JSString], [exact=JSUInt31])*/ field) {
-    /*update: [subclass=C]*/
+  /*member: C.:[exact=C|powerset=0]*/
+  C(
+    this. /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/ field,
+  ) {
+    /*update: [subclass=C|powerset=0]*/
     functionField =
-        /*Union([exact=JSString], [exact=JSUInt31])*/
-        () => /*[subclass=C]*/ field;
-    /*Union([exact=JSString], [exact=JSUInt31])*/
-    S local<S>(S /*Union([exact=JSString], [exact=JSUInt31])*/ s) => s;
-    /*update: [subclass=C]*/
+        /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+        () => /*[subclass=C|powerset=0]*/ field;
+    /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+    S local<S>(
+      S /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+      s,
+    ) => s;
+    /*update: [subclass=C|powerset=0]*/
     genericFunctionField = local;
   }
 
-  /*member: C.method:Union([exact=JSString], [exact=JSUInt31])*/
-  T method() => /*[subclass=C]*/ field;
+  /*member: C.method:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+  T method() => /*[subclass=C|powerset=0]*/ field;
 
-  /*member: C.+:Union([exact=JSString], [exact=JSUInt31])*/
-  T operator +(T /*Union([exact=JSString], [exact=JSUInt31])*/ t) =>
-      /*[subclass=C]*/ field;
+  /*member: C.+:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+  T operator +(
+    T /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+    t,
+  ) =>
+      /*[subclass=C|powerset=0]*/ field;
 
-  /*member: C.getter:Union([exact=JSString], [exact=JSUInt31])*/
-  T get getter => /*[subclass=C]*/ field;
+  /*member: C.getter:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+  T get getter => /*[subclass=C|powerset=0]*/ field;
 
-  /*member: C.fixedFunctionGetter:[subclass=Closure]*/
-  int Function() get fixedFunctionGetter => /*[exact=JSUInt31]*/ () => 0;
+  /*member: C.fixedFunctionGetter:[subclass=Closure|powerset=0]*/
+  int Function() get fixedFunctionGetter => /*[exact=JSUInt31|powerset=0]*/
+      () => 0;
 
-  /*member: C.functionGetter:[null|subclass=Closure]*/
-  T Function()? get functionGetter => /*[subclass=C]*/ functionField;
+  /*member: C.functionGetter:[null|subclass=Closure|powerset=1]*/
+  T Function()? get functionGetter => /*[subclass=C|powerset=0]*/ functionField;
 
-  /*member: C.genericFunctionGetter:[null|subclass=Closure]*/
+  /*member: C.genericFunctionGetter:[null|subclass=Closure|powerset=1]*/
   S Function<S>(S)? get genericFunctionGetter =>
-      /*[subclass=C]*/ genericFunctionField;
+      /*[subclass=C|powerset=0]*/ genericFunctionField;
 
-  /*member: C.genericMethod:Union([exact=JSString], [exact=JSUInt31])*/
-  S genericMethod<S>(S /*Union([exact=JSString], [exact=JSUInt31])*/ s) => s;
+  /*member: C.genericMethod:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+  S genericMethod<S>(
+    S /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+    s,
+  ) => s;
 }
 
 class D1 extends C<int> {
-  /*member: D1.:[exact=D1]*/
-  D1(int /*[exact=JSUInt31]*/ field) : super(field);
+  /*member: D1.:[exact=D1|powerset=0]*/
+  D1(int /*[exact=JSUInt31|powerset=0]*/ field) : super(field);
 
-  /*member: D1.superFieldAccess:[exact=JSUInt31]*/
+  /*member: D1.superFieldAccess:[exact=JSUInt31|powerset=0]*/
   superFieldAccess() => super.field;
 
-  /*member: D1.superFieldInvoke:[subclass=JSInt]*/
+  /*member: D1.superFieldInvoke:[subclass=JSInt|powerset=0]*/
   superFieldInvoke() => super.functionField!();
 
-  /*member: D1.superFixedFieldInvoke:[subclass=JSInt]*/
+  /*member: D1.superFixedFieldInvoke:[subclass=JSInt|powerset=0]*/
   superFixedFieldInvoke() => super.fixedFunctionField();
 
-  /*member: D1.superMethodInvoke:[exact=JSUInt31]*/
+  /*member: D1.superMethodInvoke:[exact=JSUInt31|powerset=0]*/
   superMethodInvoke() => super.method();
 
-  /*member: D1.superOperatorInvoke:[exact=JSUInt31]*/
+  /*member: D1.superOperatorInvoke:[exact=JSUInt31|powerset=0]*/
   superOperatorInvoke() => super + 0;
 
-  /*member: D1.superGetterAccess:[exact=JSUInt31]*/
+  /*member: D1.superGetterAccess:[exact=JSUInt31|powerset=0]*/
   superGetterAccess() => super.getter;
 
-  /*member: D1.superGetterInvoke:[subclass=JSInt]*/
+  /*member: D1.superGetterInvoke:[subclass=JSInt|powerset=0]*/
   superGetterInvoke() => super.functionGetter!();
 
-  /*member: D1.superFixedGetterInvoke:[subclass=JSInt]*/
+  /*member: D1.superFixedGetterInvoke:[subclass=JSInt|powerset=0]*/
   superFixedGetterInvoke() => super.fixedFunctionGetter();
 
-  /*member: D1.superGenericFieldInvoke1:[exact=JSString]*/
+  /*member: D1.superGenericFieldInvoke1:[exact=JSString|powerset=0]*/
   superGenericFieldInvoke1() => super.genericFunctionField!('');
 
-  /*member: D1.superGenericFieldInvoke2:[subclass=JSInt]*/
+  /*member: D1.superGenericFieldInvoke2:[subclass=JSInt|powerset=0]*/
   superGenericFieldInvoke2() => super.genericFunctionField!(0);
 
-  /*member: D1.superGenericMethodInvoke1:[exact=JSString]*/
+  /*member: D1.superGenericMethodInvoke1:[exact=JSString|powerset=0]*/
   superGenericMethodInvoke1() => super.genericMethod('');
 
-  /*member: D1.superGenericMethodInvoke2:[exact=JSUInt31]*/
+  /*member: D1.superGenericMethodInvoke2:[exact=JSUInt31|powerset=0]*/
   superGenericMethodInvoke2() => super.genericMethod(0);
 
-  /*member: D1.superGenericGetterInvoke1:[exact=JSString]*/
+  /*member: D1.superGenericGetterInvoke1:[exact=JSString|powerset=0]*/
   superGenericGetterInvoke1() => super.genericFunctionGetter!('');
 
-  /*member: D1.superGenericGetterInvoke2:[subclass=JSInt]*/
+  /*member: D1.superGenericGetterInvoke2:[subclass=JSInt|powerset=0]*/
   superGenericGetterInvoke2() => super.genericFunctionGetter!(0);
 }
 
 class D2 extends C<String> {
-  /*member: D2.:[exact=D2]*/
-  D2(String /*Value([exact=JSString], value: "")*/ field) : super(field);
+  /*member: D2.:[exact=D2|powerset=0]*/
+  D2(
+    String /*Value([exact=JSString|powerset=0], value: "", powerset: 0)*/ field,
+  ) : super(field);
 
-  /*member: D2.superFieldAccess:[exact=JSString]*/
+  /*member: D2.superFieldAccess:[exact=JSString|powerset=0]*/
   superFieldAccess() => super.field;
 
-  /*member: D2.superFieldInvoke:[exact=JSString]*/
+  /*member: D2.superFieldInvoke:[exact=JSString|powerset=0]*/
   superFieldInvoke() => super.functionField!();
 
-  /*member: D2.superFixedFieldInvoke:[subclass=JSInt]*/
+  /*member: D2.superFixedFieldInvoke:[subclass=JSInt|powerset=0]*/
   superFixedFieldInvoke() => super.fixedFunctionField();
 
-  /*member: D2.superMethodInvoke:[exact=JSString]*/
+  /*member: D2.superMethodInvoke:[exact=JSString|powerset=0]*/
   superMethodInvoke() => super.method();
 
-  /*member: D2.superOperatorInvoke:[exact=JSString]*/
+  /*member: D2.superOperatorInvoke:[exact=JSString|powerset=0]*/
   superOperatorInvoke() => super + '';
 
-  /*member: D2.superGetterAccess:[exact=JSString]*/
+  /*member: D2.superGetterAccess:[exact=JSString|powerset=0]*/
   superGetterAccess() => super.getter;
 
-  /*member: D2.superGetterInvoke:[exact=JSString]*/
+  /*member: D2.superGetterInvoke:[exact=JSString|powerset=0]*/
   superGetterInvoke() => super.functionGetter!();
 
-  /*member: D2.superFixedGetterInvoke:[subclass=JSInt]*/
+  /*member: D2.superFixedGetterInvoke:[subclass=JSInt|powerset=0]*/
   superFixedGetterInvoke() => super.fixedFunctionGetter();
 
-  /*member: D2.superGenericFieldInvoke1:[exact=JSString]*/
+  /*member: D2.superGenericFieldInvoke1:[exact=JSString|powerset=0]*/
   superGenericFieldInvoke1() => super.genericFunctionField!('');
 
-  /*member: D2.superGenericFieldInvoke2:[subclass=JSInt]*/
+  /*member: D2.superGenericFieldInvoke2:[subclass=JSInt|powerset=0]*/
   superGenericFieldInvoke2() => super.genericFunctionField!(0);
 
-  /*member: D2.superGenericMethodInvoke1:[exact=JSString]*/
+  /*member: D2.superGenericMethodInvoke1:[exact=JSString|powerset=0]*/
   superGenericMethodInvoke1() => super.genericMethod('');
 
-  /*member: D2.superGenericMethodInvoke2:[exact=JSUInt31]*/
+  /*member: D2.superGenericMethodInvoke2:[exact=JSUInt31|powerset=0]*/
   superGenericMethodInvoke2() => super.genericMethod(0);
 
-  /*member: D2.superGenericGetterInvoke1:[exact=JSString]*/
+  /*member: D2.superGenericGetterInvoke1:[exact=JSString|powerset=0]*/
   superGenericGetterInvoke1() => super.genericFunctionGetter!('');
 
-  /*member: D2.superGenericGetterInvoke2:[subclass=JSInt]*/
+  /*member: D2.superGenericGetterInvoke2:[subclass=JSInt|powerset=0]*/
   superGenericGetterInvoke2() => super.genericFunctionGetter!(0);
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   closureInvoke();
   localFunctionInvoke();
@@ -171,175 +185,178 @@
   genericGetterInvoke1();
   genericGetterInvoke2();
   D1(0)
-    .. /*invoke: [exact=D1]*/ superFieldAccess()
-    .. /*invoke: [exact=D1]*/ superFieldInvoke()
-    .. /*invoke: [exact=D1]*/ superFixedFieldInvoke()
-    .. /*invoke: [exact=D1]*/ superMethodInvoke()
-    .. /*invoke: [exact=D1]*/ superOperatorInvoke()
-    .. /*invoke: [exact=D1]*/ superGetterAccess()
-    .. /*invoke: [exact=D1]*/ superGetterInvoke()
-    .. /*invoke: [exact=D1]*/ superFixedGetterInvoke()
-    .. /*invoke: [exact=D1]*/ superGenericFieldInvoke1()
-    .. /*invoke: [exact=D1]*/ superGenericFieldInvoke2()
-    .. /*invoke: [exact=D1]*/ superGenericMethodInvoke1()
-    .. /*invoke: [exact=D1]*/ superGenericMethodInvoke2()
-    .. /*invoke: [exact=D1]*/ superGenericGetterInvoke1()
-    .. /*invoke: [exact=D1]*/ superGenericGetterInvoke2();
+    .. /*invoke: [exact=D1|powerset=0]*/ superFieldAccess()
+    .. /*invoke: [exact=D1|powerset=0]*/ superFieldInvoke()
+    .. /*invoke: [exact=D1|powerset=0]*/ superFixedFieldInvoke()
+    .. /*invoke: [exact=D1|powerset=0]*/ superMethodInvoke()
+    .. /*invoke: [exact=D1|powerset=0]*/ superOperatorInvoke()
+    .. /*invoke: [exact=D1|powerset=0]*/ superGetterAccess()
+    .. /*invoke: [exact=D1|powerset=0]*/ superGetterInvoke()
+    .. /*invoke: [exact=D1|powerset=0]*/ superFixedGetterInvoke()
+    .. /*invoke: [exact=D1|powerset=0]*/ superGenericFieldInvoke1()
+    .. /*invoke: [exact=D1|powerset=0]*/ superGenericFieldInvoke2()
+    .. /*invoke: [exact=D1|powerset=0]*/ superGenericMethodInvoke1()
+    .. /*invoke: [exact=D1|powerset=0]*/ superGenericMethodInvoke2()
+    .. /*invoke: [exact=D1|powerset=0]*/ superGenericGetterInvoke1()
+    .. /*invoke: [exact=D1|powerset=0]*/ superGenericGetterInvoke2();
   D2('')
-    .. /*invoke: [exact=D2]*/ superFieldAccess()
-    .. /*invoke: [exact=D2]*/ superFieldInvoke()
-    .. /*invoke: [exact=D2]*/ superFixedFieldInvoke()
-    .. /*invoke: [exact=D2]*/ superMethodInvoke()
-    .. /*invoke: [exact=D2]*/ superOperatorInvoke()
-    .. /*invoke: [exact=D2]*/ superGetterAccess()
-    .. /*invoke: [exact=D2]*/ superGetterInvoke()
-    .. /*invoke: [exact=D2]*/ superFixedGetterInvoke()
-    .. /*invoke: [exact=D2]*/ superGenericFieldInvoke1()
-    .. /*invoke: [exact=D2]*/ superGenericFieldInvoke2()
-    .. /*invoke: [exact=D2]*/ superGenericMethodInvoke1()
-    .. /*invoke: [exact=D2]*/ superGenericMethodInvoke2()
-    .. /*invoke: [exact=D2]*/ superGenericGetterInvoke1()
-    .. /*invoke: [exact=D2]*/ superGenericGetterInvoke2();
+    .. /*invoke: [exact=D2|powerset=0]*/ superFieldAccess()
+    .. /*invoke: [exact=D2|powerset=0]*/ superFieldInvoke()
+    .. /*invoke: [exact=D2|powerset=0]*/ superFixedFieldInvoke()
+    .. /*invoke: [exact=D2|powerset=0]*/ superMethodInvoke()
+    .. /*invoke: [exact=D2|powerset=0]*/ superOperatorInvoke()
+    .. /*invoke: [exact=D2|powerset=0]*/ superGetterAccess()
+    .. /*invoke: [exact=D2|powerset=0]*/ superGetterInvoke()
+    .. /*invoke: [exact=D2|powerset=0]*/ superFixedGetterInvoke()
+    .. /*invoke: [exact=D2|powerset=0]*/ superGenericFieldInvoke1()
+    .. /*invoke: [exact=D2|powerset=0]*/ superGenericFieldInvoke2()
+    .. /*invoke: [exact=D2|powerset=0]*/ superGenericMethodInvoke1()
+    .. /*invoke: [exact=D2|powerset=0]*/ superGenericMethodInvoke2()
+    .. /*invoke: [exact=D2|powerset=0]*/ superGenericGetterInvoke1()
+    .. /*invoke: [exact=D2|powerset=0]*/ superGenericGetterInvoke2();
 }
 
-/*member: closureInvoke:[subclass=JSInt]*/
+/*member: closureInvoke:[subclass=JSInt|powerset=0]*/
 closureInvoke() {
-  int Function() f = /*[exact=JSUInt31]*/ () => 0;
+  int Function() f = /*[exact=JSUInt31|powerset=0]*/ () => 0;
   return f();
 }
 
-/*member: localFunctionInvoke:[exact=JSUInt31]*/
+/*member: localFunctionInvoke:[exact=JSUInt31|powerset=0]*/
 localFunctionInvoke() {
-  /*[exact=JSUInt31]*/
+  /*[exact=JSUInt31|powerset=0]*/
   int local() => 0;
   return local();
 }
 
-/*member: genericLocalFunctionInvoke:[null]*/
+/*member: genericLocalFunctionInvoke:[null|powerset=1]*/
 genericLocalFunctionInvoke() {
-  /*Union([exact=JSString], [exact=JSUInt31])*/
-  S local<S>(S /*Union([exact=JSString], [exact=JSUInt31])*/ s) => s;
+  /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+  S local<S>(
+    S /*Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+    s,
+  ) => s;
 
-  local(0). /*invoke: [exact=JSUInt31]*/ toString();
-  local(''). /*invoke: [exact=JSString]*/ toString();
+  local(0). /*invoke: [exact=JSUInt31|powerset=0]*/ toString();
+  local(''). /*invoke: [exact=JSString|powerset=0]*/ toString();
 }
 
-/*member: fieldAccess1:[exact=JSUInt31]*/
+/*member: fieldAccess1:[exact=JSUInt31|powerset=0]*/
 fieldAccess1() {
   C<int> c = C<int>(0);
-  return c. /*[exact=C]*/ field;
+  return c. /*[exact=C|powerset=0]*/ field;
 }
 
-/*member: fieldAccess2:[exact=JSString]*/
+/*member: fieldAccess2:[exact=JSString|powerset=0]*/
 fieldAccess2() {
   C<String> c = C<String>('');
-  return c. /*[exact=C]*/ field;
+  return c. /*[exact=C|powerset=0]*/ field;
 }
 
-/*member: fixedFieldInvoke:[subclass=JSInt]*/
+/*member: fixedFieldInvoke:[subclass=JSInt|powerset=0]*/
 fixedFieldInvoke() {
   C<int> c = C<int>(0);
-  return c.fixedFunctionField /*invoke: [exact=C]*/ ();
+  return c.fixedFunctionField /*invoke: [exact=C|powerset=0]*/ ();
 }
 
-/*member: fieldInvoke1:[subclass=JSInt]*/
+/*member: fieldInvoke1:[subclass=JSInt|powerset=0]*/
 fieldInvoke1() {
   C<int> c = C<int>(0);
-  return c. /*[exact=C]*/ functionField!();
+  return c. /*[exact=C|powerset=0]*/ functionField!();
 }
 
-/*member: fieldInvoke2:[exact=JSString]*/
+/*member: fieldInvoke2:[exact=JSString|powerset=0]*/
 fieldInvoke2() {
   C<String> c = C<String>('');
-  return c. /*[exact=C]*/ functionField!();
+  return c. /*[exact=C|powerset=0]*/ functionField!();
 }
 
-/*member: methodInvoke1:[exact=JSUInt31]*/
+/*member: methodInvoke1:[exact=JSUInt31|powerset=0]*/
 methodInvoke1() {
   C<int> c = C<int>(0);
-  return c. /*invoke: [exact=C]*/ method();
+  return c. /*invoke: [exact=C|powerset=0]*/ method();
 }
 
-/*member: methodInvoke2:[exact=JSString]*/
+/*member: methodInvoke2:[exact=JSString|powerset=0]*/
 methodInvoke2() {
   C<String> c = C<String>('');
-  return c. /*invoke: [exact=C]*/ method();
+  return c. /*invoke: [exact=C|powerset=0]*/ method();
 }
 
-/*member: operatorInvoke1:[exact=JSUInt31]*/
+/*member: operatorInvoke1:[exact=JSUInt31|powerset=0]*/
 operatorInvoke1() {
   C<int> c = C<int>(0);
-  return c /*invoke: [exact=C]*/ + 0;
+  return c /*invoke: [exact=C|powerset=0]*/ + 0;
 }
 
-/*member: operatorInvoke2:[exact=JSString]*/
+/*member: operatorInvoke2:[exact=JSString|powerset=0]*/
 operatorInvoke2() {
   C<String> c = C<String>('');
-  return c /*invoke: [exact=C]*/ + '';
+  return c /*invoke: [exact=C|powerset=0]*/ + '';
 }
 
-/*member: fixedGetterInvoke:[subclass=JSInt]*/
+/*member: fixedGetterInvoke:[subclass=JSInt|powerset=0]*/
 fixedGetterInvoke() {
   C<int> c = C<int>(0);
-  return c.fixedFunctionGetter /*invoke: [exact=C]*/ ();
+  return c.fixedFunctionGetter /*invoke: [exact=C|powerset=0]*/ ();
 }
 
-/*member: getterAccess1:[exact=JSUInt31]*/
+/*member: getterAccess1:[exact=JSUInt31|powerset=0]*/
 getterAccess1() {
   C<int> c = C<int>(0);
-  return c. /*[exact=C]*/ getter;
+  return c. /*[exact=C|powerset=0]*/ getter;
 }
 
-/*member: getterAccess2:[exact=JSString]*/
+/*member: getterAccess2:[exact=JSString|powerset=0]*/
 getterAccess2() {
   C<String> c = C<String>('');
-  return c. /*[exact=C]*/ getter;
+  return c. /*[exact=C|powerset=0]*/ getter;
 }
 
-/*member: getterInvoke1:[subclass=JSInt]*/
+/*member: getterInvoke1:[subclass=JSInt|powerset=0]*/
 getterInvoke1() {
   C<int> c = C<int>(0);
-  return c. /*[exact=C]*/ functionGetter!();
+  return c. /*[exact=C|powerset=0]*/ functionGetter!();
 }
 
-/*member: getterInvoke2:[exact=JSString]*/
+/*member: getterInvoke2:[exact=JSString|powerset=0]*/
 getterInvoke2() {
   C<String> c = C<String>('');
-  return c. /*[exact=C]*/ functionGetter!();
+  return c. /*[exact=C|powerset=0]*/ functionGetter!();
 }
 
-/*member: genericFieldInvoke1:[exact=JSString]*/
+/*member: genericFieldInvoke1:[exact=JSString|powerset=0]*/
 genericFieldInvoke1() {
   C<int> c = C<int>(0);
-  return c. /*[exact=C]*/ genericFunctionField!('');
+  return c. /*[exact=C|powerset=0]*/ genericFunctionField!('');
 }
 
-/*member: genericFieldInvoke2:[subclass=JSInt]*/
+/*member: genericFieldInvoke2:[subclass=JSInt|powerset=0]*/
 genericFieldInvoke2() {
   C<String> c = C<String>('');
-  return c. /*[exact=C]*/ genericFunctionField!(0);
+  return c. /*[exact=C|powerset=0]*/ genericFunctionField!(0);
 }
 
-/*member: genericMethodInvoke1:[exact=JSString]*/
+/*member: genericMethodInvoke1:[exact=JSString|powerset=0]*/
 genericMethodInvoke1() {
   C<int> c = C<int>(0);
-  return c. /*invoke: [exact=C]*/ genericMethod('');
+  return c. /*invoke: [exact=C|powerset=0]*/ genericMethod('');
 }
 
-/*member: genericMethodInvoke2:[exact=JSUInt31]*/
+/*member: genericMethodInvoke2:[exact=JSUInt31|powerset=0]*/
 genericMethodInvoke2() {
   C<String> c = C<String>('');
-  return c. /*invoke: [exact=C]*/ genericMethod(0);
+  return c. /*invoke: [exact=C|powerset=0]*/ genericMethod(0);
 }
 
-/*member: genericGetterInvoke1:[exact=JSString]*/
+/*member: genericGetterInvoke1:[exact=JSString|powerset=0]*/
 genericGetterInvoke1() {
   C<int> c = C<int>(0);
-  return c. /*[exact=C]*/ genericFunctionGetter!('');
+  return c. /*[exact=C|powerset=0]*/ genericFunctionGetter!('');
 }
 
-/*member: genericGetterInvoke2:[subclass=JSInt]*/
+/*member: genericGetterInvoke2:[subclass=JSInt|powerset=0]*/
 genericGetterInvoke2() {
   C<String> c = C<String>('');
-  return c. /*[exact=C]*/ genericFunctionGetter!(0);
+  return c. /*[exact=C|powerset=0]*/ genericFunctionGetter!(0);
 }
diff --git a/pkg/compiler/test/inference/data/super_get.dart b/pkg/compiler/test/inference/data/super_get.dart
index 5865423..0a46138 100644
--- a/pkg/compiler/test/inference/data/super_get.dart
+++ b/pkg/compiler/test/inference/data/super_get.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   superFieldAccess();
   superGetterAccess();
@@ -13,61 +13,61 @@
 // Access of super field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Super1.:[exact=Super1]*/
+/*member: Super1.:[exact=Super1|powerset=0]*/
 class Super1 {
-  /*member: Super1.field:[exact=JSUInt31]*/
+  /*member: Super1.field:[exact=JSUInt31|powerset=0]*/
   var field = 42;
 }
 
-/*member: Sub1.:[exact=Sub1]*/
+/*member: Sub1.:[exact=Sub1|powerset=0]*/
 class Sub1 extends Super1 {
-  /*member: Sub1.method:[exact=JSUInt31]*/
+  /*member: Sub1.method:[exact=JSUInt31|powerset=0]*/
   method() => super.field;
 }
 
-/*member: superFieldAccess:[null]*/
+/*member: superFieldAccess:[null|powerset=1]*/
 superFieldAccess() {
-  Sub1(). /*invoke: [exact=Sub1]*/ method();
+  Sub1(). /*invoke: [exact=Sub1|powerset=0]*/ method();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Access of super getter.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Super2.:[exact=Super2]*/
+/*member: Super2.:[exact=Super2|powerset=0]*/
 class Super2 {
-  /*member: Super2.getter:[exact=JSUInt31]*/
+  /*member: Super2.getter:[exact=JSUInt31|powerset=0]*/
   get getter => 42;
 }
 
-/*member: Sub2.:[exact=Sub2]*/
+/*member: Sub2.:[exact=Sub2|powerset=0]*/
 class Sub2 extends Super2 {
-  /*member: Sub2.method:[exact=JSUInt31]*/
+  /*member: Sub2.method:[exact=JSUInt31|powerset=0]*/
   method() => super.getter;
 }
 
-/*member: superGetterAccess:[null]*/
+/*member: superGetterAccess:[null|powerset=1]*/
 superGetterAccess() {
-  Sub2(). /*invoke: [exact=Sub2]*/ method();
+  Sub2(). /*invoke: [exact=Sub2|powerset=0]*/ method();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Access of super method.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Super3.:[exact=Super3]*/
+/*member: Super3.:[exact=Super3|powerset=0]*/
 class Super3 {
-  /*member: Super3.superMethod:[null]*/
+  /*member: Super3.superMethod:[null|powerset=1]*/
   superMethod() {}
 }
 
-/*member: Sub3.:[exact=Sub3]*/
+/*member: Sub3.:[exact=Sub3|powerset=0]*/
 class Sub3 extends Super3 {
-  /*member: Sub3.method:[subclass=Closure]*/
+  /*member: Sub3.method:[subclass=Closure|powerset=0]*/
   method() => super.superMethod;
 }
 
-/*member: superMethodAccess:[null]*/
+/*member: superMethodAccess:[null|powerset=1]*/
 superMethodAccess() {
-  Sub3(). /*invoke: [exact=Sub3]*/ method();
+  Sub3(). /*invoke: [exact=Sub3|powerset=0]*/ method();
 }
diff --git a/pkg/compiler/test/inference/data/super_invoke.dart b/pkg/compiler/test/inference/data/super_invoke.dart
index 9b98ffd..f874207 100644
--- a/pkg/compiler/test/inference/data/super_invoke.dart
+++ b/pkg/compiler/test/inference/data/super_invoke.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   superMethodInvoke();
   superFieldInvoke();
@@ -14,100 +14,100 @@
 // Invocation of super method.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Super1.:[exact=Super1]*/
+/*member: Super1.:[exact=Super1|powerset=0]*/
 class Super1 {
-  /*member: Super1.method:[exact=JSUInt31]*/
+  /*member: Super1.method:[exact=JSUInt31|powerset=0]*/
   method() => 42;
 }
 
-/*member: Sub1.:[exact=Sub1]*/
+/*member: Sub1.:[exact=Sub1|powerset=0]*/
 class Sub1 extends Super1 {
-  /*member: Sub1.method:[subclass=JSPositiveInt]*/
+  /*member: Sub1.method:[subclass=JSPositiveInt|powerset=0]*/
   method() {
     var a = super.method();
-    return a. /*invoke: [exact=JSUInt31]*/ abs();
+    return a. /*invoke: [exact=JSUInt31|powerset=0]*/ abs();
   }
 }
 
-/*member: superMethodInvoke:[null]*/
+/*member: superMethodInvoke:[null|powerset=1]*/
 superMethodInvoke() {
-  Sub1(). /*invoke: [exact=Sub1]*/ method();
+  Sub1(). /*invoke: [exact=Sub1|powerset=0]*/ method();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Invocation of super field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _method1:[exact=JSUInt31]*/
+/*member: _method1:[exact=JSUInt31|powerset=0]*/
 _method1() => 42;
 
-/*member: Super2.:[exact=Super2]*/
+/*member: Super2.:[exact=Super2|powerset=0]*/
 class Super2 {
-  /*member: Super2.field:[subclass=Closure]*/
+  /*member: Super2.field:[subclass=Closure|powerset=0]*/
   var field = _method1;
 }
 
-/*member: Sub2.:[exact=Sub2]*/
+/*member: Sub2.:[exact=Sub2|powerset=0]*/
 class Sub2 extends Super2 {
-  /*member: Sub2.method:[null|subclass=Object]*/
+  /*member: Sub2.method:[null|subclass=Object|powerset=1]*/
   method() {
     return super.field();
   }
 }
 
-/*member: superFieldInvoke:[null]*/
+/*member: superFieldInvoke:[null|powerset=1]*/
 superFieldInvoke() {
-  Sub2(). /*invoke: [exact=Sub2]*/ method();
+  Sub2(). /*invoke: [exact=Sub2|powerset=0]*/ method();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Invocation of super getter.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _method2:[exact=JSUInt31]*/
+/*member: _method2:[exact=JSUInt31|powerset=0]*/
 _method2() => 42;
 
-/*member: Super3.:[exact=Super3]*/
+/*member: Super3.:[exact=Super3|powerset=0]*/
 class Super3 {
-  /*member: Super3.getter:[subclass=Closure]*/
+  /*member: Super3.getter:[subclass=Closure|powerset=0]*/
   get getter => _method2;
 }
 
-/*member: Sub3.:[exact=Sub3]*/
+/*member: Sub3.:[exact=Sub3|powerset=0]*/
 class Sub3 extends Super3 {
-  /*member: Sub3.method:[null|subclass=Object]*/
+  /*member: Sub3.method:[null|subclass=Object|powerset=1]*/
   method() {
     return super.getter();
   }
 }
 
-/*member: superGetterInvoke:[null]*/
+/*member: superGetterInvoke:[null|powerset=1]*/
 superGetterInvoke() {
-  Sub3(). /*invoke: [exact=Sub3]*/ method();
+  Sub3(). /*invoke: [exact=Sub3|powerset=0]*/ method();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Invocation of abstract super method that overrides a concrete method.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: SuperSuper10.:[exact=SuperSuper10]*/
+/*member: SuperSuper10.:[exact=SuperSuper10|powerset=0]*/
 class SuperSuper10 {
-  /*member: SuperSuper10.method:[exact=JSUInt31]*/
+  /*member: SuperSuper10.method:[exact=JSUInt31|powerset=0]*/
   method() => 42;
 }
 
-/*member: Super10.:[exact=Super10]*/
+/*member: Super10.:[exact=Super10|powerset=0]*/
 class Super10 extends SuperSuper10 {
   method();
 }
 
-/*member: Sub10.:[exact=Sub10]*/
+/*member: Sub10.:[exact=Sub10|powerset=0]*/
 class Sub10 extends Super10 {
-  /*member: Sub10.method:[exact=JSUInt31]*/
+  /*member: Sub10.method:[exact=JSUInt31|powerset=0]*/
   method() => super.method();
 }
 
-/*member: overridingAbstractSuperMethodInvoke:[null]*/
+/*member: overridingAbstractSuperMethodInvoke:[null|powerset=1]*/
 overridingAbstractSuperMethodInvoke() {
-  Sub10(). /*invoke: [exact=Sub10]*/ method();
+  Sub10(). /*invoke: [exact=Sub10|powerset=0]*/ method();
 }
diff --git a/pkg/compiler/test/inference/data/super_set.dart b/pkg/compiler/test/inference/data/super_set.dart
index d9c5e65..acf2ccc 100644
--- a/pkg/compiler/test/inference/data/super_set.dart
+++ b/pkg/compiler/test/inference/data/super_set.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   superFieldUpdate();
   superSetterUpdate();
@@ -12,45 +12,45 @@
 // Update of super field.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Super1.:[exact=Super1]*/
+/*member: Super1.:[exact=Super1|powerset=0]*/
 class Super1 {
-  /*member: Super1.field:Union([exact=JSUInt31], [exact=Sub1])*/
+  /*member: Super1.field:Union([exact=JSUInt31|powerset=0], [exact=Sub1|powerset=0], powerset: 0)*/
   dynamic field = 42;
 }
 
-/*member: Sub1.:[exact=Sub1]*/
+/*member: Sub1.:[exact=Sub1|powerset=0]*/
 class Sub1 extends Super1 {
-  /*member: Sub1.method:[subclass=Closure]*/
+  /*member: Sub1.method:[subclass=Closure|powerset=0]*/
   method() {
     var a = super.field = Sub1();
-    return a. /*[exact=Sub1]*/ method;
+    return a. /*[exact=Sub1|powerset=0]*/ method;
   }
 }
 
-/*member: superFieldUpdate:[null]*/
+/*member: superFieldUpdate:[null|powerset=1]*/
 superFieldUpdate() {
-  Sub1(). /*invoke: [exact=Sub1]*/ method();
+  Sub1(). /*invoke: [exact=Sub1|powerset=0]*/ method();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Update of super setter.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Super2.:[exact=Super2]*/
+/*member: Super2.:[exact=Super2|powerset=0]*/
 class Super2 {
-  set setter(/*[exact=Sub2]*/ value) {}
+  set setter(/*[exact=Sub2|powerset=0]*/ value) {}
 }
 
-/*member: Sub2.:[exact=Sub2]*/
+/*member: Sub2.:[exact=Sub2|powerset=0]*/
 class Sub2 extends Super2 {
-  /*member: Sub2.method:[subclass=Closure]*/
+  /*member: Sub2.method:[subclass=Closure|powerset=0]*/
   method() {
     var a = super.setter = Sub2();
-    return a. /*[exact=Sub2]*/ method;
+    return a. /*[exact=Sub2|powerset=0]*/ method;
   }
 }
 
-/*member: superSetterUpdate:[null]*/
+/*member: superSetterUpdate:[null|powerset=1]*/
 superSetterUpdate() {
-  Sub2(). /*invoke: [exact=Sub2]*/ method();
+  Sub2(). /*invoke: [exact=Sub2|powerset=0]*/ method();
 }
diff --git a/pkg/compiler/test/inference/data/switch.dart b/pkg/compiler/test/inference/data/switch.dart
index 7b8ff4f..a53d661 100644
--- a/pkg/compiler/test/inference/data/switch.dart
+++ b/pkg/compiler/test/inference/data/switch.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   switchWithoutDefault();
   switchWithDefault();
@@ -15,8 +15,8 @@
 // Switch statement without default case.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _switchWithoutDefault:Union(null, [exact=JSString], [exact=JSUInt31])*/
-_switchWithoutDefault(/*[exact=JSUInt31]*/ o) {
+/*member: _switchWithoutDefault:Union(null, [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
+_switchWithoutDefault(/*[exact=JSUInt31|powerset=0]*/ o) {
   var local;
   switch (o) {
     case 0:
@@ -29,7 +29,7 @@
   return local;
 }
 
-/*member: switchWithoutDefault:[null]*/
+/*member: switchWithoutDefault:[null|powerset=1]*/
 switchWithoutDefault() {
   _switchWithoutDefault(0);
   _switchWithoutDefault(1);
@@ -39,8 +39,8 @@
 // Switch statement with default case.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _switchWithDefault:Union([exact=JSString], [exact=JSUInt31])*/
-_switchWithDefault(/*[exact=JSUInt31]*/ o) {
+/*member: _switchWithDefault:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+_switchWithDefault(/*[exact=JSUInt31|powerset=0]*/ o) {
   var local;
   switch (o) {
     case 0:
@@ -54,7 +54,7 @@
   return local;
 }
 
-/*member: switchWithDefault:[null]*/
+/*member: switchWithDefault:[null|powerset=1]*/
 switchWithDefault() {
   _switchWithDefault(0);
   _switchWithDefault(1);
@@ -64,8 +64,8 @@
 // Switch statement with default case without break.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _switchWithDefaultWithoutBreak:Union([exact=JSString], [exact=JSUInt31])*/
-_switchWithDefaultWithoutBreak(/*[exact=JSUInt31]*/ o) {
+/*member: _switchWithDefaultWithoutBreak:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+_switchWithDefaultWithoutBreak(/*[exact=JSUInt31|powerset=0]*/ o) {
   var local;
   switch (o) {
     case 0:
@@ -78,7 +78,7 @@
   return local;
 }
 
-/*member: switchWithDefaultWithoutBreak:[null]*/
+/*member: switchWithDefaultWithoutBreak:[null|powerset=1]*/
 switchWithDefaultWithoutBreak() {
   _switchWithDefaultWithoutBreak(0);
   _switchWithDefaultWithoutBreak(1);
@@ -88,8 +88,8 @@
 // Switch statement with continue.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _switchWithContinue:Union([exact=JSBool], [exact=JSString])*/
-_switchWithContinue(/*[exact=JSUInt31]*/ o) {
+/*member: _switchWithContinue:Union([exact=JSBool|powerset=0], [exact=JSString|powerset=0], powerset: 0)*/
+_switchWithContinue(/*[exact=JSUInt31|powerset=0]*/ o) {
   dynamic local;
   switch (o) {
     case 0:
@@ -97,7 +97,9 @@
       continue label;
     label:
     case 1:
-      local = local. /*Union(null, [exact=JSString], [exact=JSUInt31])*/ isEven;
+      local =
+          local
+              . /*Union(null, [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/ isEven;
       break;
     case 2:
     default:
@@ -106,7 +108,7 @@
   return local;
 }
 
-/*member: switchWithContinue:[null]*/
+/*member: switchWithContinue:[null|powerset=1]*/
 switchWithContinue() {
   _switchWithContinue(0);
   _switchWithContinue(1);
@@ -117,15 +119,15 @@
 // the continue statement.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _switchWithoutContinue:Union([exact=JSString], [exact=JSUInt31])*/
-_switchWithoutContinue(/*[exact=JSUInt31]*/ o) {
+/*member: _switchWithoutContinue:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
+_switchWithoutContinue(/*[exact=JSUInt31|powerset=0]*/ o) {
   dynamic local;
   switch (o) {
     case 0:
       local = 0;
       break;
     case 1:
-      local = local. /*[null]*/ isEven;
+      local = local. /*[null|powerset=1]*/ isEven;
       break;
     case 2:
     default:
@@ -134,7 +136,7 @@
   return local;
 }
 
-/*member: switchWithoutContinue:[null]*/
+/*member: switchWithoutContinue:[null|powerset=1]*/
 switchWithoutContinue() {
   _switchWithoutContinue(0);
   _switchWithoutContinue(1);
diff --git a/pkg/compiler/test/inference/data/switch1.dart b/pkg/compiler/test/inference/data/switch1.dart
index 9d02e1b..2865892 100644
--- a/pkg/compiler/test/inference/data/switch1.dart
+++ b/pkg/compiler/test/inference/data/switch1.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: foo:[exact=JSString]*/
-foo(int /*[subclass=JSInt]*/ x) {
+/*member: foo:[exact=JSString|powerset=0]*/
+foo(int /*[subclass=JSInt|powerset=0]*/ x) {
   var a = "one";
   switch (x) {
     case 1:
@@ -16,7 +16,9 @@
   return a;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
-  foo(new DateTime.now(). /*[exact=DateTime]*/ millisecondsSinceEpoch);
+  foo(
+    new DateTime.now(). /*[exact=DateTime|powerset=0]*/ millisecondsSinceEpoch,
+  );
 }
diff --git a/pkg/compiler/test/inference/data/switch2.dart b/pkg/compiler/test/inference/data/switch2.dart
index c2aaa71..5398e37 100644
--- a/pkg/compiler/test/inference/data/switch2.dart
+++ b/pkg/compiler/test/inference/data/switch2.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: foo:Value([null|exact=JSString], value: "two")*/
-foo(int /*[subclass=JSInt]*/ x) {
+/*member: foo:Value([null|exact=JSString|powerset=1], value: "two", powerset: 1)*/
+foo(int /*[subclass=JSInt|powerset=0]*/ x) {
   var a;
   switch (x) {
     case 1:
@@ -16,7 +16,9 @@
   return a;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
-  foo(new DateTime.now(). /*[exact=DateTime]*/ millisecondsSinceEpoch);
+  foo(
+    new DateTime.now(). /*[exact=DateTime|powerset=0]*/ millisecondsSinceEpoch,
+  );
 }
diff --git a/pkg/compiler/test/inference/data/switch5.dart b/pkg/compiler/test/inference/data/switch5.dart
index 3263b55..8d50041 100644
--- a/pkg/compiler/test/inference/data/switch5.dart
+++ b/pkg/compiler/test/inference/data/switch5.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: foo:[null|exact=JSUInt31]*/
-foo(int /*[subclass=JSInt]*/ x) {
+/*member: foo:[null|exact=JSUInt31|powerset=1]*/
+foo(int /*[subclass=JSInt|powerset=0]*/ x) {
   var a;
   switch (x) {
     case 1:
@@ -18,7 +18,9 @@
   return a;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
-  foo(new DateTime.now(). /*[exact=DateTime]*/ millisecondsSinceEpoch);
+  foo(
+    new DateTime.now(). /*[exact=DateTime|powerset=0]*/ millisecondsSinceEpoch,
+  );
 }
diff --git a/pkg/compiler/test/inference/data/switch6.dart b/pkg/compiler/test/inference/data/switch6.dart
index 2155d6f..8fa0245 100644
--- a/pkg/compiler/test/inference/data/switch6.dart
+++ b/pkg/compiler/test/inference/data/switch6.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: foo:[null|exact=JSUInt31]*/
-foo(int /*[subclass=JSInt]*/ x) {
+/*member: foo:[null|exact=JSUInt31|powerset=1]*/
+foo(int /*[subclass=JSInt|powerset=0]*/ x) {
   var a;
   do {
     // add extra locals scope
@@ -20,7 +20,9 @@
   return a;
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
-  foo(new DateTime.now(). /*[exact=DateTime]*/ millisecondsSinceEpoch);
+  foo(
+    new DateTime.now(). /*[exact=DateTime|powerset=0]*/ millisecondsSinceEpoch,
+  );
 }
diff --git a/pkg/compiler/test/inference/data/throw.dart b/pkg/compiler/test/inference/data/throw.dart
index 57fa354..611f8ea 100644
--- a/pkg/compiler/test/inference/data/throw.dart
+++ b/pkg/compiler/test/inference/data/throw.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   unconditionalThrow();
   conditionalThrow();
@@ -14,19 +14,19 @@
 /// Method that throws unconditionally.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: unconditionalThrow:[empty]*/
+/*member: unconditionalThrow:[empty|powerset=0]*/
 unconditionalThrow() => throw 'foo';
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Method that throws conditionally.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _conditionalThrow:[null]*/
-_conditionalThrow(/*[exact=JSBool]*/ o) {
+/*member: _conditionalThrow:[null|powerset=1]*/
+_conditionalThrow(/*[exact=JSBool|powerset=0]*/ o) {
   if (o) throw 'foo';
 }
 
-/*member: conditionalThrow:[null]*/
+/*member: conditionalThrow:[null|powerset=1]*/
 conditionalThrow() {
   _conditionalThrow(true);
   _conditionalThrow(false);
@@ -36,13 +36,13 @@
 /// Method that throws conditionally and return 0.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _conditionalThrowReturn:[exact=JSUInt31]*/
-_conditionalThrowReturn(/*[exact=JSBool]*/ o) {
+/*member: _conditionalThrowReturn:[exact=JSUInt31|powerset=0]*/
+_conditionalThrowReturn(/*[exact=JSBool|powerset=0]*/ o) {
   if (o) throw 'foo';
   return 0;
 }
 
-/*member: conditionalThrowReturn:[null]*/
+/*member: conditionalThrowReturn:[null|powerset=1]*/
 conditionalThrowReturn() {
   _conditionalThrowReturn(true);
   _conditionalThrowReturn(false);
@@ -52,7 +52,7 @@
 /// Method that rethrows unconditionally.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: unconditionalRethrow:[empty]*/
+/*member: unconditionalRethrow:[empty|powerset=0]*/
 unconditionalRethrow() {
   try {
     throw 'foo';
diff --git a/pkg/compiler/test/inference/data/try.dart b/pkg/compiler/test/inference/data/try.dart
index 35eb6f8..1e0d674 100644
--- a/pkg/compiler/test/inference/data/try.dart
+++ b/pkg/compiler/test/inference/data/try.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   emptyTryCatch();
   emptyTryFinally();
@@ -25,13 +25,13 @@
 /// Parameter passed through an empty try-catch statement.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _emptyTryCatch:[exact=JSUInt31]*/
-_emptyTryCatch(/*[exact=JSUInt31]*/ o) {
+/*member: _emptyTryCatch:[exact=JSUInt31|powerset=0]*/
+_emptyTryCatch(/*[exact=JSUInt31|powerset=0]*/ o) {
   try {} catch (e) {}
   return o;
 }
 
-/*member: emptyTryCatch:[null]*/
+/*member: emptyTryCatch:[null|powerset=1]*/
 emptyTryCatch() {
   _emptyTryCatch(0);
 }
@@ -40,13 +40,13 @@
 /// Parameter passed through an empty try-finally statement.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _emptyTryFinally:[exact=JSUInt31]*/
-_emptyTryFinally(/*[exact=JSUInt31]*/ o) {
+/*member: _emptyTryFinally:[exact=JSUInt31|powerset=0]*/
+_emptyTryFinally(/*[exact=JSUInt31|powerset=0]*/ o) {
   try {} finally {}
   return o;
 }
 
-/*member: emptyTryFinally:[null]*/
+/*member: emptyTryFinally:[null|powerset=1]*/
 emptyTryFinally() {
   _emptyTryFinally(0);
 }
@@ -55,14 +55,14 @@
 /// Parameter passed through an empty try-catch-finally statement.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _emptyTryCatchFinally:[exact=JSUInt31]*/
-_emptyTryCatchFinally(/*[exact=JSUInt31]*/ o) {
+/*member: _emptyTryCatchFinally:[exact=JSUInt31|powerset=0]*/
+_emptyTryCatchFinally(/*[exact=JSUInt31|powerset=0]*/ o) {
   try {} catch (e) {
   } finally {}
   return o;
 }
 
-/*member: emptyTryCatchFinally:[null]*/
+/*member: emptyTryCatchFinally:[null|powerset=1]*/
 emptyTryCatchFinally() {
   _emptyTryCatchFinally(0);
 }
@@ -71,7 +71,7 @@
 /// A try-catch statement with an assignment in the try block.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: tryCatchAssignmentInTry:[null|exact=JSUInt31]*/
+/*member: tryCatchAssignmentInTry:[null|exact=JSUInt31|powerset=1]*/
 tryCatchAssignmentInTry() {
   int? o = 0;
   try {
@@ -84,7 +84,7 @@
 /// A try-catch statement with an assignment in the catch block.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: tryCatchAssignmentInCatch:[null|exact=JSUInt31]*/
+/*member: tryCatchAssignmentInCatch:[null|exact=JSUInt31|powerset=1]*/
 tryCatchAssignmentInCatch() {
   int? o = 0;
   try {} catch (e) {
@@ -97,7 +97,7 @@
 /// A try-finally statement with an assignment in the finally clause.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: tryFinallyAssignmentInFinally:[null]*/
+/*member: tryFinallyAssignmentInFinally:[null|powerset=1]*/
 tryFinallyAssignmentInFinally() {
   int? o = 0;
   try {} finally {
@@ -111,7 +111,7 @@
 /// block.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: tryCatchAssignmentInTryCatch:Union(null, [exact=JSString], [exact=JSUInt31])*/
+/*member: tryCatchAssignmentInTryCatch:Union(null, [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
 tryCatchAssignmentInTryCatch() {
   dynamic o = 0;
   try {
@@ -127,7 +127,7 @@
 /// finally block.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: tryCatchAssignmentInTryFinally:[null]*/
+/*member: tryCatchAssignmentInTryFinally:[null|powerset=1]*/
 tryCatchAssignmentInTryFinally() {
   dynamic o = 0;
   try {
@@ -143,15 +143,15 @@
 /// catch clause.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _tryCatchParameterAssignmentInTry:[null|exact=JSUInt31]*/
-_tryCatchParameterAssignmentInTry(/*[exact=JSUInt31]*/ o) {
+/*member: _tryCatchParameterAssignmentInTry:[null|exact=JSUInt31|powerset=1]*/
+_tryCatchParameterAssignmentInTry(/*[exact=JSUInt31|powerset=0]*/ o) {
   try {
     o = null;
   } catch (e) {}
   return o;
 }
 
-/*member: tryCatchParameterAssignmentInTry:[null]*/
+/*member: tryCatchParameterAssignmentInTry:[null|powerset=1]*/
 tryCatchParameterAssignmentInTry() {
   _tryCatchParameterAssignmentInTry(0);
 }
@@ -161,15 +161,15 @@
 /// catch clause.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _tryCatchParameterAssignmentInCatch:[null|exact=JSUInt31]*/
-_tryCatchParameterAssignmentInCatch(/*[exact=JSUInt31]*/ o) {
+/*member: _tryCatchParameterAssignmentInCatch:[null|exact=JSUInt31|powerset=1]*/
+_tryCatchParameterAssignmentInCatch(/*[exact=JSUInt31|powerset=0]*/ o) {
   try {} catch (e) {
     o = null;
   }
   return o;
 }
 
-/*member: tryCatchParameterAssignmentInCatch:[null]*/
+/*member: tryCatchParameterAssignmentInCatch:[null|powerset=1]*/
 tryCatchParameterAssignmentInCatch() {
   _tryCatchParameterAssignmentInCatch(0);
 }
@@ -179,15 +179,15 @@
 /// finally clause.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _tryFinallyParameterAssignmentInFinally:[null]*/
-_tryFinallyParameterAssignmentInFinally(/*[exact=JSUInt31]*/ o) {
+/*member: _tryFinallyParameterAssignmentInFinally:[null|powerset=1]*/
+_tryFinallyParameterAssignmentInFinally(/*[exact=JSUInt31|powerset=0]*/ o) {
   try {} finally {
     o = null;
   }
   return o;
 }
 
-/*member: tryFinallyParameterAssignmentInFinally:[null]*/
+/*member: tryFinallyParameterAssignmentInFinally:[null|powerset=1]*/
 tryFinallyParameterAssignmentInFinally() {
   _tryFinallyParameterAssignmentInFinally(0);
 }
@@ -197,8 +197,8 @@
 /// catch clause.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _tryCatchParameterAssignmentInTryCatch:Union(null, [exact=JSString], [exact=JSUInt31])*/
-_tryCatchParameterAssignmentInTryCatch(/*[exact=JSUInt31]*/ o) {
+/*member: _tryCatchParameterAssignmentInTryCatch:Union(null, [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
+_tryCatchParameterAssignmentInTryCatch(/*[exact=JSUInt31|powerset=0]*/ o) {
   try {
     o = '';
   } catch (e) {
@@ -207,7 +207,7 @@
   return o;
 }
 
-/*member: tryCatchParameterAssignmentInTryCatch:[null]*/
+/*member: tryCatchParameterAssignmentInTryCatch:[null|powerset=1]*/
 tryCatchParameterAssignmentInTryCatch() {
   _tryCatchParameterAssignmentInTryCatch(0);
 }
@@ -217,8 +217,8 @@
 /// finally clause.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: _tryFinallyParameterAssignmentInTryFinally:[null]*/
-_tryFinallyParameterAssignmentInTryFinally(/*[exact=JSUInt31]*/ o) {
+/*member: _tryFinallyParameterAssignmentInTryFinally:[null|powerset=1]*/
+_tryFinallyParameterAssignmentInTryFinally(/*[exact=JSUInt31|powerset=0]*/ o) {
   try {
     o = '';
   } finally {
@@ -227,7 +227,7 @@
   return o;
 }
 
-/*member: tryFinallyParameterAssignmentInTryFinally:[null]*/
+/*member: tryFinallyParameterAssignmentInTryFinally:[null|powerset=1]*/
 tryFinallyParameterAssignmentInTryFinally() {
   _tryFinallyParameterAssignmentInTryFinally(0);
 }
diff --git a/pkg/compiler/test/inference/data/try_catch.dart b/pkg/compiler/test/inference/data/try_catch.dart
index e1ed4a4..140f49a 100644
--- a/pkg/compiler/test/inference/data/try_catch.dart
+++ b/pkg/compiler/test/inference/data/try_catch.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: returnInt1:[exact=JSUInt31]*/
+/*member: returnInt1:[exact=JSUInt31|powerset=0]*/
 returnInt1() {
   var a = 42;
   try {
@@ -11,7 +11,7 @@
   return a;
 }
 
-/*member: returnDyn1:Union([exact=JSString], [exact=JSUInt31])*/
+/*member: returnDyn1:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 returnDyn1() {
   dynamic a = 42;
   try {
@@ -20,7 +20,7 @@
   return a;
 }
 
-/*member: returnInt2:[exact=JSUInt31]*/
+/*member: returnInt2:[exact=JSUInt31|powerset=0]*/
 returnInt2() {
   var a = 42;
   try {
@@ -31,7 +31,7 @@
   return a;
 }
 
-/*member: returnDyn2:Union([exact=JSString], [exact=JSUInt31])*/
+/*member: returnDyn2:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 returnDyn2() {
   dynamic a = 42;
   try {
@@ -42,7 +42,7 @@
   return a;
 }
 
-/*member: returnInt3:[exact=JSUInt31]*/
+/*member: returnInt3:[exact=JSUInt31|powerset=0]*/
 returnInt3() {
   dynamic a = 42;
   try {
@@ -55,7 +55,7 @@
   return a;
 }
 
-/*member: returnDyn3:Union([exact=JSString], [exact=JSUInt31])*/
+/*member: returnDyn3:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 returnDyn3() {
   dynamic a = 42;
   try {
@@ -70,7 +70,7 @@
   return a;
 }
 
-/*member: returnInt4:[exact=JSUInt31]*/
+/*member: returnInt4:[exact=JSUInt31|powerset=0]*/
 returnInt4() {
   var a = 42;
   try {
@@ -85,10 +85,10 @@
   return a;
 }
 
-/*member: returnDyn4:Union([exact=JSString], [exact=JSUInt31])*/
+/*member: returnDyn4:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 returnDyn4() {
   dynamic a = 42;
-  if (a /*invoke: [exact=JSUInt31]*/ == 54) {
+  if (a /*invoke: [exact=JSUInt31|powerset=0]*/ == 54) {
     try {
       a = 'foo';
     } catch (e) {}
@@ -96,10 +96,10 @@
   return a;
 }
 
-/*member: returnInt5:[exact=JSUInt31]*/
+/*member: returnInt5:[exact=JSUInt31|powerset=0]*/
 returnInt5() {
   var a = 42;
-  if (a /*invoke: [exact=JSUInt31]*/ == 54) {
+  if (a /*invoke: [exact=JSUInt31|powerset=0]*/ == 54) {
     try {
       a = 42;
     } catch (e) {}
@@ -107,10 +107,10 @@
   return a;
 }
 
-/*member: returnDyn5:Union([exact=JSString], [exact=JSUInt31])*/
+/*member: returnDyn5:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 returnDyn5() {
   dynamic a = 42;
-  if (a /*invoke: [exact=JSUInt31]*/ == 54) {
+  if (a /*invoke: [exact=JSUInt31|powerset=0]*/ == 54) {
     try {
       a = 'foo';
       print(a);
@@ -120,7 +120,7 @@
   return a;
 }
 
-/*member: returnInt6:[subclass=JSInt]*/
+/*member: returnInt6:[subclass=JSInt|powerset=0]*/
 returnInt6() {
   try {
     throw 42;
@@ -131,7 +131,7 @@
   return 42;
 }
 
-/*member: returnDyn6:[subclass=Object]*/
+/*member: returnDyn6:[subclass=Object|powerset=0]*/
 returnDyn6() {
   try {
     throw 42;
@@ -140,7 +140,7 @@
   }
 }
 
-/*member: returnDyn7:[null|subclass=Object]*/
+/*member: returnDyn7:[null|subclass=Object|powerset=1]*/
 returnDyn7() {
   try {
     // Do nothing
@@ -149,7 +149,7 @@
   }
 }
 
-/*member: returnInt7:[exact=JSUInt31]*/
+/*member: returnInt7:[exact=JSUInt31|powerset=0]*/
 returnInt7() {
   dynamic a = 'foo';
   try {
@@ -159,7 +159,7 @@
   return 2;
 }
 
-/*member: returnInt8:[exact=JSUInt31]*/
+/*member: returnInt8:[exact=JSUInt31|powerset=0]*/
 returnInt8() {
   dynamic a = 'foo';
   try {
@@ -174,10 +174,10 @@
   return a;
 }
 
-/*member: returnUnion1:[null|exact=JSUInt31]*/
+/*member: returnUnion1:[null|exact=JSUInt31|powerset=1]*/
 returnUnion1() {
   dynamic a = 42;
-  if (a /*invoke: [exact=JSUInt31]*/ == 54) {
+  if (a /*invoke: [exact=JSUInt31|powerset=0]*/ == 54) {
     try {
       a = 'foo';
       throw a;
@@ -188,7 +188,7 @@
   return a;
 }
 
-/*member: returnUnion2:Union(null, [exact=JSBool], [exact=JSString], [exact=JSUInt31])*/
+/*member: returnUnion2:Union(null, [exact=JSBool|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
 returnUnion2() {
   dynamic a = 42;
   try {
@@ -200,10 +200,10 @@
   return a;
 }
 
-/*member: returnUnion3:Union([exact=JSString], [exact=JSUInt31])*/
+/*member: returnUnion3:Union([exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 returnUnion3() {
   dynamic a = 42;
-  if (a /*invoke: [exact=JSUInt31]*/ == 54) {
+  if (a /*invoke: [exact=JSUInt31|powerset=0]*/ == 54) {
     try {
       a = 'foo';
       a = null;
@@ -216,10 +216,10 @@
   return a;
 }
 
-/*member: returnUnion4:Union(null, [exact=JSString], [exact=JSUInt31])*/
+/*member: returnUnion4:Union(null, [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
 returnUnion4() {
   dynamic a = 42;
-  if (a /*invoke: [exact=JSUInt31]*/ == 54) {
+  if (a /*invoke: [exact=JSUInt31|powerset=0]*/ == 54) {
     try {
       a = 'foo';
       a = null;
@@ -228,10 +228,10 @@
   return a;
 }
 
-/*member: returnUnion5:Union([exact=JSBool], [exact=JSUInt31])*/
+/*member: returnUnion5:Union([exact=JSBool|powerset=0], [exact=JSUInt31|powerset=0], powerset: 0)*/
 returnUnion5() {
   dynamic a = 42;
-  if (a /*invoke: [exact=JSUInt31]*/ == 54) {
+  if (a /*invoke: [exact=JSUInt31|powerset=0]*/ == 54) {
     try {
       a = 'foo';
     } catch (e) {
@@ -243,7 +243,7 @@
   return a;
 }
 
-/*member: returnUnion6:Union(null, [exact=JSBool], [exact=JSString])*/
+/*member: returnUnion6:Union(null, [exact=JSBool|powerset=0], [exact=JSString|powerset=0], powerset: 1)*/
 returnUnion6() {
   dynamic a = 42;
   try {
@@ -257,7 +257,7 @@
   return a;
 }
 
-/*member: returnUnion7:Union([exact=JSBool], [exact=JSString])*/
+/*member: returnUnion7:Union([exact=JSBool|powerset=0], [exact=JSString|powerset=0], powerset: 0)*/
 returnUnion7() {
   dynamic a = 42;
   try {
@@ -269,7 +269,7 @@
   }
 }
 
-/*member: returnUnion8:[null|exact=JSUInt31]*/
+/*member: returnUnion8:[null|exact=JSUInt31|powerset=1]*/
 returnUnion8() {
   dynamic a = 5.5;
   try {
@@ -284,7 +284,7 @@
   return a;
 }
 
-/*member: returnUnion9:[exact=JSBool]*/
+/*member: returnUnion9:[exact=JSBool|powerset=0]*/
 returnUnion9() {
   dynamic a = 5.5;
   try {
@@ -298,7 +298,7 @@
   return a;
 }
 
-/*member: returnUnion10:Value([exact=JSBool], value: true)*/
+/*member: returnUnion10:Value([exact=JSBool|powerset=0], value: true, powerset: 0)*/
 returnUnion10() {
   dynamic a = 5;
   try {
@@ -314,7 +314,7 @@
   }
 }
 
-/*member: returnNull1:[null]*/
+/*member: returnNull1:[null|powerset=1]*/
 returnNull1() {
   dynamic a = 42;
   try {
@@ -327,7 +327,7 @@
   return a;
 }
 
-/*member: returnNull2:[null]*/
+/*member: returnNull2:[null|powerset=1]*/
 returnNull2() {
   dynamic a = 5.5;
   try {
@@ -342,118 +342,118 @@
   return a;
 }
 
-/*member: A.:[exact=A]*/
+/*member: A.:[exact=A|powerset=0]*/
 class A {
-  /*member: A.a:[null|exact=JSUInt31]*/
+  /*member: A.a:[null|exact=JSUInt31|powerset=1]*/
   dynamic a;
-  /*member: A.b:Union(null, [exact=JSUInt31], [exact=JsLinkedHashMap])*/
+  /*member: A.b:Union(null, [exact=JSUInt31|powerset=0], [exact=JsLinkedHashMap|powerset=0], powerset: 1)*/
   dynamic b;
-  /*member: A.c:Union(null, [exact=JSBool], [exact=JSString])*/
+  /*member: A.c:Union(null, [exact=JSBool|powerset=0], [exact=JSString|powerset=0], powerset: 1)*/
   dynamic c;
-  /*member: A.d:Value([null|exact=JSString], value: "foo")*/
+  /*member: A.d:Value([null|exact=JSString|powerset=1], value: "foo", powerset: 1)*/
   dynamic d;
-  /*member: A.e:Union(null, [exact=JSBool], [exact=JSString])*/
+  /*member: A.e:Union(null, [exact=JSBool|powerset=0], [exact=JSString|powerset=0], powerset: 1)*/
   dynamic e;
-  /*member: A.f:Union(null, [exact=JSBool], [exact=JSString])*/
+  /*member: A.f:Union(null, [exact=JSBool|powerset=0], [exact=JSString|powerset=0], powerset: 1)*/
   dynamic f;
-  /*member: A.g:Union(null, [exact=JSExtendableArray], [exact=JSNumNotInt], [exact=JSString])*/
+  /*member: A.g:Union(null, [exact=JSExtendableArray|powerset=0], [exact=JSNumNotInt|powerset=0], [exact=JSString|powerset=0], powerset: 1)*/
   dynamic g;
 
-  /*member: A.testa:Union([exact=JSBool], [exact=JSString])*/
+  /*member: A.testa:Union([exact=JSBool|powerset=0], [exact=JSString|powerset=0], powerset: 0)*/
   testa() {
     try {
       return 'foo';
     } catch (e) {
       return true;
     } finally {
-      /*update: [exact=A]*/
+      /*update: [exact=A|powerset=0]*/
       a = 55;
     }
   }
 
-  /*member: A.testb:Union([exact=JSBool], [exact=JSString])*/
+  /*member: A.testb:Union([exact=JSBool|powerset=0], [exact=JSString|powerset=0], powerset: 0)*/
   testb() {
     try {
       return 'foo';
     } catch (e) {
       return true;
     } finally {
-      /*update: [exact=A]*/
+      /*update: [exact=A|powerset=0]*/
       b = 55;
     }
     return b;
   }
 
-  /*member: A.testc:Union(null, [exact=JSBool], [exact=JSString])*/
+  /*member: A.testc:Union(null, [exact=JSBool|powerset=0], [exact=JSString|powerset=0], powerset: 1)*/
   testc() {
     try {
-      /*update: [exact=A]*/
+      /*update: [exact=A|powerset=0]*/
       c = 'foo';
-      throw /*[exact=A]*/ c;
+      throw /*[exact=A|powerset=0]*/ c;
     } catch (e) {
-      /*update: [exact=A]*/
+      /*update: [exact=A|powerset=0]*/
       c = false;
     } catch (e) {
-      /*update: [exact=A]*/
+      /*update: [exact=A|powerset=0]*/
       c = true;
     }
-    return /*[exact=A]*/ c;
+    return /*[exact=A|powerset=0]*/ c;
   }
 
-  /*member: A.testd:Value([null|exact=JSString], value: "foo")*/
+  /*member: A.testd:Value([null|exact=JSString|powerset=1], value: "foo", powerset: 1)*/
   testd() {
     try {
-      /*update: [exact=A]*/
+      /*update: [exact=A|powerset=0]*/
       d = 'foo';
     } catch (e) {
       // Do nothing
     }
-    return /*[exact=A]*/ d;
+    return /*[exact=A|powerset=0]*/ d;
   }
 
-  /*member: A.teste:Union(null, [exact=JSBool], [exact=JSString])*/
+  /*member: A.teste:Union(null, [exact=JSBool|powerset=0], [exact=JSString|powerset=0], powerset: 1)*/
   teste() {
     try {
-      /*update: [exact=A]*/
+      /*update: [exact=A|powerset=0]*/
       e = 'foo';
     } catch (_) {
-      /*update: [exact=A]*/
+      /*update: [exact=A|powerset=0]*/
       e = true;
     }
-    return /*[exact=A]*/ e;
+    return /*[exact=A|powerset=0]*/ e;
   }
 
-  /*member: A.testf:Union(null, [exact=JSBool], [exact=JSString], [exact=JSUInt31])*/
+  /*member: A.testf:Union(null, [exact=JSBool|powerset=0], [exact=JSString|powerset=0], [exact=JSUInt31|powerset=0], powerset: 1)*/
   testf() {
     try {
-      /*update: [exact=A]*/
+      /*update: [exact=A|powerset=0]*/
       f = 'foo';
       return 3;
     } catch (e) {
-      /*update: [exact=A]*/
+      /*update: [exact=A|powerset=0]*/
       f = true;
     }
-    return /*[exact=A]*/ f;
+    return /*[exact=A|powerset=0]*/ f;
   }
 
-  /*member: A.testg:Union(null, [exact=JSUInt31], [exact=JsLinkedHashMap])*/
+  /*member: A.testg:Union(null, [exact=JSUInt31|powerset=0], [exact=JsLinkedHashMap|powerset=0], powerset: 1)*/
   testg() {
     try {
-      /*update: [exact=A]*/
+      /*update: [exact=A|powerset=0]*/
       g = 'foo';
-      /*update: [exact=A]*/
+      /*update: [exact=A|powerset=0]*/
       g = 5.5;
     } catch (e) {
-      /*update: [exact=A]*/
+      /*update: [exact=A|powerset=0]*/
       g = [];
-      /*update: [exact=A]*/
+      /*update: [exact=A|powerset=0]*/
       b = {};
     }
-    return /*[exact=A]*/ b;
+    return /*[exact=A|powerset=0]*/ b;
   }
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   returnInt1();
   returnDyn1();
@@ -484,11 +484,11 @@
   returnNull2();
 
   final a = A();
-  a. /*invoke: [exact=A]*/ testa();
-  a. /*invoke: [exact=A]*/ testb();
-  a. /*invoke: [exact=A]*/ testc();
-  a. /*invoke: [exact=A]*/ testd();
-  a. /*invoke: [exact=A]*/ teste();
-  a. /*invoke: [exact=A]*/ testf();
-  a. /*invoke: [exact=A]*/ testg();
+  a. /*invoke: [exact=A|powerset=0]*/ testa();
+  a. /*invoke: [exact=A|powerset=0]*/ testb();
+  a. /*invoke: [exact=A|powerset=0]*/ testc();
+  a. /*invoke: [exact=A|powerset=0]*/ testd();
+  a. /*invoke: [exact=A|powerset=0]*/ teste();
+  a. /*invoke: [exact=A|powerset=0]*/ testf();
+  a. /*invoke: [exact=A|powerset=0]*/ testg();
 }
diff --git a/pkg/compiler/test/inference/data/type_literal.dart b/pkg/compiler/test/inference/data/type_literal.dart
index cd89563..7a48622 100644
--- a/pkg/compiler/test/inference/data/type_literal.dart
+++ b/pkg/compiler/test/inference/data/type_literal.dart
@@ -2,25 +2,26 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   typeLiteral();
   typeLiteralToString();
   typeLiteralSubstring();
 }
 
-/*member: typeLiteral:[exact=_Type]*/
+/*member: typeLiteral:[exact=_Type|powerset=0]*/
 typeLiteral() => Object;
 
-/*member: typeLiteralToString:[exact=JSString]*/
-typeLiteralToString() => (Object). /*invoke: [exact=_Type]*/ toString();
+/*member: typeLiteralToString:[exact=JSString|powerset=0]*/
+typeLiteralToString() =>
+    (Object). /*invoke: [exact=_Type|powerset=0]*/ toString();
 
-/*member: typeLiteralSubstring:[exact=JSString]*/
+/*member: typeLiteralSubstring:[exact=JSString|powerset=0]*/
 typeLiteralSubstring() {
-  String name = (List). /*invoke: [exact=_Type]*/ toString();
-  name = name. /*invoke: [exact=JSString]*/ substring(
+  String name = (List). /*invoke: [exact=_Type|powerset=0]*/ toString();
+  name = name. /*invoke: [exact=JSString|powerset=0]*/ substring(
     0,
-    name. /*invoke: [exact=JSString]*/ indexOf('<'),
+    name. /*invoke: [exact=JSString|powerset=0]*/ indexOf('<'),
   );
   return name;
 }
diff --git a/pkg/compiler/test/inference/data/unregister_call.dart b/pkg/compiler/test/inference/data/unregister_call.dart
index 9c46f2d..cabb5315 100644
--- a/pkg/compiler/test/inference/data/unregister_call.dart
+++ b/pkg/compiler/test/inference/data/unregister_call.dart
@@ -2,27 +2,28 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: a:Value([exact=JSString], value: "")*/
+/*member: a:Value([exact=JSString|powerset=0], value: "", powerset: 0)*/
 var a = '';
 
-/*member: A.:[exact=A]*/
+/*member: A.:[exact=A|powerset=0]*/
 class A {
-  /*member: A.+:[exact=JSUInt31]*/
-  operator +(/*[exact=JSUInt31]*/ other) => other;
+  /*member: A.+:[exact=JSUInt31|powerset=0]*/
+  operator +(/*[exact=JSUInt31|powerset=0]*/ other) => other;
 }
 
-/*member: foo:[exact=JSString]*/
+/*member: foo:[exact=JSString|powerset=0]*/
 foo() {
   // The following '+' call will first say that it may call A::+,
   // String::+, or int::+. After all methods have been analyzed, we know
   // that a is of type String, and therefore, this method cannot call
   // A::+. Therefore, the type of the parameter of A::+ will be the
   // one given by the other calls.
-  return a /*invoke: Value([exact=JSString], value: "")*/ + 'foo';
+  return a /*invoke: Value([exact=JSString|powerset=0], value: "", powerset: 0)*/ +
+      'foo';
 }
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
-  A() /*invoke: [exact=A]*/ + 42;
+  A() /*invoke: [exact=A|powerset=0]*/ + 42;
   foo();
 }
diff --git a/pkg/compiler/test/inference/data/use_static_types.dart b/pkg/compiler/test/inference/data/use_static_types.dart
index c0c0464..aa52bdd 100644
--- a/pkg/compiler/test/inference/data/use_static_types.dart
+++ b/pkg/compiler/test/inference/data/use_static_types.dart
@@ -2,81 +2,81 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: A.:[exact=A]*/
+/*member: A.:[exact=A|powerset=0]*/
 class A {}
 
-/*member: B.:[exact=B]*/
+/*member: B.:[exact=B|powerset=0]*/
 class B extends A {}
 
-/*member: C.:[exact=C]*/
+/*member: C.:[exact=C|powerset=0]*/
 class C {}
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   invokeFunctions();
   invokeGenericClasses();
   invokeGenericMethods();
 }
 
-/*member: invokeFunction1:[subclass=A]*/
-invokeFunction1(A Function() /*[subclass=Closure]*/ f) {
+/*member: invokeFunction1:[subclass=A|powerset=0]*/
+invokeFunction1(A Function() /*[subclass=Closure|powerset=0]*/ f) {
   return f();
 }
 
-/*member: invokeFunction2:[exact=B]*/
-invokeFunction2(B Function() /*[subclass=Closure]*/ f) {
+/*member: invokeFunction2:[exact=B|powerset=0]*/
+invokeFunction2(B Function() /*[subclass=Closure|powerset=0]*/ f) {
   return f();
 }
 
-/*member: invokeFunction3:[exact=C]*/
-invokeFunction3(C Function() /*[subclass=Closure]*/ f) {
+/*member: invokeFunction3:[exact=C|powerset=0]*/
+invokeFunction3(C Function() /*[subclass=Closure|powerset=0]*/ f) {
   return f();
 }
 
-/*member: genericFunction:[null|subclass=Object]*/
-T genericFunction<T>(T Function() /*[subclass=Closure]*/ f) => f();
+/*member: genericFunction:[null|subclass=Object|powerset=1]*/
+T genericFunction<T>(T Function() /*[subclass=Closure|powerset=0]*/ f) => f();
 
-/*member: invokeGenericFunction1:[subclass=A]*/
+/*member: invokeGenericFunction1:[subclass=A|powerset=0]*/
 invokeGenericFunction1() {
-  return genericFunction<A>(/*[exact=A]*/ () => A());
+  return genericFunction<A>(/*[exact=A|powerset=0]*/ () => A());
 }
 
-/*member: invokeGenericFunction2:[exact=B]*/
+/*member: invokeGenericFunction2:[exact=B|powerset=0]*/
 invokeGenericFunction2() {
-  return genericFunction<B>(/*[exact=B]*/ () => B());
+  return genericFunction<B>(/*[exact=B|powerset=0]*/ () => B());
 }
 
-/*member: invokeGenericFunction3:[exact=C]*/
+/*member: invokeGenericFunction3:[exact=C|powerset=0]*/
 invokeGenericFunction3() {
-  return genericFunction<C>(/*[exact=C]*/ () => C());
+  return genericFunction<C>(/*[exact=C|powerset=0]*/ () => C());
 }
 
-/*member: invokeGenericLocalFunction1:[subclass=A]*/
+/*member: invokeGenericLocalFunction1:[subclass=A|powerset=0]*/
 invokeGenericLocalFunction1() {
-  /*[null|subclass=Object]*/
-  T local<T>(T Function() /*[subclass=Closure]*/ f) => f();
-  return local<A>(/*[exact=A]*/ () => A());
+  /*[null|subclass=Object|powerset=1]*/
+  T local<T>(T Function() /*[subclass=Closure|powerset=0]*/ f) => f();
+  return local<A>(/*[exact=A|powerset=0]*/ () => A());
 }
 
-/*member: invokeGenericLocalFunction2:[exact=B]*/
+/*member: invokeGenericLocalFunction2:[exact=B|powerset=0]*/
 invokeGenericLocalFunction2() {
-  /*[null|subclass=Object]*/
-  T local<T>(T Function() /*[subclass=Closure]*/ f) => f();
-  return local<B>(/*[exact=B]*/ () => B());
+  /*[null|subclass=Object|powerset=1]*/
+  T local<T>(T Function() /*[subclass=Closure|powerset=0]*/ f) => f();
+  return local<B>(/*[exact=B|powerset=0]*/ () => B());
 }
 
-/*member: invokeGenericLocalFunction3:[exact=C]*/
+/*member: invokeGenericLocalFunction3:[exact=C|powerset=0]*/
 invokeGenericLocalFunction3() {
-  /*[null|subclass=Object]*/
-  T local<T>(T Function() /*[subclass=Closure]*/ f) => f();
-  return local<C>(/*[exact=C]*/ () => C());
+  /*[null|subclass=Object|powerset=1]*/
+  T local<T>(T Function() /*[subclass=Closure|powerset=0]*/ f) => f();
+  return local<C>(/*[exact=C|powerset=0]*/ () => C());
 }
 
-/*member: invokeFunctions:[null]*/
+/*member: invokeFunctions:[null|powerset=1]*/
 invokeFunctions() {
-  invokeFunction1(/*[exact=A]*/ () => A());
-  invokeFunction2(/*[exact=B]*/ () => B());
-  invokeFunction3(/*[exact=C]*/ () => C());
+  invokeFunction1(/*[exact=A|powerset=0]*/ () => A());
+  invokeFunction2(/*[exact=B|powerset=0]*/ () => B());
+  invokeFunction3(/*[exact=C|powerset=0]*/ () => C());
   invokeGenericFunction1();
   invokeGenericFunction2();
   invokeGenericFunction3();
@@ -86,214 +86,232 @@
 }
 
 class GenericClass<T> {
-  /*member: GenericClass.field:Union([exact=C], [subclass=A])*/
+  /*member: GenericClass.field:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
   final T field;
 
-  /*member: GenericClass.functionTypedField:[subclass=Closure]*/
+  /*member: GenericClass.functionTypedField:[subclass=Closure|powerset=0]*/
   final T Function() functionTypedField;
 
-  /*member: GenericClass.:[exact=GenericClass]*/
-  GenericClass(this. /*Union([exact=C], [subclass=A])*/ field)
-    : functionTypedField = ( /*Union([exact=C], [subclass=A])*/ () => field);
+  /*member: GenericClass.:[exact=GenericClass|powerset=0]*/
+  GenericClass(
+    this. /*Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/ field,
+  ) : functionTypedField =
+          ( /*Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/ () =>
+              field);
 
-  /*member: GenericClass.getter:Union([exact=C], [subclass=A])*/
-  T get getter => /*[subclass=GenericClass]*/ field;
+  /*member: GenericClass.getter:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
+  T get getter => /*[subclass=GenericClass|powerset=0]*/ field;
 
-  /*member: GenericClass.functionTypedGetter:[subclass=Closure]*/
-  T Function() get functionTypedGetter => /*[subclass=GenericClass]*/
+  /*member: GenericClass.functionTypedGetter:[subclass=Closure|powerset=0]*/
+  T Function() get functionTypedGetter => /*[subclass=GenericClass|powerset=0]*/
       functionTypedField;
 
-  /*member: GenericClass.method:Union([exact=C], [subclass=A])*/
-  T method() => /*[subclass=GenericClass]*/ field;
+  /*member: GenericClass.method:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
+  T method() => /*[subclass=GenericClass|powerset=0]*/ field;
 
-  /*member: GenericClass.functionTypedMethod:[subclass=Closure]*/
-  T Function() functionTypedMethod() => /*[subclass=GenericClass]*/
+  /*member: GenericClass.functionTypedMethod:[subclass=Closure|powerset=0]*/
+  T Function() functionTypedMethod() => /*[subclass=GenericClass|powerset=0]*/
       functionTypedField;
 }
 
 class GenericSubclass<T> extends GenericClass<T> {
-  /*member: GenericSubclass.:[exact=GenericSubclass]*/
-  GenericSubclass(T /*Union([exact=C], [subclass=A])*/ field) : super(field);
+  /*member: GenericSubclass.:[exact=GenericSubclass|powerset=0]*/
+  GenericSubclass(
+    T /*Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
+    field,
+  ) : super(field);
 
-  /*member: GenericSubclass.superField:Union([exact=C], [subclass=A])*/
+  /*member: GenericSubclass.superField:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
   superField() => super.field;
 
-  /*member: GenericSubclass.superGetter:Union([exact=C], [subclass=A])*/
+  /*member: GenericSubclass.superGetter:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
   superGetter() => super.getter;
 
-  /*member: GenericSubclass.superMethod:Union([exact=C], [subclass=A])*/
+  /*member: GenericSubclass.superMethod:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
   superMethod() => super.method();
 
-  /*member: GenericSubclass.superFieldInvoke:[null|subclass=Object]*/
+  /*member: GenericSubclass.superFieldInvoke:[null|subclass=Object|powerset=1]*/
   superFieldInvoke() => super.functionTypedField();
 
-  /*member: GenericSubclass.superGetterInvoke:[null|subclass=Object]*/
+  /*member: GenericSubclass.superGetterInvoke:[null|subclass=Object|powerset=1]*/
   superGetterInvoke() => super.functionTypedGetter();
 
-  /*member: GenericSubclass.superMethodInvoke:[null|subclass=Object]*/
+  /*member: GenericSubclass.superMethodInvoke:[null|subclass=Object|powerset=1]*/
   superMethodInvoke() => super.functionTypedMethod()();
 }
 
-/*member: invokeInstanceMethod1:[subclass=A]*/
-invokeInstanceMethod1(GenericClass<A> /*[exact=GenericClass]*/ c) =>
-    c. /*invoke: [exact=GenericClass]*/ method();
+/*member: invokeInstanceMethod1:[subclass=A|powerset=0]*/
+invokeInstanceMethod1(GenericClass<A> /*[exact=GenericClass|powerset=0]*/ c) =>
+    c. /*invoke: [exact=GenericClass|powerset=0]*/ method();
 
-/*member: invokeInstanceMethod2:[exact=B]*/
-invokeInstanceMethod2(GenericClass<B> /*[exact=GenericClass]*/ c) =>
-    c. /*invoke: [exact=GenericClass]*/ method();
+/*member: invokeInstanceMethod2:[exact=B|powerset=0]*/
+invokeInstanceMethod2(GenericClass<B> /*[exact=GenericClass|powerset=0]*/ c) =>
+    c. /*invoke: [exact=GenericClass|powerset=0]*/ method();
 
-/*member: invokeInstanceMethod3:[exact=C]*/
-invokeInstanceMethod3(GenericClass<C> /*[exact=GenericClass]*/ c) =>
-    c. /*invoke: [exact=GenericClass]*/ method();
+/*member: invokeInstanceMethod3:[exact=C|powerset=0]*/
+invokeInstanceMethod3(GenericClass<C> /*[exact=GenericClass|powerset=0]*/ c) =>
+    c. /*invoke: [exact=GenericClass|powerset=0]*/ method();
 
-/*member: invokeInstanceGetter1:[subclass=A]*/
-invokeInstanceGetter1(GenericClass<A> /*[exact=GenericClass]*/ c) =>
-    c. /*[exact=GenericClass]*/ getter;
+/*member: invokeInstanceGetter1:[subclass=A|powerset=0]*/
+invokeInstanceGetter1(GenericClass<A> /*[exact=GenericClass|powerset=0]*/ c) =>
+    c. /*[exact=GenericClass|powerset=0]*/ getter;
 
-/*member: invokeInstanceGetter2:[exact=B]*/
-invokeInstanceGetter2(GenericClass<B> /*[exact=GenericClass]*/ c) =>
-    c. /*[exact=GenericClass]*/ getter;
+/*member: invokeInstanceGetter2:[exact=B|powerset=0]*/
+invokeInstanceGetter2(GenericClass<B> /*[exact=GenericClass|powerset=0]*/ c) =>
+    c. /*[exact=GenericClass|powerset=0]*/ getter;
 
-/*member: invokeInstanceGetter3:[exact=C]*/
-invokeInstanceGetter3(GenericClass<C> /*[exact=GenericClass]*/ c) =>
-    c. /*[exact=GenericClass]*/ getter;
+/*member: invokeInstanceGetter3:[exact=C|powerset=0]*/
+invokeInstanceGetter3(GenericClass<C> /*[exact=GenericClass|powerset=0]*/ c) =>
+    c. /*[exact=GenericClass|powerset=0]*/ getter;
 
-/*member: accessInstanceField1:[subclass=A]*/
-accessInstanceField1(GenericClass<A> /*[exact=GenericClass]*/ c) =>
-    c. /*[exact=GenericClass]*/ field;
+/*member: accessInstanceField1:[subclass=A|powerset=0]*/
+accessInstanceField1(GenericClass<A> /*[exact=GenericClass|powerset=0]*/ c) =>
+    c. /*[exact=GenericClass|powerset=0]*/ field;
 
-/*member: accessInstanceField2:[exact=B]*/
-accessInstanceField2(GenericClass<B> /*[exact=GenericClass]*/ c) =>
-    c. /*[exact=GenericClass]*/ field;
+/*member: accessInstanceField2:[exact=B|powerset=0]*/
+accessInstanceField2(GenericClass<B> /*[exact=GenericClass|powerset=0]*/ c) =>
+    c. /*[exact=GenericClass|powerset=0]*/ field;
 
-/*member: accessInstanceField3:[exact=C]*/
-accessInstanceField3(GenericClass<C> /*[exact=GenericClass]*/ c) =>
-    c. /*[exact=GenericClass]*/ field;
+/*member: accessInstanceField3:[exact=C|powerset=0]*/
+accessInstanceField3(GenericClass<C> /*[exact=GenericClass|powerset=0]*/ c) =>
+    c. /*[exact=GenericClass|powerset=0]*/ field;
 
-/*member: invokeSuperMethod1:Union([exact=C], [subclass=A])*/
-invokeSuperMethod1(GenericSubclass<A> /*[exact=GenericSubclass]*/ c) =>
-    c. /*invoke: [exact=GenericSubclass]*/ superMethod();
+/*member: invokeSuperMethod1:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
+invokeSuperMethod1(
+  GenericSubclass<A> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superMethod();
 
-/*member: invokeSuperMethod2:Union([exact=C], [subclass=A])*/
-invokeSuperMethod2(GenericSubclass<B> /*[exact=GenericSubclass]*/ c) =>
-    c. /*invoke: [exact=GenericSubclass]*/ superMethod();
+/*member: invokeSuperMethod2:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
+invokeSuperMethod2(
+  GenericSubclass<B> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superMethod();
 
-/*member: invokeSuperMethod3:Union([exact=C], [subclass=A])*/
-invokeSuperMethod3(GenericSubclass<C> /*[exact=GenericSubclass]*/ c) =>
-    c. /*invoke: [exact=GenericSubclass]*/ superMethod();
+/*member: invokeSuperMethod3:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
+invokeSuperMethod3(
+  GenericSubclass<C> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superMethod();
 
-/*member: invokeSuperGetter1:Union([exact=C], [subclass=A])*/
-invokeSuperGetter1(GenericSubclass<A> /*[exact=GenericSubclass]*/ c) =>
-    c. /*invoke: [exact=GenericSubclass]*/ superGetter();
+/*member: invokeSuperGetter1:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
+invokeSuperGetter1(
+  GenericSubclass<A> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superGetter();
 
-/*member: invokeSuperGetter2:Union([exact=C], [subclass=A])*/
-invokeSuperGetter2(GenericSubclass<B> /*[exact=GenericSubclass]*/ c) =>
-    c. /*invoke: [exact=GenericSubclass]*/ superGetter();
+/*member: invokeSuperGetter2:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
+invokeSuperGetter2(
+  GenericSubclass<B> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superGetter();
 
-/*member: invokeSuperGetter3:Union([exact=C], [subclass=A])*/
-invokeSuperGetter3(GenericSubclass<C> /*[exact=GenericSubclass]*/ c) =>
-    c. /*invoke: [exact=GenericSubclass]*/ superGetter();
+/*member: invokeSuperGetter3:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
+invokeSuperGetter3(
+  GenericSubclass<C> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superGetter();
 
-/*member: accessSuperField1:Union([exact=C], [subclass=A])*/
-accessSuperField1(GenericSubclass<A> /*[exact=GenericSubclass]*/ c) =>
-    c. /*invoke: [exact=GenericSubclass]*/ superField();
+/*member: accessSuperField1:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
+accessSuperField1(
+  GenericSubclass<A> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superField();
 
-/*member: accessSuperField2:Union([exact=C], [subclass=A])*/
-accessSuperField2(GenericSubclass<B> /*[exact=GenericSubclass]*/ c) =>
-    c. /*invoke: [exact=GenericSubclass]*/ superField();
+/*member: accessSuperField2:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
+accessSuperField2(
+  GenericSubclass<B> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superField();
 
-/*member: accessSuperField3:Union([exact=C], [subclass=A])*/
-accessSuperField3(GenericSubclass<C> /*[exact=GenericSubclass]*/ c) =>
-    c. /*invoke: [exact=GenericSubclass]*/ superField();
+/*member: accessSuperField3:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
+accessSuperField3(
+  GenericSubclass<C> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superField();
 
-/*member: invokeFunctionTypedInstanceMethod1:[subclass=A]*/
+/*member: invokeFunctionTypedInstanceMethod1:[subclass=A|powerset=0]*/
 invokeFunctionTypedInstanceMethod1(
-  GenericClass<A> /*[exact=GenericClass]*/ c,
-) => c. /*invoke: [exact=GenericClass]*/ functionTypedMethod()();
+  GenericClass<A> /*[exact=GenericClass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericClass|powerset=0]*/ functionTypedMethod()();
 
-/*member: invokeFunctionTypedInstanceMethod2:[exact=B]*/
+/*member: invokeFunctionTypedInstanceMethod2:[exact=B|powerset=0]*/
 invokeFunctionTypedInstanceMethod2(
-  GenericClass<B> /*[exact=GenericClass]*/ c,
-) => c. /*invoke: [exact=GenericClass]*/ functionTypedMethod()();
+  GenericClass<B> /*[exact=GenericClass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericClass|powerset=0]*/ functionTypedMethod()();
 
-/*member: invokeFunctionTypedInstanceMethod3:[exact=C]*/
+/*member: invokeFunctionTypedInstanceMethod3:[exact=C|powerset=0]*/
 invokeFunctionTypedInstanceMethod3(
-  GenericClass<C> /*[exact=GenericClass]*/ c,
-) => c. /*invoke: [exact=GenericClass]*/ functionTypedMethod()();
+  GenericClass<C> /*[exact=GenericClass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericClass|powerset=0]*/ functionTypedMethod()();
 
-/*member: invokeFunctionTypedInstanceGetter1:[subclass=A]*/
+/*member: invokeFunctionTypedInstanceGetter1:[subclass=A|powerset=0]*/
 invokeFunctionTypedInstanceGetter1(
-  GenericClass<A> /*[exact=GenericClass]*/ c,
-) => c.functionTypedGetter /*invoke: [exact=GenericClass]*/ ();
+  GenericClass<A> /*[exact=GenericClass|powerset=0]*/ c,
+) => c.functionTypedGetter /*invoke: [exact=GenericClass|powerset=0]*/ ();
 
-/*member: invokeFunctionTypedInstanceGetter2:[exact=B]*/
+/*member: invokeFunctionTypedInstanceGetter2:[exact=B|powerset=0]*/
 invokeFunctionTypedInstanceGetter2(
-  GenericClass<B> /*[exact=GenericClass]*/ c,
-) => c.functionTypedGetter /*invoke: [exact=GenericClass]*/ ();
+  GenericClass<B> /*[exact=GenericClass|powerset=0]*/ c,
+) => c.functionTypedGetter /*invoke: [exact=GenericClass|powerset=0]*/ ();
 
-/*member: invokeFunctionTypedInstanceGetter3:[exact=C]*/
+/*member: invokeFunctionTypedInstanceGetter3:[exact=C|powerset=0]*/
 invokeFunctionTypedInstanceGetter3(
-  GenericClass<C> /*[exact=GenericClass]*/ c,
-) => c.functionTypedGetter /*invoke: [exact=GenericClass]*/ ();
+  GenericClass<C> /*[exact=GenericClass|powerset=0]*/ c,
+) => c.functionTypedGetter /*invoke: [exact=GenericClass|powerset=0]*/ ();
 
-/*member: invokeFunctionTypedInstanceField1:[subclass=A]*/
-invokeFunctionTypedInstanceField1(GenericClass<A> /*[exact=GenericClass]*/ c) =>
-    c.functionTypedField /*invoke: [exact=GenericClass]*/ ();
+/*member: invokeFunctionTypedInstanceField1:[subclass=A|powerset=0]*/
+invokeFunctionTypedInstanceField1(
+  GenericClass<A> /*[exact=GenericClass|powerset=0]*/ c,
+) => c.functionTypedField /*invoke: [exact=GenericClass|powerset=0]*/ ();
 
-/*member: invokeFunctionTypedInstanceField2:[exact=B]*/
-invokeFunctionTypedInstanceField2(GenericClass<B> /*[exact=GenericClass]*/ c) =>
-    c.functionTypedField /*invoke: [exact=GenericClass]*/ ();
+/*member: invokeFunctionTypedInstanceField2:[exact=B|powerset=0]*/
+invokeFunctionTypedInstanceField2(
+  GenericClass<B> /*[exact=GenericClass|powerset=0]*/ c,
+) => c.functionTypedField /*invoke: [exact=GenericClass|powerset=0]*/ ();
 
-/*member: invokeFunctionTypedInstanceField3:[exact=C]*/
-invokeFunctionTypedInstanceField3(GenericClass<C> /*[exact=GenericClass]*/ c) =>
-    c.functionTypedField /*invoke: [exact=GenericClass]*/ ();
+/*member: invokeFunctionTypedInstanceField3:[exact=C|powerset=0]*/
+invokeFunctionTypedInstanceField3(
+  GenericClass<C> /*[exact=GenericClass|powerset=0]*/ c,
+) => c.functionTypedField /*invoke: [exact=GenericClass|powerset=0]*/ ();
 
-/*member: invokeFunctionTypedSuperMethod1:[null|subclass=Object]*/
+/*member: invokeFunctionTypedSuperMethod1:[null|subclass=Object|powerset=1]*/
 invokeFunctionTypedSuperMethod1(
-  GenericSubclass<A> /*[exact=GenericSubclass]*/ c,
-) => c. /*invoke: [exact=GenericSubclass]*/ superMethodInvoke();
+  GenericSubclass<A> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superMethodInvoke();
 
-/*member: invokeFunctionTypedSuperMethod2:[null|subclass=Object]*/
+/*member: invokeFunctionTypedSuperMethod2:[null|subclass=Object|powerset=1]*/
 invokeFunctionTypedSuperMethod2(
-  GenericSubclass<B> /*[exact=GenericSubclass]*/ c,
-) => c. /*invoke: [exact=GenericSubclass]*/ superMethodInvoke();
+  GenericSubclass<B> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superMethodInvoke();
 
-/*member: invokeFunctionTypedSuperMethod3:[null|subclass=Object]*/
+/*member: invokeFunctionTypedSuperMethod3:[null|subclass=Object|powerset=1]*/
 invokeFunctionTypedSuperMethod3(
-  GenericSubclass<C> /*[exact=GenericSubclass]*/ c,
-) => c. /*invoke: [exact=GenericSubclass]*/ superMethodInvoke();
+  GenericSubclass<C> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superMethodInvoke();
 
-/*member: invokeFunctionTypedSuperGetter1:[null|subclass=Object]*/
+/*member: invokeFunctionTypedSuperGetter1:[null|subclass=Object|powerset=1]*/
 invokeFunctionTypedSuperGetter1(
-  GenericSubclass<A> /*[exact=GenericSubclass]*/ c,
-) => c. /*invoke: [exact=GenericSubclass]*/ superGetterInvoke();
+  GenericSubclass<A> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superGetterInvoke();
 
-/*member: invokeFunctionTypedSuperGetter2:[null|subclass=Object]*/
+/*member: invokeFunctionTypedSuperGetter2:[null|subclass=Object|powerset=1]*/
 invokeFunctionTypedSuperGetter2(
-  GenericSubclass<B> /*[exact=GenericSubclass]*/ c,
-) => c. /*invoke: [exact=GenericSubclass]*/ superGetterInvoke();
+  GenericSubclass<B> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superGetterInvoke();
 
-/*member: invokeFunctionTypedSuperGetter3:[null|subclass=Object]*/
+/*member: invokeFunctionTypedSuperGetter3:[null|subclass=Object|powerset=1]*/
 invokeFunctionTypedSuperGetter3(
-  GenericSubclass<C> /*[exact=GenericSubclass]*/ c,
-) => c. /*invoke: [exact=GenericSubclass]*/ superGetterInvoke();
+  GenericSubclass<C> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superGetterInvoke();
 
-/*member: invokeFunctionTypedSuperField1:[null|subclass=Object]*/
+/*member: invokeFunctionTypedSuperField1:[null|subclass=Object|powerset=1]*/
 invokeFunctionTypedSuperField1(
-  GenericSubclass<A> /*[exact=GenericSubclass]*/ c,
-) => c. /*invoke: [exact=GenericSubclass]*/ superFieldInvoke();
+  GenericSubclass<A> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superFieldInvoke();
 
-/*member: invokeFunctionTypedSuperField2:[null|subclass=Object]*/
+/*member: invokeFunctionTypedSuperField2:[null|subclass=Object|powerset=1]*/
 invokeFunctionTypedSuperField2(
-  GenericSubclass<B> /*[exact=GenericSubclass]*/ c,
-) => c. /*invoke: [exact=GenericSubclass]*/ superFieldInvoke();
+  GenericSubclass<B> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superFieldInvoke();
 
-/*member: invokeFunctionTypedSuperField3:[null|subclass=Object]*/
+/*member: invokeFunctionTypedSuperField3:[null|subclass=Object|powerset=1]*/
 invokeFunctionTypedSuperField3(
-  GenericSubclass<C> /*[exact=GenericSubclass]*/ c,
-) => c. /*invoke: [exact=GenericSubclass]*/ superFieldInvoke();
+  GenericSubclass<C> /*[exact=GenericSubclass|powerset=0]*/ c,
+) => c. /*invoke: [exact=GenericSubclass|powerset=0]*/ superFieldInvoke();
 
-/*member: invokeGenericClasses:[null]*/
+/*member: invokeGenericClasses:[null|powerset=1]*/
 invokeGenericClasses() {
   invokeInstanceMethod1(new GenericClass<A>(new A()));
   invokeInstanceMethod2(new GenericClass<B>(new B()));
@@ -336,130 +354,145 @@
   invokeFunctionTypedSuperField3(new GenericSubclass<C>(new C()));
 }
 
-/*member: genericMethod:Union([exact=C], [subclass=A])*/
-T genericMethod<T>(T /*Union([exact=C], [subclass=A])*/ t) => t;
+/*member: genericMethod:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
+T genericMethod<T>(
+  T /*Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/ t,
+) => t;
 
-/*member: functionTypedGenericMethod:[subclass=Closure]*/
+/*member: functionTypedGenericMethod:[subclass=Closure|powerset=0]*/
 T Function() functionTypedGenericMethod<T>(
-  T /*Union([exact=C], [subclass=A])*/ t,
+  T /*Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/ t,
 ) =>
-    /*Union([exact=C], [subclass=A])*/ () => t;
+    /*Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/ () =>
+        t;
 
-/*member: Class.:[exact=Class]*/
+/*member: Class.:[exact=Class|powerset=0]*/
 class Class {
-  /*member: Class.genericMethod:Union([exact=C], [subclass=A])*/
-  T genericMethod<T>(T /*Union([exact=C], [subclass=A])*/ t) => t;
+  /*member: Class.genericMethod:Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/
+  T genericMethod<T>(
+    T /*Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/ t,
+  ) => t;
 
-  /*member: Class.functionTypedGenericMethod:[subclass=Closure]*/
+  /*member: Class.functionTypedGenericMethod:[subclass=Closure|powerset=0]*/
   T Function() functionTypedGenericMethod<T>(
-    T /*Union([exact=C], [subclass=A])*/ t,
+    T /*Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/ t,
   ) =>
-      /*Union([exact=C], [subclass=A])*/ () => t;
+      /*Union([exact=C|powerset=0], [subclass=A|powerset=0], powerset: 0)*/ () =>
+          t;
 }
 
-/*member: Subclass.:[exact=Subclass]*/
+/*member: Subclass.:[exact=Subclass|powerset=0]*/
 class Subclass extends Class {
-  /*member: Subclass.superMethod1:[subclass=A]*/
+  /*member: Subclass.superMethod1:[subclass=A|powerset=0]*/
   superMethod1() {
     return super.genericMethod<A>(new A());
   }
 
-  /*member: Subclass.superMethod2:[exact=B]*/
+  /*member: Subclass.superMethod2:[exact=B|powerset=0]*/
   superMethod2() {
     return super.genericMethod<B>(new B());
   }
 
-  /*member: Subclass.superMethod3:[exact=C]*/
+  /*member: Subclass.superMethod3:[exact=C|powerset=0]*/
   superMethod3() {
     return super.genericMethod<C>(new C());
   }
 
-  /*member: Subclass.functionTypedSuperMethod1:[subclass=A]*/
+  /*member: Subclass.functionTypedSuperMethod1:[subclass=A|powerset=0]*/
   functionTypedSuperMethod1() {
     return super.functionTypedGenericMethod<A>(new A())();
   }
 
-  /*member: Subclass.functionTypedSuperMethod2:[exact=B]*/
+  /*member: Subclass.functionTypedSuperMethod2:[exact=B|powerset=0]*/
   functionTypedSuperMethod2() {
     return super.functionTypedGenericMethod<B>(new B())();
   }
 
-  /*member: Subclass.functionTypedSuperMethod3:[exact=C]*/
+  /*member: Subclass.functionTypedSuperMethod3:[exact=C|powerset=0]*/
   functionTypedSuperMethod3() {
     return super.functionTypedGenericMethod<C>(new C())();
   }
 }
 
-/*member: invokeGenericMethod1:[subclass=A]*/
-invokeGenericMethod1(A /*[exact=A]*/ a) => genericMethod<A>(a);
+/*member: invokeGenericMethod1:[subclass=A|powerset=0]*/
+invokeGenericMethod1(A /*[exact=A|powerset=0]*/ a) => genericMethod<A>(a);
 
-/*member: invokeGenericMethod2:[exact=B]*/
-invokeGenericMethod2(B /*[exact=B]*/ b) => genericMethod<B>(b);
+/*member: invokeGenericMethod2:[exact=B|powerset=0]*/
+invokeGenericMethod2(B /*[exact=B|powerset=0]*/ b) => genericMethod<B>(b);
 
-/*member: invokeGenericMethod3:[exact=C]*/
-invokeGenericMethod3(C /*[exact=C]*/ c) => genericMethod<C>(c);
+/*member: invokeGenericMethod3:[exact=C|powerset=0]*/
+invokeGenericMethod3(C /*[exact=C|powerset=0]*/ c) => genericMethod<C>(c);
 
-/*member: invokeGenericInstanceMethod1:[subclass=A]*/
+/*member: invokeGenericInstanceMethod1:[subclass=A|powerset=0]*/
 invokeGenericInstanceMethod1() =>
-    Class(). /*invoke: [exact=Class]*/ genericMethod<A>(new A());
+    Class(). /*invoke: [exact=Class|powerset=0]*/ genericMethod<A>(new A());
 
-/*member: invokeGenericInstanceMethod2:[exact=B]*/
+/*member: invokeGenericInstanceMethod2:[exact=B|powerset=0]*/
 invokeGenericInstanceMethod2() =>
-    Class(). /*invoke: [exact=Class]*/ genericMethod<B>(new B());
+    Class(). /*invoke: [exact=Class|powerset=0]*/ genericMethod<B>(new B());
 
-/*member: invokeGenericInstanceMethod3:[exact=C]*/
+/*member: invokeGenericInstanceMethod3:[exact=C|powerset=0]*/
 invokeGenericInstanceMethod3() =>
-    Class(). /*invoke: [exact=Class]*/ genericMethod<C>(new C());
+    Class(). /*invoke: [exact=Class|powerset=0]*/ genericMethod<C>(new C());
 
-/*member: invokeGenericSuperMethod1:[subclass=A]*/
+/*member: invokeGenericSuperMethod1:[subclass=A|powerset=0]*/
 invokeGenericSuperMethod1() =>
-    Subclass(). /*invoke: [exact=Subclass]*/ superMethod1();
+    Subclass(). /*invoke: [exact=Subclass|powerset=0]*/ superMethod1();
 
-/*member: invokeGenericSuperMethod2:[exact=B]*/
+/*member: invokeGenericSuperMethod2:[exact=B|powerset=0]*/
 invokeGenericSuperMethod2() =>
-    Subclass(). /*invoke: [exact=Subclass]*/ superMethod2();
+    Subclass(). /*invoke: [exact=Subclass|powerset=0]*/ superMethod2();
 
-/*member: invokeGenericSuperMethod3:[exact=C]*/
+/*member: invokeGenericSuperMethod3:[exact=C|powerset=0]*/
 invokeGenericSuperMethod3() =>
-    Subclass(). /*invoke: [exact=Subclass]*/ superMethod3();
+    Subclass(). /*invoke: [exact=Subclass|powerset=0]*/ superMethod3();
 
-/*member: invokeFunctionTypedGenericMethod1:[subclass=A]*/
-invokeFunctionTypedGenericMethod1(A /*[exact=A]*/ a) =>
+/*member: invokeFunctionTypedGenericMethod1:[subclass=A|powerset=0]*/
+invokeFunctionTypedGenericMethod1(A /*[exact=A|powerset=0]*/ a) =>
     functionTypedGenericMethod<A>(a)();
 
-/*member: invokeFunctionTypedGenericMethod2:[exact=B]*/
-invokeFunctionTypedGenericMethod2(B /*[exact=B]*/ b) =>
+/*member: invokeFunctionTypedGenericMethod2:[exact=B|powerset=0]*/
+invokeFunctionTypedGenericMethod2(B /*[exact=B|powerset=0]*/ b) =>
     functionTypedGenericMethod<B>(b)();
 
-/*member: invokeFunctionTypedGenericMethod3:[exact=C]*/
-invokeFunctionTypedGenericMethod3(C /*[exact=C]*/ c) =>
+/*member: invokeFunctionTypedGenericMethod3:[exact=C|powerset=0]*/
+invokeFunctionTypedGenericMethod3(C /*[exact=C|powerset=0]*/ c) =>
     functionTypedGenericMethod<C>(c)();
 
-/*member: invokeFunctionTypedGenericInstanceMethod1:[subclass=A]*/
+/*member: invokeFunctionTypedGenericInstanceMethod1:[subclass=A|powerset=0]*/
 invokeFunctionTypedGenericInstanceMethod1() =>
-    Class(). /*invoke: [exact=Class]*/ functionTypedGenericMethod<A>(new A())();
+    Class(). /*invoke: [exact=Class|powerset=0]*/ functionTypedGenericMethod<A>(
+      new A(),
+    )();
 
-/*member: invokeFunctionTypedGenericInstanceMethod2:[exact=B]*/
+/*member: invokeFunctionTypedGenericInstanceMethod2:[exact=B|powerset=0]*/
 invokeFunctionTypedGenericInstanceMethod2() =>
-    Class(). /*invoke: [exact=Class]*/ functionTypedGenericMethod<B>(new B())();
+    Class(). /*invoke: [exact=Class|powerset=0]*/ functionTypedGenericMethod<B>(
+      new B(),
+    )();
 
-/*member: invokeFunctionTypedGenericInstanceMethod3:[exact=C]*/
+/*member: invokeFunctionTypedGenericInstanceMethod3:[exact=C|powerset=0]*/
 invokeFunctionTypedGenericInstanceMethod3() =>
-    Class(). /*invoke: [exact=Class]*/ functionTypedGenericMethod<C>(new C())();
+    Class(). /*invoke: [exact=Class|powerset=0]*/ functionTypedGenericMethod<C>(
+      new C(),
+    )();
 
-/*member: invokeFunctionTypedGenericSuperMethod1:[subclass=A]*/
+/*member: invokeFunctionTypedGenericSuperMethod1:[subclass=A|powerset=0]*/
 invokeFunctionTypedGenericSuperMethod1() =>
-    Subclass(). /*invoke: [exact=Subclass]*/ functionTypedSuperMethod1();
+    Subclass()
+        . /*invoke: [exact=Subclass|powerset=0]*/ functionTypedSuperMethod1();
 
-/*member: invokeFunctionTypedGenericSuperMethod2:[exact=B]*/
+/*member: invokeFunctionTypedGenericSuperMethod2:[exact=B|powerset=0]*/
 invokeFunctionTypedGenericSuperMethod2() =>
-    Subclass(). /*invoke: [exact=Subclass]*/ functionTypedSuperMethod2();
+    Subclass()
+        . /*invoke: [exact=Subclass|powerset=0]*/ functionTypedSuperMethod2();
 
-/*member: invokeFunctionTypedGenericSuperMethod3:[exact=C]*/
+/*member: invokeFunctionTypedGenericSuperMethod3:[exact=C|powerset=0]*/
 invokeFunctionTypedGenericSuperMethod3() =>
-    Subclass(). /*invoke: [exact=Subclass]*/ functionTypedSuperMethod3();
+    Subclass()
+        . /*invoke: [exact=Subclass|powerset=0]*/ functionTypedSuperMethod3();
 
-/*member: invokeGenericMethods:[null]*/
+/*member: invokeGenericMethods:[null|powerset=1]*/
 invokeGenericMethods() {
   invokeGenericMethod1(new A());
   invokeGenericMethod2(new B());
diff --git a/pkg/compiler/test/inference/data/while.dart b/pkg/compiler/test/inference/data/while.dart
index cc82f71..401b492 100644
--- a/pkg/compiler/test/inference/data/while.dart
+++ b/pkg/compiler/test/inference/data/while.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   simpleWhile();
   whileNull();
@@ -20,24 +20,24 @@
 /// Simple int based while loop.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: simpleWhile:[null]*/
+/*member: simpleWhile:[null|powerset=1]*/
 simpleWhile() {
   var i = 0;
-  while (i /*invoke: [subclass=JSPositiveInt]*/ < 10) {
-    i = i /*invoke: [subclass=JSPositiveInt]*/ + 1;
+  while (i /*invoke: [subclass=JSPositiveInt|powerset=0]*/ < 10) {
+    i = i /*invoke: [subclass=JSPositiveInt|powerset=0]*/ + 1;
   }
-  i. /*invoke: [subclass=JSPositiveInt]*/ abs();
+  i. /*invoke: [subclass=JSPositiveInt|powerset=0]*/ abs();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 /// While loop with null test.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: whileNull:Value([null|exact=JSString], value: "null")*/
+/*member: whileNull:Value([null|exact=JSString|powerset=1], value: "null", powerset: 1)*/
 whileNull() {
   var o;
   while (o == null) {
-    o = o. /*invoke: [null]*/ toString();
+    o = o. /*invoke: [null|powerset=1]*/ toString();
   }
   return o;
 }
@@ -46,11 +46,11 @@
 /// While loop with not-null test.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: whileNotNull:[exact=JSString]*/
+/*member: whileNotNull:[exact=JSString|powerset=0]*/
 whileNotNull() {
   var o = '';
-  while (o /*invoke: [exact=JSString]*/ != null) {
-    o = o. /*invoke: [exact=JSString]*/ toString();
+  while (o /*invoke: [exact=JSString|powerset=0]*/ != null) {
+    o = o. /*invoke: [exact=JSString|powerset=0]*/ toString();
   }
   return o;
 }
@@ -59,11 +59,11 @@
 /// While loop with null test with an unreachable body.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: whileNullUnreachable:Value([exact=JSString], value: "")*/
+/*member: whileNullUnreachable:Value([exact=JSString|powerset=0], value: "", powerset: 0)*/
 whileNullUnreachable() {
   var o = '';
-  while (o /*invoke: [exact=JSString]*/ == null) {
-    o = o. /*invoke: [empty]*/ toString();
+  while (o /*invoke: [exact=JSString|powerset=0]*/ == null) {
+    o = o. /*invoke: [empty|powerset=0]*/ toString();
   }
   return o;
 }
@@ -72,11 +72,11 @@
 /// While loop with not-null test with an unreachable body.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: whileNotNullUnreachable:[null]*/
+/*member: whileNotNullUnreachable:[null|powerset=1]*/
 whileNotNullUnreachable() {
   var o = null;
   while (o != null) {
-    o = o. /*invoke: [empty]*/ toString();
+    o = o. /*invoke: [empty|powerset=0]*/ toString();
   }
   return o;
 }
@@ -86,32 +86,32 @@
 /// object to the [_whileUnion1] method.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class1.:[exact=Class1]*/
+/*member: Class1.:[exact=Class1|powerset=0]*/
 class Class1 {
-  /*member: Class1.field:[null|exact=Class2]*/
+  /*member: Class1.field:[null|exact=Class2|powerset=1]*/
   var field;
 }
 
-/*member: Class2.:[exact=Class2]*/
+/*member: Class2.:[exact=Class2|powerset=0]*/
 class Class2 {
-  /*member: Class2.field:[null|exact=Class1]*/
+  /*member: Class2.field:[null|exact=Class1|powerset=1]*/
   var field;
 }
 
-/*member: _whileUnion1:Union(null, [exact=Class1], [exact=Class2])*/
-_whileUnion1(/*[exact=Class1]*/ o) {
+/*member: _whileUnion1:Union(null, [exact=Class1|powerset=0], [exact=Class2|powerset=0], powerset: 1)*/
+_whileUnion1(/*[exact=Class1|powerset=0]*/ o) {
   while (o != null) {
-    o = o. /*Union([exact=Class1], [exact=Class2])*/ field;
+    o = o. /*Union([exact=Class1|powerset=0], [exact=Class2|powerset=0], powerset: 0)*/ field;
   }
   return o;
 }
 
-/*member: whileUnion1:[null]*/
+/*member: whileUnion1:[null|powerset=1]*/
 whileUnion1() {
   var c1 = Class1();
   var c2 = Class2();
-  c1. /*update: [exact=Class1]*/ field = c2;
-  c2. /*update: [exact=Class2]*/ field = c1;
+  c1. /*update: [exact=Class1|powerset=0]*/ field = c2;
+  c2. /*update: [exact=Class2|powerset=0]*/ field = c1;
   _whileUnion1(c1);
 }
 
@@ -120,32 +120,32 @@
 /// object to the [_whileUnion2] method.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class3.:[exact=Class3]*/
+/*member: Class3.:[exact=Class3|powerset=0]*/
 class Class3 {
-  /*member: Class3.field:[null|exact=Class4]*/
+  /*member: Class3.field:[null|exact=Class4|powerset=1]*/
   var field;
 }
 
-/*member: Class4.:[exact=Class4]*/
+/*member: Class4.:[exact=Class4|powerset=0]*/
 class Class4 {
-  /*member: Class4.field:[null|exact=Class3]*/
+  /*member: Class4.field:[null|exact=Class3|powerset=1]*/
   var field;
 }
 
-/*member: _whileUnion2:Union(null, [exact=Class3], [exact=Class4])*/
-_whileUnion2(/*[exact=Class4]*/ o) {
+/*member: _whileUnion2:Union(null, [exact=Class3|powerset=0], [exact=Class4|powerset=0], powerset: 1)*/
+_whileUnion2(/*[exact=Class4|powerset=0]*/ o) {
   while (o != null) {
-    o = o. /*Union([exact=Class3], [exact=Class4])*/ field;
+    o = o. /*Union([exact=Class3|powerset=0], [exact=Class4|powerset=0], powerset: 0)*/ field;
   }
   return o;
 }
 
-/*member: whileUnion2:[null]*/
+/*member: whileUnion2:[null|powerset=1]*/
 whileUnion2() {
   var c1 = Class3();
   var c2 = Class4();
-  c1. /*update: [exact=Class3]*/ field = c2;
-  c2. /*update: [exact=Class4]*/ field = c1;
+  c1. /*update: [exact=Class3|powerset=0]*/ field = c2;
+  c2. /*update: [exact=Class4|powerset=0]*/ field = c1;
   _whileUnion2(c2);
 }
 
@@ -154,32 +154,34 @@
 /// objects to the [_whileUnion3] method.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class5.:[exact=Class5]*/
+/*member: Class5.:[exact=Class5|powerset=0]*/
 class Class5 {
-  /*member: Class5.field:[null|exact=Class6]*/
+  /*member: Class5.field:[null|exact=Class6|powerset=1]*/
   var field;
 }
 
-/*member: Class6.:[exact=Class6]*/
+/*member: Class6.:[exact=Class6|powerset=0]*/
 class Class6 {
-  /*member: Class6.field:[null|exact=Class5]*/
+  /*member: Class6.field:[null|exact=Class5|powerset=1]*/
   var field;
 }
 
-/*member: _whileUnion3:Union(null, [exact=Class5], [exact=Class6])*/
-_whileUnion3(/*Union([exact=Class5], [exact=Class6])*/ o) {
+/*member: _whileUnion3:Union(null, [exact=Class5|powerset=0], [exact=Class6|powerset=0], powerset: 1)*/
+_whileUnion3(
+  /*Union([exact=Class5|powerset=0], [exact=Class6|powerset=0], powerset: 0)*/ o,
+) {
   while (o != null) {
-    o = o. /*Union([exact=Class5], [exact=Class6])*/ field;
+    o = o. /*Union([exact=Class5|powerset=0], [exact=Class6|powerset=0], powerset: 0)*/ field;
   }
   return o;
 }
 
-/*member: whileUnion3:[null]*/
+/*member: whileUnion3:[null|powerset=1]*/
 whileUnion3() {
   var c1 = Class5();
   var c2 = Class6();
-  c1. /*update: [exact=Class5]*/ field = c2;
-  c2. /*update: [exact=Class6]*/ field = c1;
+  c1. /*update: [exact=Class5|powerset=0]*/ field = c2;
+  c2. /*update: [exact=Class6|powerset=0]*/ field = c1;
   _whileUnion3(c1);
   _whileUnion3(c2);
 }
@@ -188,32 +190,32 @@
 /// While loop with is test that mixes field accesses.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class7.:[exact=Class7]*/
+/*member: Class7.:[exact=Class7|powerset=0]*/
 class Class7 {
-  /*member: Class7.field:[null|exact=Class8]*/
+  /*member: Class7.field:[null|exact=Class8|powerset=1]*/
   var field;
 }
 
-/*member: Class8.:[exact=Class8]*/
+/*member: Class8.:[exact=Class8|powerset=0]*/
 class Class8 {
-  /*member: Class8.field:[null|exact=Class7]*/
+  /*member: Class8.field:[null|exact=Class7|powerset=1]*/
   var field;
 }
 
-/*member: _whileIs:Union(null, [exact=Class7], [exact=Class8])*/
-_whileIs(/*[exact=Class7]*/ o) {
+/*member: _whileIs:Union(null, [exact=Class7|powerset=0], [exact=Class8|powerset=0], powerset: 1)*/
+_whileIs(/*[exact=Class7|powerset=0]*/ o) {
   while (o is Class7) {
-    o = o. /*[exact=Class7]*/ field;
+    o = o. /*[exact=Class7|powerset=0]*/ field;
   }
   return o;
 }
 
-/*member: whileIs:[null]*/
+/*member: whileIs:[null|powerset=1]*/
 whileIs() {
   var c1 = Class7();
   var c2 = Class8();
-  c1. /*update: [exact=Class7]*/ field = c2;
-  c2. /*update: [exact=Class8]*/ field = c1;
+  c1. /*update: [exact=Class7|powerset=0]*/ field = c2;
+  c2. /*update: [exact=Class8|powerset=0]*/ field = c1;
   _whileIs(c1);
 }
 
@@ -221,31 +223,31 @@
 /// While loop with is-not test that mixes field accesses.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: Class9.:[exact=Class9]*/
+/*member: Class9.:[exact=Class9|powerset=0]*/
 class Class9 {
-  /*member: Class9.field:[null|exact=Class10]*/
+  /*member: Class9.field:[null|exact=Class10|powerset=1]*/
   var field;
 }
 
-/*member: Class10.:[exact=Class10]*/
+/*member: Class10.:[exact=Class10|powerset=0]*/
 class Class10 {
-  /*member: Class10.field:[null|exact=Class9]*/
+  /*member: Class10.field:[null|exact=Class9|powerset=1]*/
   var field;
 }
 
-/*member: _whileIsNot:Union(null, [exact=Class10], [exact=Class9])*/
-_whileIsNot(/*[exact=Class9]*/ o) {
+/*member: _whileIsNot:Union(null, [exact=Class10|powerset=0], [exact=Class9|powerset=0], powerset: 1)*/
+_whileIsNot(/*[exact=Class9|powerset=0]*/ o) {
   while (o is! Class10) {
-    o = o. /*Union(null, [exact=Class10], [exact=Class9])*/ field;
+    o = o. /*Union(null, [exact=Class10|powerset=0], [exact=Class9|powerset=0], powerset: 1)*/ field;
   }
   return o;
 }
 
-/*member: whileIsNot:[null]*/
+/*member: whileIsNot:[null|powerset=1]*/
 whileIsNot() {
   var c1 = Class9();
   var c2 = Class10();
-  c1. /*update: [exact=Class9]*/ field = c2;
-  c2. /*update: [exact=Class10]*/ field = c1;
+  c1. /*update: [exact=Class9|powerset=0]*/ field = c2;
+  c2. /*update: [exact=Class10|powerset=0]*/ field = c1;
   _whileIsNot(c1);
 }
diff --git a/pkg/compiler/test/inference/data/yield.dart b/pkg/compiler/test/inference/data/yield.dart
index 3f89f21..6edc20d 100644
--- a/pkg/compiler/test/inference/data/yield.dart
+++ b/pkg/compiler/test/inference/data/yield.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*member: main:[null]*/
+/*member: main:[null|powerset=1]*/
 main() {
   yieldZero();
   yieldList();
@@ -15,7 +15,7 @@
 // Yield a single integer.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: yieldZero:[exact=_SyncStarIterable]*/
+/*member: yieldZero:[exact=_SyncStarIterable|powerset=0]*/
 yieldZero() sync* {
   yield 0;
 }
@@ -24,7 +24,7 @@
 // Yield a list of integers.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: yieldList:[exact=_SyncStarIterable]*/
+/*member: yieldList:[exact=_SyncStarIterable|powerset=0]*/
 yieldList() sync* {
   yield [0, 1, 2, 3];
 }
@@ -33,7 +33,7 @@
 // Yield star of a list of integers.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: yieldStarList:[exact=_SyncStarIterable]*/
+/*member: yieldStarList:[exact=_SyncStarIterable|powerset=0]*/
 yieldStarList() sync* {
   yield* [0, 1, 2, 3];
 }
@@ -42,7 +42,7 @@
 // Yield multiple integers.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: yieldMany:[exact=_SyncStarIterable]*/
+/*member: yieldMany:[exact=_SyncStarIterable|powerset=0]*/
 yieldMany() sync* {
   yield 0;
   yield 1;
@@ -54,7 +54,7 @@
 // Yield an integer and a string.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*member: yieldIntAndString:[exact=_SyncStarIterable]*/
+/*member: yieldIntAndString:[exact=_SyncStarIterable|powerset=0]*/
 yieldIntAndString() sync* {
   yield 0;
   yield '';