Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 public class Main {
     18 
     19   /// CHECK-START-X86: int Main.p(float) liveness (after)
     20   /// CHECK:         <<Arg:f\d+>>  ParameterValue uses:[<<UseInput:\d+>>]
     21   /// CHECK-DAG:     <<Five:f\d+>> FloatConstant 5 uses:[<<UseInput>>]
     22   /// CHECK-DAG:     <<Zero:i\d+>> IntConstant 0
     23   /// CHECK-DAG:     <<MinusOne:i\d+>> IntConstant -1 uses:[<<UseInput>>]
     24   /// CHECK:         <<Base:i\d+>> X86ComputeBaseMethodAddress uses:[<<UseInput>>]
     25   /// CHECK-NEXT:    <<Load:f\d+>> X86LoadFromConstantTable [<<Base>>,<<Five>>]
     26   /// CHECK-NEXT:    <<Cond:z\d+>> LessThanOrEqual [<<Arg>>,<<Load>>]
     27   /// CHECK-NEXT:                  Select [<<Zero>>,<<MinusOne>>,<<Cond>>] liveness:<<LivSel:\d+>>
     28   /// CHECK-EVAL:    <<UseInput>> == <<LivSel>> + 1
     29 
     30   public static int p(float arg) {
     31     return (arg > 5.0f) ? 0 : -1;
     32   }
     33 
     34   /// CHECK-START-{ARM,ARM64}: void Main.testThrowIntoCatchBlock(int, java.lang.Object, int[]) liveness (after)
     35   /// CHECK-DAG:  <<IntArg:i\d+>>   ParameterValue        env_uses:[23,25]
     36   /// CHECK-DAG:  <<RefArg:l\d+>>   ParameterValue        env_uses:[11,23,25]
     37   /// CHECK-DAG:  <<Array:l\d+>>    ParameterValue        env_uses:[11,23,25]
     38   /// CHECK-DAG:  <<Const1:i\d+>>   IntConstant 1         env_uses:[23,25]
     39   /// CHECK-DAG:                    SuspendCheck          env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]]           liveness:10
     40   /// CHECK-DAG:                    NullCheck             env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:20
     41   /// CHECK-DAG:                    ArrayLength                                                               liveness:22
     42   /// CHECK-DAG:                    BoundsCheck           env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:24
     43   /// CHECK-DAG:                    TryBoundary
     44 
     45   /// CHECK-START-{ARM,ARM64}-DEBUGGABLE: void Main.testThrowIntoCatchBlock(int, java.lang.Object, int[]) liveness (after)
     46   /// CHECK-DAG:  <<IntArg:i\d+>>   ParameterValue        env_uses:[11,23,25]
     47   /// CHECK-DAG:  <<RefArg:l\d+>>   ParameterValue        env_uses:[11,23,25]
     48   /// CHECK-DAG:  <<Array:l\d+>>    ParameterValue        env_uses:[11,23,25]
     49   /// CHECK-DAG:  <<Const1:i\d+>>   IntConstant 1         env_uses:[23,25]
     50   /// CHECK-DAG:                    SuspendCheck          env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]]           liveness:10
     51   /// CHECK-DAG:                    NullCheck             env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:20
     52   /// CHECK-DAG:                    ArrayLength                                                               liveness:22
     53   /// CHECK-DAG:                    BoundsCheck           env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:24
     54   /// CHECK-DAG:                    TryBoundary
     55 
     56   // X86 and X86_64 generate at use site the ArrayLength, meaning only the BoundsCheck will have environment uses.
     57   /// CHECK-START-{X86,X86_64}: void Main.testThrowIntoCatchBlock(int, java.lang.Object, int[]) liveness (after)
     58   /// CHECK-DAG:  <<IntArg:i\d+>>   ParameterValue        env_uses:[25]
     59   /// CHECK-DAG:  <<RefArg:l\d+>>   ParameterValue        env_uses:[11,25]
     60   /// CHECK-DAG:  <<Array:l\d+>>    ParameterValue        env_uses:[11,25]
     61   /// CHECK-DAG:  <<Const1:i\d+>>   IntConstant 1         env_uses:[25]
     62   /// CHECK-DAG:                    SuspendCheck          env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]]           liveness:10
     63   /// CHECK-DAG:                    NullCheck             env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:20
     64   /// CHECK-DAG:                    ArrayLength                                                               liveness:22
     65   /// CHECK-DAG:                    BoundsCheck           env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:24
     66   /// CHECK-DAG:                    TryBoundary
     67 
     68   /// CHECK-START-{X86,X86_64}-DEBUGGABLE: void Main.testThrowIntoCatchBlock(int, java.lang.Object, int[]) liveness (after)
     69   /// CHECK-DAG:  <<IntArg:i\d+>>   ParameterValue        env_uses:[11,25]
     70   /// CHECK-DAG:  <<RefArg:l\d+>>   ParameterValue        env_uses:[11,25]
     71   /// CHECK-DAG:  <<Array:l\d+>>    ParameterValue        env_uses:[11,25]
     72   /// CHECK-DAG:  <<Const1:i\d+>>   IntConstant 1         env_uses:[25]
     73   /// CHECK-DAG:                    SuspendCheck          env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]]           liveness:10
     74   /// CHECK-DAG:                    NullCheck             env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:20
     75   /// CHECK-DAG:                    ArrayLength                                                               liveness:22
     76   /// CHECK-DAG:                    BoundsCheck           env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:24
     77   /// CHECK-DAG:                    TryBoundary
     78 
     79   //
     80   // A value live at a throwing instruction in a try block may be copied by
     81   // the exception handler to its location at the top of the catch block.
     82   public static void testThrowIntoCatchBlock(int x, Object y, int[] a) {
     83     try {
     84       a[1] = x;
     85     } catch (ArrayIndexOutOfBoundsException exception) {
     86     }
     87   }
     88 
     89   /// CHECK-START-{ARM,ARM64}: void Main.testBoundsCheck(int, java.lang.Object, int[]) liveness (after)
     90   /// CHECK-DAG:  <<IntArg:i\d+>>   ParameterValue        env_uses:[]
     91   /// CHECK-DAG:  <<RefArg:l\d+>>   ParameterValue        env_uses:[11,19,21]
     92   /// CHECK-DAG:  <<Array:l\d+>>    ParameterValue        env_uses:[11,19,21]
     93   /// CHECK-DAG:  <<Const1:i\d+>>   IntConstant 1         env_uses:[]
     94   /// CHECK-DAG:                    SuspendCheck          env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]]           liveness:10
     95   /// CHECK-DAG:                    NullCheck             env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:16
     96   /// CHECK-DAG:                    ArrayLength                                                               liveness:18
     97   /// CHECK-DAG:                    BoundsCheck           env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:20
     98 
     99   /// CHECK-START-{ARM,ARM64}-DEBUGGABLE: void Main.testBoundsCheck(int, java.lang.Object, int[]) liveness (after)
    100   /// CHECK-DAG:  <<IntArg:i\d+>>   ParameterValue        env_uses:[11,19,21]
    101   /// CHECK-DAG:  <<RefArg:l\d+>>   ParameterValue        env_uses:[11,19,21]
    102   /// CHECK-DAG:  <<Array:l\d+>>    ParameterValue        env_uses:[11,19,21]
    103   /// CHECK-DAG:  <<Const1:i\d+>>   IntConstant 1         env_uses:[19,21]
    104   /// CHECK-DAG:                    SuspendCheck          env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]]           liveness:10
    105   /// CHECK-DAG:                    NullCheck             env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:16
    106   /// CHECK-DAG:                    ArrayLength                                                               liveness:18
    107   /// CHECK-DAG:                    BoundsCheck           env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:20
    108 
    109   /// CHECK-START-{X86,X86_64}: void Main.testBoundsCheck(int, java.lang.Object, int[]) liveness (after)
    110   /// CHECK-DAG:  <<IntArg:i\d+>>   ParameterValue        env_uses:[]
    111   /// CHECK-DAG:  <<RefArg:l\d+>>   ParameterValue        env_uses:[11,21]
    112   /// CHECK-DAG:  <<Array:l\d+>>    ParameterValue        env_uses:[11,21]
    113   /// CHECK-DAG:  <<Const1:i\d+>>   IntConstant 1         env_uses:[]
    114   /// CHECK-DAG:                    SuspendCheck          env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]]           liveness:10
    115   /// CHECK-DAG:                    NullCheck             env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:16
    116   /// CHECK-DAG:                    ArrayLength                                                               liveness:18
    117   /// CHECK-DAG:                    BoundsCheck           env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:20
    118 
    119   /// CHECK-START-{X86,X86_64}-DEBUGGABLE: void Main.testBoundsCheck(int, java.lang.Object, int[]) liveness (after)
    120   /// CHECK-DAG:  <<IntArg:i\d+>>   ParameterValue        env_uses:[11,21]
    121   /// CHECK-DAG:  <<RefArg:l\d+>>   ParameterValue        env_uses:[11,21]
    122   /// CHECK-DAG:  <<Array:l\d+>>    ParameterValue        env_uses:[11,21]
    123   /// CHECK-DAG:  <<Const1:i\d+>>   IntConstant 1         env_uses:[21]
    124   /// CHECK-DAG:                    SuspendCheck          env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]]           liveness:10
    125   /// CHECK-DAG:                    NullCheck             env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:16
    126   /// CHECK-DAG:                    ArrayLength                                                               liveness:18
    127   /// CHECK-DAG:                    BoundsCheck           env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:20
    128   public static void testBoundsCheck(int x, Object y, int[] a) {
    129     a[1] = x;
    130   }
    131 
    132   /// CHECK-START: void Main.testDeoptimize(int, java.lang.Object, int[]) liveness (after)
    133   /// CHECK-DAG:  <<IntArg:i\d+>>   ParameterValue        env_uses:[25]
    134   /// CHECK-DAG:  <<RefArg:l\d+>>   ParameterValue        env_uses:[13,21,25]
    135   /// CHECK-DAG:  <<Array:l\d+>>    ParameterValue        env_uses:[13,21,25]
    136   /// CHECK-DAG:  <<Const0:i\d+>>   IntConstant 0         env_uses:[25]
    137   /// CHECK-DAG:                    SuspendCheck          env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]]           liveness:12
    138   /// CHECK-DAG:                    NullCheck             env:[[<<Const0>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:18
    139   /// CHECK-DAG:                    ArrayLength                                                               liveness:20
    140   /// CHECK-DAG:                    Deoptimize            env:[[<<Const0>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:24
    141 
    142   /// CHECK-START-{ARM,ARM64}-DEBUGGABLE: void Main.testDeoptimize(int, java.lang.Object, int[]) liveness (after)
    143   /// CHECK-DAG:  <<IntArg:i\d+>>   ParameterValue        env_uses:[13,21,25]
    144   /// CHECK-DAG:  <<RefArg:l\d+>>   ParameterValue        env_uses:[13,21,25]
    145   /// CHECK-DAG:  <<Array:l\d+>>    ParameterValue        env_uses:[13,21,25]
    146   /// CHECK-DAG:  <<Const0:i\d+>>   IntConstant 0         env_uses:[21,25]
    147   /// CHECK-DAG:                    SuspendCheck          env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]]           liveness:12
    148   /// CHECK-DAG:                    NullCheck             env:[[<<Const0>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:18
    149   /// CHECK-DAG:                    ArrayLength                                                               liveness:20
    150   /// CHECK-DAG:                    Deoptimize            env:[[<<Const0>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:24
    151 
    152   /// CHECK-START-{X86,X86_64}-DEBUGGABLE: void Main.testDeoptimize(int, java.lang.Object, int[]) liveness (after)
    153   /// CHECK-DAG:  <<IntArg:i\d+>>   ParameterValue        env_uses:[13,21,25]
    154   /// CHECK-DAG:  <<RefArg:l\d+>>   ParameterValue        env_uses:[13,21,25]
    155   /// CHECK-DAG:  <<Array:l\d+>>    ParameterValue        env_uses:[13,21,25]
    156   /// CHECK-DAG:  <<Const0:i\d+>>   IntConstant 0         env_uses:[21,25]
    157   /// CHECK-DAG:                    SuspendCheck          env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]]           liveness:12
    158   /// CHECK-DAG:                    NullCheck             env:[[<<Const0>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:18
    159   /// CHECK-DAG:                    ArrayLength                                                               liveness:20
    160   /// CHECK-DAG:                    Deoptimize            env:[[<<Const0>>,<<IntArg>>,<<RefArg>>,<<Array>>]]  liveness:24
    161   //
    162   // A value that's not live in compiled code may still be needed in interpreter,
    163   // due to code motion, etc.
    164   public static void testDeoptimize(int x, Object y, int[] a) {
    165     a[0] = x;
    166     a[1] = x;
    167   }
    168 
    169 
    170   /// CHECK-START: void Main.main(java.lang.String[]) liveness (after)
    171   /// CHECK:         <<X:i\d+>>    ArrayLength uses:[<<UseInput:\d+>>]
    172   /// CHECK:         <<Y:i\d+>>    StaticFieldGet uses:[<<UseInput>>]
    173   /// CHECK:         <<Cond:z\d+>> LessThanOrEqual [<<X>>,<<Y>>]
    174   /// CHECK-NEXT:                  If [<<Cond>>] liveness:<<LivIf:\d+>>
    175   /// CHECK-EVAL:    <<UseInput>> == <<LivIf>> + 1
    176 
    177   public static void main(String[] args) {
    178     int x = args.length;
    179     int y = field;
    180     if (x > y) {
    181       System.nanoTime();
    182     }
    183 
    184     int val = 14;
    185     int[] array = new int[2];
    186     Integer intObj = Integer.valueOf(0);
    187     testThrowIntoCatchBlock(val, intObj, array);
    188     testBoundsCheck(val, intObj, array);
    189     testDeoptimize(val, intObj, array);
    190   }
    191 
    192 
    193   public static int field = 42;
    194 }
    195