Commit f801a6a6 authored by Nicolas Geoffray's avatar Nicolas Geoffray Committed by Android (Google) Code Review
Browse files

Merge "Do not replace a live phi with a dead phi." into mnc-dev

parents ed6193a7 fecc4659
......@@ -213,7 +213,13 @@ void SsaBuilder::EquivalentPhisCleanup() {
HPhi* phi = it.Current()->AsPhi();
HPhi* next = phi->GetNextEquivalentPhiWithSameType();
if (next != nullptr) {
phi->ReplaceWith(next);
// Make sure we do not replace a live phi with a dead phi. A live phi has been
// handled by the type propagation phase, unlike a dead phi.
if (next->IsLive()) {
phi->ReplaceWith(next);
} else {
next->ReplaceWith(phi);
}
DCHECK(next->GetNextEquivalentPhiWithSameType() == nullptr)
<< "More then one phi equivalent with type " << phi->GetType()
<< " found for phi" << phi->GetId();
......
Regression test for the SSA building of the optimizing
compiler. See comment in smali file.
# Copyright (C) 2015 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
.class public LEquivalent;
.super Ljava/lang/Object;
.method public static method([I)V
.registers 3
const/4 v0, 0
if-eq p0, v0, :first_if
move-object v0, p0
:first_if
if-eqz v0, :second_if
# Having this move-object used to confuse the type propagation
# phase of the optimizing compiler: the phase propagates types
# based on uses, but a move-object disappears after SSA, leaving
# the compiler with a reference equivalent that has no use. So
# we would consider the phi equivalent reference of v0, as dead,
# even though it is the one that has the correct type.
move-object v1, v0
:second_if
return-void
.end method
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.lang.reflect.Method;
public class Main {
// Workaround for b/18051191.
class Inner {}
public static void main(String[] args) throws Exception {
Class<?> c = Class.forName("Equivalent");
Method m = c.getMethod("method", int[].class);
int[] array = new int[7];
Object[] arguments = { array };
m.invoke(null, arguments);
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment