Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(112)

Side by Side Diff: runtime/vm/flow_graph.cc

Issue 1950553002: VM: Remove PushTempInstr, simplify SSA renaming. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/constant_propagator.cc ('k') | runtime/vm/flow_graph_builder.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/flow_graph.h" 5 #include "vm/flow_graph.h"
6 6
7 #include "vm/bit_vector.h" 7 #include "vm/bit_vector.h"
8 #include "vm/cha.h" 8 #include "vm/cha.h"
9 #include "vm/flow_graph_builder.h" 9 #include "vm/flow_graph_builder.h"
10 #include "vm/flow_graph_compiler.h" 10 #include "vm/flow_graph_compiler.h"
(...skipping 1062 matching lines...) Expand 10 before | Expand all | Expand 10 after
1073 Instruction* current = it.Current(); 1073 Instruction* current = it.Current();
1074 1074
1075 // Attach current environment to the instructions that need it. 1075 // Attach current environment to the instructions that need it.
1076 if (current->NeedsEnvironment()) { 1076 if (current->NeedsEnvironment()) {
1077 AttachEnvironment(current, env); 1077 AttachEnvironment(current, env);
1078 } 1078 }
1079 1079
1080 // 2a. Handle uses: 1080 // 2a. Handle uses:
1081 // Update the expression stack renaming environment for each use by 1081 // Update the expression stack renaming environment for each use by
1082 // removing the renamed value. 1082 // removing the renamed value.
1083 // For each use of a LoadLocal, StoreLocal, or Constant: Replace it with 1083 // For each use of a LoadLocal, StoreLocal, DropTemps or Constant: Replace
1084 // the renamed value. 1084 // it with the renamed value.
1085 for (intptr_t i = current->InputCount() - 1; i >= 0; --i) { 1085 for (intptr_t i = current->InputCount() - 1; i >= 0; --i) {
1086 Value* v = current->InputAt(i); 1086 Value* v = current->InputAt(i);
1087 // Update expression stack. 1087 // Update expression stack.
1088 ASSERT(env->length() > variable_count()); 1088 ASSERT(env->length() > variable_count());
1089 1089
1090 Definition* reaching_defn = env->RemoveLast(); 1090 Definition* reaching_defn = env->RemoveLast();
1091 Definition* input_defn = v->definition(); 1091 Definition* input_defn = v->definition();
1092 if (input_defn->IsLoadLocal() || 1092 if (input_defn->IsLoadLocal() ||
1093 input_defn->IsStoreLocal() || 1093 input_defn->IsStoreLocal() ||
1094 input_defn->IsPushTemp() ||
1095 input_defn->IsDropTemps() || 1094 input_defn->IsDropTemps() ||
1096 input_defn->IsConstant()) { 1095 input_defn->IsConstant()) {
1097 // Remove the load/store from the graph.
1098 input_defn->RemoveFromGraph();
1099 // Assert we are not referencing nulls in the initial environment. 1096 // Assert we are not referencing nulls in the initial environment.
1100 ASSERT(reaching_defn->ssa_temp_index() != -1); 1097 ASSERT(reaching_defn->ssa_temp_index() != -1);
1101 v->set_definition(reaching_defn); 1098 v->set_definition(reaching_defn);
1102 input_defn = reaching_defn; 1099 input_defn = reaching_defn;
1103 } 1100 }
Vyacheslav Egorov (Google) 2016/05/03 20:04:51 I think this can be rewritten as: if (input_defn
Florian Schneider 2016/05/09 14:47:20 This should work - it's a little subtle. I'll add
1104 input_defn->AddInputUse(v); 1101 input_defn->AddInputUse(v);
1105 } 1102 }
1106 1103
1107 // Drop pushed arguments for calls. 1104 // Drop pushed arguments for calls.
1108 for (intptr_t j = 0; j < current->ArgumentCount(); j++) { 1105 for (intptr_t j = 0; j < current->ArgumentCount(); j++) {
1109 env->RemoveLast(); 1106 env->RemoveLast();
1110 } 1107 }
1111 1108
1112 // 2b. Handle LoadLocal, StoreLocal, and Constant. 1109 // 2b. Handle LoadLocal, StoreLocal, DropTemps and Constant.
1113 Definition* definition = current->AsDefinition(); 1110 Definition* definition = current->AsDefinition();
1114 if (definition != NULL) { 1111 if (definition != NULL) {
1115 LoadLocalInstr* load = definition->AsLoadLocal(); 1112 LoadLocalInstr* load = definition->AsLoadLocal();
1116 StoreLocalInstr* store = definition->AsStoreLocal(); 1113 StoreLocalInstr* store = definition->AsStoreLocal();
1117 PushTempInstr* push = definition->AsPushTemp();
1118 DropTempsInstr* drop = definition->AsDropTemps(); 1114 DropTempsInstr* drop = definition->AsDropTemps();
1119 ConstantInstr* constant = definition->AsConstant(); 1115 ConstantInstr* constant = definition->AsConstant();
1120 if ((load != NULL) || 1116 if ((load != NULL) ||
1121 (store != NULL) || 1117 (store != NULL) ||
1122 (push != NULL) ||
1123 (drop != NULL) || 1118 (drop != NULL) ||
1124 (constant != NULL)) { 1119 (constant != NULL)) {
1125 Definition* result = NULL; 1120 Definition* result = NULL;
1126 if (store != NULL) { 1121 if (store != NULL) {
1127 // Update renaming environment. 1122 // Update renaming environment.
1128 intptr_t index = store->local().BitIndexIn(num_non_copied_params_); 1123 intptr_t index = store->local().BitIndexIn(num_non_copied_params_);
1129 result = store->value()->definition(); 1124 result = store->value()->definition();
1130 1125
1131 if (!FLAG_prune_dead_locals || 1126 if (!FLAG_prune_dead_locals ||
1132 variable_liveness->IsStoreAlive(block_entry, store)) { 1127 variable_liveness->IsStoreAlive(block_entry, store)) {
(...skipping 18 matching lines...) Expand all
1151 variable_liveness->IsLastLoad(block_entry, load)) { 1146 variable_liveness->IsLastLoad(block_entry, load)) {
1152 (*env)[index] = constant_dead(); 1147 (*env)[index] = constant_dead();
1153 } 1148 }
1154 1149
1155 // Record captured parameters so that they can be skipped when 1150 // Record captured parameters so that they can be skipped when
1156 // emitting sync code inside optimized try-blocks. 1151 // emitting sync code inside optimized try-blocks.
1157 if (load->local().is_captured_parameter()) { 1152 if (load->local().is_captured_parameter()) {
1158 intptr_t index = load->local().BitIndexIn(num_non_copied_params_); 1153 intptr_t index = load->local().BitIndexIn(num_non_copied_params_);
1159 captured_parameters_->Add(index); 1154 captured_parameters_->Add(index);
1160 } 1155 }
1161
1162 } else if (push != NULL) {
1163 result = push->value()->definition();
1164 env->Add(result);
1165 it.RemoveCurrentFromGraph();
1166 continue;
1167 } else if (drop != NULL) { 1156 } else if (drop != NULL) {
1168 // Drop temps from the environment. 1157 // Drop temps from the environment.
1169 for (intptr_t j = 0; j < drop->num_temps(); j++) { 1158 for (intptr_t j = 0; j < drop->num_temps(); j++) {
1170 env->RemoveLast(); 1159 env->RemoveLast();
1171 } 1160 }
1172 if (drop->value() != NULL) { 1161 if (drop->value() != NULL) {
1173 result = drop->value()->definition(); 1162 result = drop->value()->definition();
1174 } 1163 }
1175 ASSERT((drop->value() != NULL) || !drop->HasTemp()); 1164 ASSERT((drop->value() != NULL) || !drop->HasTemp());
1176 } else { 1165 } else {
1177 ASSERT(definition->HasTemp()); 1166 ASSERT(definition->HasTemp());
1178 result = GetConstant(constant->value()); 1167 result = GetConstant(constant->value());
1179 } 1168 }
1180 // Update expression stack or remove from graph. 1169 // Update expression stack or remove from graph.
1181 if (definition->HasTemp()) { 1170 if (definition->HasTemp()) {
1182 ASSERT(result != NULL); 1171 ASSERT(result != NULL);
1183 env->Add(result); 1172 env->Add(result);
1184 // We remove load/store/constant instructions when we find their
1185 // use in 2a.
1186 } else {
1187 it.RemoveCurrentFromGraph();
1188 } 1173 }
1174 it.RemoveCurrentFromGraph();
1189 } else { 1175 } else {
1190 // Not a load, store, or constant. 1176 // Not a load, store, drop or constant.
1191 if (definition->HasTemp()) { 1177 if (definition->HasTemp()) {
1192 // Assign fresh SSA temporary and update expression stack. 1178 // Assign fresh SSA temporary and update expression stack.
1193 AllocateSSAIndexes(definition); 1179 AllocateSSAIndexes(definition);
1194 env->Add(definition); 1180 env->Add(definition);
1195 } 1181 }
1196 } 1182 }
1197 } 1183 }
1198 1184
1199 // 2c. Handle pushed argument. 1185 // 2c. Handle pushed argument.
1200 PushArgumentInstr* push = current->AsPushArgument(); 1186 PushArgumentInstr* push = current->AsPushArgument();
(...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after
2060 ReplaceCurrentInstruction(&it, current, replacement); 2046 ReplaceCurrentInstruction(&it, current, replacement);
2061 changed = true; 2047 changed = true;
2062 } 2048 }
2063 } 2049 }
2064 } 2050 }
2065 return changed; 2051 return changed;
2066 } 2052 }
2067 2053
2068 2054
2069 } // namespace dart 2055 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/constant_propagator.cc ('k') | runtime/vm/flow_graph_builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698