Optimize CF merge operations
Return incoming value if it's single
This commit is contained in:
@@ -155,12 +155,19 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
|
|||||||
TraversalOrder.BACKWARD, true, UseControlFlowInfo()
|
TraversalOrder.BACKWARD, true, UseControlFlowInfo()
|
||||||
) {
|
) {
|
||||||
instruction: Instruction, incomingEdgesData: Collection<UseControlFlowInfo> ->
|
instruction: Instruction, incomingEdgesData: Collection<UseControlFlowInfo> ->
|
||||||
val enterResult = UseControlFlowInfo()
|
val enterResult: UseControlFlowInfo
|
||||||
for (edgeData in incomingEdgesData) {
|
|
||||||
for (entry in edgeData.entries) {
|
if (incomingEdgesData.size == 1) {
|
||||||
val variableDescriptor = entry.key
|
enterResult = incomingEdgesData.single()
|
||||||
val variableUseState = entry.value
|
}
|
||||||
enterResult.put(variableDescriptor, variableUseState.merge(enterResult[variableDescriptor]))
|
else {
|
||||||
|
enterResult = UseControlFlowInfo()
|
||||||
|
for (edgeData in incomingEdgesData) {
|
||||||
|
for (entry in edgeData.entries) {
|
||||||
|
val variableDescriptor = entry.key
|
||||||
|
val variableUseState = entry.value
|
||||||
|
enterResult.put(variableDescriptor, variableUseState.merge(enterResult[variableDescriptor]))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val variableDescriptor = PseudocodeUtil.extractVariableDescriptorIfAny(instruction, true, bindingContext)
|
val variableDescriptor = PseudocodeUtil.extractVariableDescriptorIfAny(instruction, true, bindingContext)
|
||||||
@@ -207,6 +214,7 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
|
|||||||
private fun mergeIncomingEdgesDataForInitializers(
|
private fun mergeIncomingEdgesDataForInitializers(
|
||||||
incomingEdgesData: Collection<InitControlFlowInfo>
|
incomingEdgesData: Collection<InitControlFlowInfo>
|
||||||
): InitControlFlowInfo {
|
): InitControlFlowInfo {
|
||||||
|
if (incomingEdgesData.size == 1) return incomingEdgesData.single()
|
||||||
val variablesInScope = Sets.newHashSet<VariableDescriptor>()
|
val variablesInScope = Sets.newHashSet<VariableDescriptor>()
|
||||||
for (edgeData in incomingEdgesData) {
|
for (edgeData in incomingEdgesData) {
|
||||||
variablesInScope.addAll(edgeData.keys)
|
variablesInScope.addAll(edgeData.keys)
|
||||||
|
|||||||
Reference in New Issue
Block a user