Java程序  |  50行  |  1.6 KB

/*
 * Copyright (C) 2014 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.
 */

public class Main {
  public static void main(String[] args) {
    if (new Main().$opt$TestFloatPhi() != 33.0f) {
      throw new Error("Unexpected result");
    }
  }

  public float $opt$TestFloatPhi() {
    float a = floatField;
    float b = 42.0f;
    if (test1) {
      // The phi for `a` will be found to be of type float.
      a = otherFloatField;
      // The phi for `b` will be found to be of type int (constants in DEX).
      b = 33.0f;
    }
    // Use a different condition to avoid having dx being too clever.
    if (test2) {
      // Type propagation now realizes that `b` must be of type float. So
      // it requests a float equivalent for `b`. Because the phi for `a` is
      // next to the phi for `b` in the phi list, the compiler used to crash,
      // assuming that a float phi following a phi *must* be for the same DEX
      // register.
      a = b;
    }
    return a;
  }

  float floatField = 4.2f;
  float otherFloatField = 42.2f;
  boolean test1 = true;
  boolean test2 = true;
}