Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2014 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 import java.lang.reflect.Method;
     18 
     19 public class Main {
     20 
     21   // Workaround for b/18051191.
     22   class InnerClass {}
     23 
     24   public static void assertFalse(boolean condition) {
     25     if (condition) {
     26       throw new Error();
     27     }
     28   }
     29 
     30   public static void assertIntEquals(int expected, int result) {
     31     if (expected != result) {
     32       throw new Error("Expected: " + expected + ", found: " + result);
     33     }
     34   }
     35 
     36   public static void assertLongEquals(long expected, long result) {
     37     if (expected != result) {
     38       throw new Error("Expected: " + expected + ", found: " + result);
     39     }
     40   }
     41 
     42   public static void assertFloatEquals(float expected, float result) {
     43     if (expected != result) {
     44       throw new Error("Expected: " + expected + ", found: " + result);
     45     }
     46   }
     47 
     48   public static void assertDoubleEquals(double expected, double result) {
     49     if (expected != result) {
     50       throw new Error("Expected: " + expected + ", found: " + result);
     51     }
     52   }
     53 
     54   private static int $inline$int(int x) {
     55     return x;
     56   }
     57 
     58   private static long $inline$long(long x) {
     59     return x;
     60   }
     61 
     62   private static float $inline$float(float x) {
     63     return x;
     64   }
     65 
     66   private static double $inline$double(double x) {
     67     return x;
     68   }
     69 
     70   // Wrappers around methods located in file TestCmp.smali.
     71 
     72   public int smaliCmpLongConstants() throws Exception {
     73     Method m = testCmp.getMethod("$opt$CmpLongConstants");
     74     return (Integer)m.invoke(null);
     75   }
     76   public int smaliCmpGtFloatConstants() throws Exception {
     77     Method m = testCmp.getMethod("$opt$CmpGtFloatConstants");
     78     return (Integer)m.invoke(null);
     79   }
     80   public int smaliCmpLtFloatConstants() throws Exception {
     81     Method m = testCmp.getMethod("$opt$CmpLtFloatConstants");
     82     return (Integer)m.invoke(null);
     83   }
     84   public int smaliCmpGtDoubleConstants() throws Exception {
     85     Method m = testCmp.getMethod("$opt$CmpGtDoubleConstants");
     86     return (Integer)m.invoke(null);
     87   }
     88   public int smaliCmpLtDoubleConstants() throws Exception {
     89     Method m = testCmp.getMethod("$opt$CmpLtDoubleConstants");
     90     return (Integer)m.invoke(null);
     91   }
     92 
     93   public int smaliCmpLongSameConstant() throws Exception {
     94     Method m = testCmp.getMethod("$opt$CmpLongSameConstant");
     95     return (Integer)m.invoke(null);
     96   }
     97   public int smaliCmpGtFloatSameConstant() throws Exception {
     98     Method m = testCmp.getMethod("$opt$CmpGtFloatSameConstant");
     99     return (Integer)m.invoke(null);
    100   }
    101   public int smaliCmpLtFloatSameConstant() throws Exception {
    102     Method m = testCmp.getMethod("$opt$CmpLtFloatSameConstant");
    103     return (Integer)m.invoke(null);
    104   }
    105   public int smaliCmpGtDoubleSameConstant() throws Exception {
    106     Method m = testCmp.getMethod("$opt$CmpGtDoubleSameConstant");
    107     return (Integer)m.invoke(null);
    108   }
    109   public int smaliCmpLtDoubleSameConstant() throws Exception {
    110     Method m = testCmp.getMethod("$opt$CmpLtDoubleSameConstant");
    111     return (Integer)m.invoke(null);
    112   }
    113 
    114   public int smaliCmpGtFloatConstantWithNaN() throws Exception {
    115     Method m = testCmp.getMethod("$opt$CmpGtFloatConstantWithNaN");
    116     return (Integer)m.invoke(null);
    117   }
    118   public int smaliCmpLtFloatConstantWithNaN() throws Exception {
    119     Method m = testCmp.getMethod("$opt$CmpLtFloatConstantWithNaN");
    120     return (Integer)m.invoke(null);
    121   }
    122   public int smaliCmpGtDoubleConstantWithNaN() throws Exception {
    123     Method m = testCmp.getMethod("$opt$CmpGtDoubleConstantWithNaN");
    124     return (Integer)m.invoke(null);
    125   }
    126   public int smaliCmpLtDoubleConstantWithNaN() throws Exception {
    127     Method m = testCmp.getMethod("$opt$CmpLtDoubleConstantWithNaN");
    128     return (Integer)m.invoke(null);
    129   }
    130 
    131 
    132   /**
    133    * Exercise constant folding on negation.
    134    */
    135 
    136   /// CHECK-START: int Main.IntNegation() constant_folding (before)
    137   /// CHECK-DAG:     <<Const42:i\d+>>  IntConstant 42
    138   /// CHECK-DAG:     <<Neg:i\d+>>      Neg [<<Const42>>]
    139   /// CHECK-DAG:                       Return [<<Neg>>]
    140 
    141   /// CHECK-START: int Main.IntNegation() constant_folding (after)
    142   /// CHECK-DAG:     <<ConstN42:i\d+>> IntConstant -42
    143   /// CHECK-DAG:                       Return [<<ConstN42>>]
    144 
    145   /// CHECK-START: int Main.IntNegation() constant_folding (after)
    146   /// CHECK-NOT:                       Neg
    147 
    148   public static int IntNegation() {
    149     int x, y;
    150     x = 42;
    151     y = -x;
    152     return y;
    153   }
    154 
    155   /// CHECK-START: long Main.LongNegation() constant_folding (before)
    156   /// CHECK-DAG:     <<Const42:j\d+>>  LongConstant 42
    157   /// CHECK-DAG:     <<Neg:j\d+>>      Neg [<<Const42>>]
    158   /// CHECK-DAG:                       Return [<<Neg>>]
    159 
    160   /// CHECK-START: long Main.LongNegation() constant_folding (after)
    161   /// CHECK-DAG:     <<ConstN42:j\d+>> LongConstant -42
    162   /// CHECK-DAG:                       Return [<<ConstN42>>]
    163 
    164   /// CHECK-START: long Main.LongNegation() constant_folding (after)
    165   /// CHECK-NOT:                       Neg
    166 
    167   public static long LongNegation() {
    168     long x, y;
    169     x = 42L;
    170     y = -x;
    171     return y;
    172   }
    173 
    174   /// CHECK-START: float Main.FloatNegation() constant_folding (before)
    175   /// CHECK-DAG:     <<Const42:f\d+>>  FloatConstant 42
    176   /// CHECK-DAG:     <<Neg:f\d+>>      Neg [<<Const42>>]
    177   /// CHECK-DAG:                       Return [<<Neg>>]
    178 
    179   /// CHECK-START: float Main.FloatNegation() constant_folding (after)
    180   /// CHECK-DAG:     <<ConstN42:f\d+>> FloatConstant -42
    181   /// CHECK-DAG:                       Return [<<ConstN42>>]
    182 
    183   /// CHECK-START: float Main.FloatNegation() constant_folding (after)
    184   /// CHECK-NOT:                       Neg
    185 
    186   public static float FloatNegation() {
    187     float x, y;
    188     x = 42F;
    189     y = -x;
    190     return y;
    191   }
    192 
    193   /// CHECK-START: double Main.DoubleNegation() constant_folding (before)
    194   /// CHECK-DAG:     <<Const42:d\d+>>  DoubleConstant 42
    195   /// CHECK-DAG:     <<Neg:d\d+>>      Neg [<<Const42>>]
    196   /// CHECK-DAG:                       Return [<<Neg>>]
    197 
    198   /// CHECK-START: double Main.DoubleNegation() constant_folding (after)
    199   /// CHECK-DAG:     <<ConstN42:d\d+>> DoubleConstant -42
    200   /// CHECK-DAG:                       Return [<<ConstN42>>]
    201 
    202   /// CHECK-START: double Main.DoubleNegation() constant_folding (after)
    203   /// CHECK-NOT:                       Neg
    204 
    205   public static double DoubleNegation() {
    206     double x, y;
    207     x = 42D;
    208     y = -x;
    209     return y;
    210   }
    211 
    212   /**
    213    * Exercise constant folding on addition.
    214    */
    215 
    216   /// CHECK-START: int Main.IntAddition1() constant_folding_after_inlining (before)
    217   /// CHECK-DAG:     <<Const1:i\d+>>  IntConstant 1
    218   /// CHECK-DAG:     <<Const2:i\d+>>  IntConstant 2
    219   /// CHECK-DAG:     <<Add:i\d+>>     Add [<<Const1>>,<<Const2>>]
    220   /// CHECK-DAG:                      Return [<<Add>>]
    221 
    222   /// CHECK-START: int Main.IntAddition1() constant_folding_after_inlining (after)
    223   /// CHECK-DAG:     <<Const3:i\d+>>  IntConstant 3
    224   /// CHECK-DAG:                      Return [<<Const3>>]
    225 
    226   /// CHECK-START: int Main.IntAddition1() constant_folding_after_inlining (after)
    227   /// CHECK-NOT:                      Add
    228 
    229   public static int IntAddition1() {
    230     int a, b, c;
    231     a = $inline$int(1);
    232     b = $inline$int(2);
    233     c = a + b;
    234     return c;
    235   }
    236 
    237   /// CHECK-START: int Main.IntAddition2() constant_folding_after_inlining (before)
    238   /// CHECK-DAG:     <<Const1:i\d+>>  IntConstant 1
    239   /// CHECK-DAG:     <<Const2:i\d+>>  IntConstant 2
    240   /// CHECK-DAG:     <<Const5:i\d+>>  IntConstant 5
    241   /// CHECK-DAG:     <<Const6:i\d+>>  IntConstant 6
    242   /// CHECK-DAG:     <<Add1:i\d+>>    Add [<<Const1>>,<<Const2>>]
    243   /// CHECK-DAG:     <<Add2:i\d+>>    Add [<<Const5>>,<<Const6>>]
    244   /// CHECK-DAG:     <<Add3:i\d+>>    Add [<<Add1>>,<<Add2>>]
    245   /// CHECK-DAG:                      Return [<<Add3>>]
    246 
    247   /// CHECK-START: int Main.IntAddition2() constant_folding_after_inlining (after)
    248   /// CHECK-DAG:     <<Const14:i\d+>> IntConstant 14
    249   /// CHECK-DAG:                      Return [<<Const14>>]
    250 
    251   /// CHECK-START: int Main.IntAddition2() constant_folding_after_inlining (after)
    252   /// CHECK-NOT:                      Add
    253 
    254   public static int IntAddition2() {
    255     int a, b, c;
    256     a = $inline$int(1);
    257     b = $inline$int(2);
    258     a += b;
    259     b = $inline$int(5);
    260     c = $inline$int(6);
    261     b += c;
    262     c = a + b;
    263     return c;
    264   }
    265 
    266   /// CHECK-START: long Main.LongAddition() constant_folding_after_inlining (before)
    267   /// CHECK-DAG:     <<Const1:j\d+>>  LongConstant 1
    268   /// CHECK-DAG:     <<Const2:j\d+>>  LongConstant 2
    269   /// CHECK-DAG:     <<Add:j\d+>>     Add [<<Const1>>,<<Const2>>]
    270   /// CHECK-DAG:                      Return [<<Add>>]
    271 
    272   /// CHECK-START: long Main.LongAddition() constant_folding_after_inlining (after)
    273   /// CHECK-DAG:     <<Const3:j\d+>>  LongConstant 3
    274   /// CHECK-DAG:                      Return [<<Const3>>]
    275 
    276   /// CHECK-START: long Main.LongAddition() constant_folding_after_inlining (after)
    277   /// CHECK-NOT:                      Add
    278 
    279   public static long LongAddition() {
    280     long a, b, c;
    281     a = $inline$long(1L);
    282     b = $inline$long(2L);
    283     c = a + b;
    284     return c;
    285   }
    286 
    287   /// CHECK-START: float Main.FloatAddition() constant_folding_after_inlining (before)
    288   /// CHECK-DAG:     <<Const1:f\d+>>  FloatConstant 1
    289   /// CHECK-DAG:     <<Const2:f\d+>>  FloatConstant 2
    290   /// CHECK-DAG:     <<Add:f\d+>>     Add [<<Const1>>,<<Const2>>]
    291   /// CHECK-DAG:                      Return [<<Add>>]
    292 
    293   /// CHECK-START: float Main.FloatAddition() constant_folding_after_inlining (after)
    294   /// CHECK-DAG:     <<Const3:f\d+>>  FloatConstant 3
    295   /// CHECK-DAG:                      Return [<<Const3>>]
    296 
    297   /// CHECK-START: float Main.FloatAddition() constant_folding_after_inlining (after)
    298   /// CHECK-NOT:                      Add
    299 
    300   public static float FloatAddition() {
    301     float a, b, c;
    302     a = $inline$float(1F);
    303     b = $inline$float(2F);
    304     c = a + b;
    305     return c;
    306   }
    307 
    308   /// CHECK-START: double Main.DoubleAddition() constant_folding_after_inlining (before)
    309   /// CHECK-DAG:     <<Const1:d\d+>>  DoubleConstant 1
    310   /// CHECK-DAG:     <<Const2:d\d+>>  DoubleConstant 2
    311   /// CHECK-DAG:     <<Add:d\d+>>     Add [<<Const1>>,<<Const2>>]
    312   /// CHECK-DAG:                      Return [<<Add>>]
    313 
    314   /// CHECK-START: double Main.DoubleAddition() constant_folding_after_inlining (after)
    315   /// CHECK-DAG:     <<Const3:d\d+>>  DoubleConstant 3
    316   /// CHECK-DAG:                      Return [<<Const3>>]
    317 
    318   /// CHECK-START: double Main.DoubleAddition() constant_folding_after_inlining (after)
    319   /// CHECK-NOT:                      Add
    320 
    321   public static double DoubleAddition() {
    322     double a, b, c;
    323     a = $inline$double(1D);
    324     b = $inline$double(2D);
    325     c = a + b;
    326     return c;
    327   }
    328 
    329 
    330   /**
    331    * Exercise constant folding on subtraction.
    332    */
    333 
    334   /// CHECK-START: int Main.IntSubtraction() constant_folding_after_inlining (before)
    335   /// CHECK-DAG:     <<Const6:i\d+>>  IntConstant 6
    336   /// CHECK-DAG:     <<Const2:i\d+>>  IntConstant 2
    337   /// CHECK-DAG:     <<Sub:i\d+>>     Sub [<<Const6>>,<<Const2>>]
    338   /// CHECK-DAG:                      Return [<<Sub>>]
    339 
    340   /// CHECK-START: int Main.IntSubtraction() constant_folding_after_inlining (after)
    341   /// CHECK-DAG:     <<Const4:i\d+>>  IntConstant 4
    342   /// CHECK-DAG:                      Return [<<Const4>>]
    343 
    344   /// CHECK-START: int Main.IntSubtraction() constant_folding_after_inlining (after)
    345   /// CHECK-NOT:                      Sub
    346 
    347   public static int IntSubtraction() {
    348     int a, b, c;
    349     a = $inline$int(6);
    350     b = $inline$int(2);
    351     c = a - b;
    352     return c;
    353   }
    354 
    355   /// CHECK-START: long Main.LongSubtraction() constant_folding_after_inlining (before)
    356   /// CHECK-DAG:     <<Const6:j\d+>>  LongConstant 6
    357   /// CHECK-DAG:     <<Const2:j\d+>>  LongConstant 2
    358   /// CHECK-DAG:     <<Sub:j\d+>>     Sub [<<Const6>>,<<Const2>>]
    359   /// CHECK-DAG:                      Return [<<Sub>>]
    360 
    361   /// CHECK-START: long Main.LongSubtraction() constant_folding_after_inlining (after)
    362   /// CHECK-DAG:     <<Const4:j\d+>>  LongConstant 4
    363   /// CHECK-DAG:                      Return [<<Const4>>]
    364 
    365   /// CHECK-START: long Main.LongSubtraction() constant_folding_after_inlining (after)
    366   /// CHECK-NOT:                      Sub
    367 
    368   public static long LongSubtraction() {
    369     long a, b, c;
    370     a = $inline$long(6L);
    371     b = $inline$long(2L);
    372     c = a - b;
    373     return c;
    374   }
    375 
    376   /// CHECK-START: float Main.FloatSubtraction() constant_folding_after_inlining (before)
    377   /// CHECK-DAG:     <<Const6:f\d+>>  FloatConstant 6
    378   /// CHECK-DAG:     <<Const2:f\d+>>  FloatConstant 2
    379   /// CHECK-DAG:     <<Sub:f\d+>>     Sub [<<Const6>>,<<Const2>>]
    380   /// CHECK-DAG:                      Return [<<Sub>>]
    381 
    382   /// CHECK-START: float Main.FloatSubtraction() constant_folding_after_inlining (after)
    383   /// CHECK-DAG:     <<Const4:f\d+>>  FloatConstant 4
    384   /// CHECK-DAG:                      Return [<<Const4>>]
    385 
    386   /// CHECK-START: float Main.FloatSubtraction() constant_folding_after_inlining (after)
    387   /// CHECK-NOT:                      Sub
    388 
    389   public static float FloatSubtraction() {
    390     float a, b, c;
    391     a = $inline$float(6F);
    392     b = $inline$float(2F);
    393     c = a - b;
    394     return c;
    395   }
    396 
    397   /// CHECK-START: double Main.DoubleSubtraction() constant_folding_after_inlining (before)
    398   /// CHECK-DAG:     <<Const6:d\d+>>  DoubleConstant 6
    399   /// CHECK-DAG:     <<Const2:d\d+>>  DoubleConstant 2
    400   /// CHECK-DAG:     <<Sub:d\d+>>     Sub [<<Const6>>,<<Const2>>]
    401   /// CHECK-DAG:                      Return [<<Sub>>]
    402 
    403   /// CHECK-START: double Main.DoubleSubtraction() constant_folding_after_inlining (after)
    404   /// CHECK-DAG:     <<Const4:d\d+>>  DoubleConstant 4
    405   /// CHECK-DAG:                      Return [<<Const4>>]
    406 
    407   /// CHECK-START: double Main.DoubleSubtraction() constant_folding_after_inlining (after)
    408   /// CHECK-NOT:                      Sub
    409 
    410   public static double DoubleSubtraction() {
    411     double a, b, c;
    412     a = $inline$double(6D);
    413     b = $inline$double(2D);
    414     c = a - b;
    415     return c;
    416   }
    417 
    418 
    419   /**
    420    * Exercise constant folding on multiplication.
    421    */
    422 
    423   /// CHECK-START: int Main.IntMultiplication() constant_folding_after_inlining (before)
    424   /// CHECK-DAG:     <<Const7:i\d+>>  IntConstant 7
    425   /// CHECK-DAG:     <<Const3:i\d+>>  IntConstant 3
    426   /// CHECK-DAG:     <<Mul:i\d+>>     Mul [<<Const7>>,<<Const3>>]
    427   /// CHECK-DAG:                      Return [<<Mul>>]
    428 
    429   /// CHECK-START: int Main.IntMultiplication() constant_folding_after_inlining (after)
    430   /// CHECK-DAG:     <<Const21:i\d+>> IntConstant 21
    431   /// CHECK-DAG:                      Return [<<Const21>>]
    432 
    433   /// CHECK-START: int Main.IntMultiplication() constant_folding_after_inlining (after)
    434   /// CHECK-NOT:                      Mul
    435 
    436   public static int IntMultiplication() {
    437     int a, b, c;
    438     a = $inline$int(7);
    439     b = $inline$int(3);
    440     c = a * b;
    441     return c;
    442   }
    443 
    444   /// CHECK-START: long Main.LongMultiplication() constant_folding_after_inlining (before)
    445   /// CHECK-DAG:     <<Const7:j\d+>>  LongConstant 7
    446   /// CHECK-DAG:     <<Const3:j\d+>>  LongConstant 3
    447   /// CHECK-DAG:     <<Mul:j\d+>>     Mul [<<Const7>>,<<Const3>>]
    448   /// CHECK-DAG:                      Return [<<Mul>>]
    449 
    450   /// CHECK-START: long Main.LongMultiplication() constant_folding_after_inlining (after)
    451   /// CHECK-DAG:     <<Const21:j\d+>> LongConstant 21
    452   /// CHECK-DAG:                      Return [<<Const21>>]
    453 
    454   /// CHECK-START: long Main.LongMultiplication() constant_folding_after_inlining (after)
    455   /// CHECK-NOT:                      Mul
    456 
    457   public static long LongMultiplication() {
    458     long a, b, c;
    459     a = $inline$long(7L);
    460     b = $inline$long(3L);
    461     c = a * b;
    462     return c;
    463   }
    464 
    465   /// CHECK-START: float Main.FloatMultiplication() constant_folding_after_inlining (before)
    466   /// CHECK-DAG:     <<Const7:f\d+>>  FloatConstant 7
    467   /// CHECK-DAG:     <<Const3:f\d+>>  FloatConstant 3
    468   /// CHECK-DAG:     <<Mul:f\d+>>     Mul [<<Const7>>,<<Const3>>]
    469   /// CHECK-DAG:                      Return [<<Mul>>]
    470 
    471   /// CHECK-START: float Main.FloatMultiplication() constant_folding_after_inlining (after)
    472   /// CHECK-DAG:     <<Const21:f\d+>> FloatConstant 21
    473   /// CHECK-DAG:                      Return [<<Const21>>]
    474 
    475   /// CHECK-START: float Main.FloatMultiplication() constant_folding_after_inlining (after)
    476   /// CHECK-NOT:                      Mul
    477 
    478   public static float FloatMultiplication() {
    479     float a, b, c;
    480     a = $inline$float(7F);
    481     b = $inline$float(3F);
    482     c = a * b;
    483     return c;
    484   }
    485 
    486   /// CHECK-START: double Main.DoubleMultiplication() constant_folding_after_inlining (before)
    487   /// CHECK-DAG:     <<Const7:d\d+>>  DoubleConstant 7
    488   /// CHECK-DAG:     <<Const3:d\d+>>  DoubleConstant 3
    489   /// CHECK-DAG:     <<Mul:d\d+>>     Mul [<<Const7>>,<<Const3>>]
    490   /// CHECK-DAG:                      Return [<<Mul>>]
    491 
    492   /// CHECK-START: double Main.DoubleMultiplication() constant_folding_after_inlining (after)
    493   /// CHECK-DAG:     <<Const21:d\d+>> DoubleConstant 21
    494   /// CHECK-DAG:                      Return [<<Const21>>]
    495 
    496   /// CHECK-START: double Main.DoubleMultiplication() constant_folding_after_inlining (after)
    497   /// CHECK-NOT:                      Mul
    498 
    499   public static double DoubleMultiplication() {
    500     double a, b, c;
    501     a = $inline$double(7D);
    502     b = $inline$double(3D);
    503     c = a * b;
    504     return c;
    505   }
    506 
    507 
    508   /**
    509    * Exercise constant folding on division.
    510    */
    511 
    512   /// CHECK-START: int Main.IntDivision() constant_folding_after_inlining (before)
    513   /// CHECK-DAG:     <<Const8:i\d+>>   IntConstant 8
    514   /// CHECK-DAG:     <<Const3:i\d+>>   IntConstant 3
    515   /// CHECK-DAG:     <<Div0Chk:i\d+>>  DivZeroCheck [<<Const3>>]
    516   /// CHECK-DAG:     <<Div:i\d+>>      Div [<<Const8>>,<<Div0Chk>>]
    517   /// CHECK-DAG:                       Return [<<Div>>]
    518 
    519   /// CHECK-START: int Main.IntDivision() constant_folding_after_inlining (after)
    520   /// CHECK-DAG:     <<Const2:i\d+>>   IntConstant 2
    521   /// CHECK-DAG:                       Return [<<Const2>>]
    522 
    523   /// CHECK-START: int Main.IntDivision() constant_folding_after_inlining (after)
    524   /// CHECK-NOT:                       DivZeroCheck
    525   /// CHECK-NOT:                       Div
    526 
    527   public static int IntDivision() {
    528     int a, b, c;
    529     a = $inline$int(8);
    530     b = $inline$int(3);
    531     c = a / b;
    532     return c;
    533   }
    534 
    535   /// CHECK-START: long Main.LongDivision() constant_folding_after_inlining (before)
    536   /// CHECK-DAG:     <<Const8:j\d+>>   LongConstant 8
    537   /// CHECK-DAG:     <<Const3:j\d+>>   LongConstant 3
    538   /// CHECK-DAG:     <<Div0Chk:j\d+>>  DivZeroCheck [<<Const3>>]
    539   /// CHECK-DAG:     <<Div:j\d+>>      Div [<<Const8>>,<<Div0Chk>>]
    540   /// CHECK-DAG:                       Return [<<Div>>]
    541 
    542   /// CHECK-START: long Main.LongDivision() constant_folding_after_inlining (after)
    543   /// CHECK-DAG:     <<Const2:j\d+>>   LongConstant 2
    544   /// CHECK-DAG:                       Return [<<Const2>>]
    545 
    546   /// CHECK-START: long Main.LongDivision() constant_folding_after_inlining (after)
    547   /// CHECK-NOT:                       DivZeroCheck
    548   /// CHECK-NOT:                       Div
    549 
    550   public static long LongDivision() {
    551     long a, b, c;
    552     a = $inline$long(8L);
    553     b = $inline$long(3L);
    554     c = a / b;
    555     return c;
    556   }
    557 
    558   /// CHECK-START: float Main.FloatDivision() constant_folding_after_inlining (before)
    559   /// CHECK-DAG:     <<Const8:f\d+>>   FloatConstant 8
    560   /// CHECK-DAG:     <<Const2P5:f\d+>> FloatConstant 2.5
    561   /// CHECK-DAG:     <<Div:f\d+>>      Div [<<Const8>>,<<Const2P5>>]
    562   /// CHECK-DAG:                       Return [<<Div>>]
    563 
    564   /// CHECK-START: float Main.FloatDivision() constant_folding_after_inlining (after)
    565   /// CHECK-DAG:     <<Const3P2:f\d+>> FloatConstant 3.2
    566   /// CHECK-DAG:                       Return [<<Const3P2>>]
    567 
    568   /// CHECK-START: float Main.FloatDivision() constant_folding_after_inlining (after)
    569   /// CHECK-NOT:                       Div
    570 
    571   public static float FloatDivision() {
    572     float a, b, c;
    573     a = $inline$float(8F);
    574     b = $inline$float(2.5F);
    575     c = a / b;
    576     return c;
    577   }
    578 
    579   /// CHECK-START: double Main.DoubleDivision() constant_folding_after_inlining (before)
    580   /// CHECK-DAG:     <<Const8:d\d+>>   DoubleConstant 8
    581   /// CHECK-DAG:     <<Const2P5:d\d+>> DoubleConstant 2.5
    582   /// CHECK-DAG:     <<Div:d\d+>>      Div [<<Const8>>,<<Const2P5>>]
    583   /// CHECK-DAG:                       Return [<<Div>>]
    584 
    585   /// CHECK-START: double Main.DoubleDivision() constant_folding_after_inlining (after)
    586   /// CHECK-DAG:     <<Const3P2:d\d+>> DoubleConstant 3.2
    587   /// CHECK-DAG:                       Return [<<Const3P2>>]
    588 
    589   /// CHECK-START: double Main.DoubleDivision() constant_folding_after_inlining (after)
    590   /// CHECK-NOT:                       Div
    591 
    592   public static double DoubleDivision() {
    593     double a, b, c;
    594     a = $inline$double(8D);
    595     b = $inline$double(2.5D);
    596     c = a / b;
    597     return c;
    598   }
    599 
    600 
    601   /**
    602    * Exercise constant folding on remainder.
    603    */
    604 
    605   /// CHECK-START: int Main.IntRemainder() constant_folding_after_inlining (before)
    606   /// CHECK-DAG:     <<Const8:i\d+>>   IntConstant 8
    607   /// CHECK-DAG:     <<Const3:i\d+>>   IntConstant 3
    608   /// CHECK-DAG:     <<Div0Chk:i\d+>>  DivZeroCheck [<<Const3>>]
    609   /// CHECK-DAG:     <<Rem:i\d+>>      Rem [<<Const8>>,<<Div0Chk>>]
    610   /// CHECK-DAG:                       Return [<<Rem>>]
    611 
    612   /// CHECK-START: int Main.IntRemainder() constant_folding_after_inlining (after)
    613   /// CHECK-DAG:     <<Const2:i\d+>>   IntConstant 2
    614   /// CHECK-DAG:                       Return [<<Const2>>]
    615 
    616   /// CHECK-START: int Main.IntRemainder() constant_folding_after_inlining (after)
    617   /// CHECK-NOT:                       DivZeroCheck
    618   /// CHECK-NOT:                       Rem
    619 
    620   public static int IntRemainder() {
    621     int a, b, c;
    622     a = $inline$int(8);
    623     b = $inline$int(3);
    624     c = a % b;
    625     return c;
    626   }
    627 
    628   /// CHECK-START: long Main.LongRemainder() constant_folding_after_inlining (before)
    629   /// CHECK-DAG:     <<Const8:j\d+>>   LongConstant 8
    630   /// CHECK-DAG:     <<Const3:j\d+>>   LongConstant 3
    631   /// CHECK-DAG:     <<Div0Chk:j\d+>>  DivZeroCheck [<<Const3>>]
    632   /// CHECK-DAG:     <<Rem:j\d+>>      Rem [<<Const8>>,<<Div0Chk>>]
    633   /// CHECK-DAG:                       Return [<<Rem>>]
    634 
    635   /// CHECK-START: long Main.LongRemainder() constant_folding_after_inlining (after)
    636   /// CHECK-DAG:     <<Const2:j\d+>>   LongConstant 2
    637   /// CHECK-DAG:                       Return [<<Const2>>]
    638 
    639   /// CHECK-START: long Main.LongRemainder() constant_folding_after_inlining (after)
    640   /// CHECK-NOT:                       DivZeroCheck
    641   /// CHECK-NOT:                       Rem
    642 
    643   public static long LongRemainder() {
    644     long a, b, c;
    645     a = $inline$long(8L);
    646     b = $inline$long(3L);
    647     c = a % b;
    648     return c;
    649   }
    650 
    651   /// CHECK-START: float Main.FloatRemainder() constant_folding_after_inlining (before)
    652   /// CHECK-DAG:     <<Const8:f\d+>>   FloatConstant 8
    653   /// CHECK-DAG:     <<Const2P5:f\d+>> FloatConstant 2.5
    654   /// CHECK-DAG:     <<Rem:f\d+>>      Rem [<<Const8>>,<<Const2P5>>]
    655   /// CHECK-DAG:                       Return [<<Rem>>]
    656 
    657   /// CHECK-START: float Main.FloatRemainder() constant_folding_after_inlining (after)
    658   /// CHECK-DAG:     <<Const0P5:f\d+>> FloatConstant 0.5
    659   /// CHECK-DAG:                       Return [<<Const0P5>>]
    660 
    661   /// CHECK-START: float Main.FloatRemainder() constant_folding_after_inlining (after)
    662   /// CHECK-NOT:                       Rem
    663 
    664   public static float FloatRemainder() {
    665     float a, b, c;
    666     a = $inline$float(8F);
    667     b = $inline$float(2.5F);
    668     c = a % b;
    669     return c;
    670   }
    671 
    672   /// CHECK-START: double Main.DoubleRemainder() constant_folding_after_inlining (before)
    673   /// CHECK-DAG:     <<Const8:d\d+>>   DoubleConstant 8
    674   /// CHECK-DAG:     <<Const2P5:d\d+>> DoubleConstant 2.5
    675   /// CHECK-DAG:     <<Rem:d\d+>>      Rem [<<Const8>>,<<Const2P5>>]
    676   /// CHECK-DAG:                       Return [<<Rem>>]
    677 
    678   /// CHECK-START: double Main.DoubleRemainder() constant_folding_after_inlining (after)
    679   /// CHECK-DAG:     <<Const0P5:d\d+>> DoubleConstant 0.5
    680   /// CHECK-DAG:                       Return [<<Const0P5>>]
    681 
    682   /// CHECK-START: double Main.DoubleRemainder() constant_folding_after_inlining (after)
    683   /// CHECK-NOT:                       Rem
    684 
    685   public static double DoubleRemainder() {
    686     double a, b, c;
    687     a = $inline$double(8D);
    688     b = $inline$double(2.5D);
    689     c = a % b;
    690     return c;
    691   }
    692 
    693 
    694   /**
    695    * Exercise constant folding on left shift.
    696    */
    697 
    698   /// CHECK-START: int Main.ShlIntLong() constant_folding_after_inlining (before)
    699   /// CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
    700   /// CHECK-DAG:     <<Const2L:j\d+>>  LongConstant 2
    701   /// CHECK-DAG:     <<TypeConv:i\d+>> TypeConversion [<<Const2L>>]
    702   /// CHECK-DAG:     <<Shl:i\d+>>      Shl [<<Const1>>,<<TypeConv>>]
    703   /// CHECK-DAG:                       Return [<<Shl>>]
    704 
    705   /// CHECK-START: int Main.ShlIntLong() constant_folding_after_inlining (after)
    706   /// CHECK-DAG:     <<Const4:i\d+>>   IntConstant 4
    707   /// CHECK-DAG:                       Return [<<Const4>>]
    708 
    709   /// CHECK-START: int Main.ShlIntLong() constant_folding_after_inlining (after)
    710   /// CHECK-NOT:                       Shl
    711 
    712   public static int ShlIntLong() {
    713     int lhs = $inline$int(1);
    714     long rhs = $inline$long(2L);
    715     return lhs << rhs;
    716   }
    717 
    718   /// CHECK-START: long Main.ShlLongInt() constant_folding_after_inlining (before)
    719   /// CHECK-DAG:     <<Const3L:j\d+>>  LongConstant 3
    720   /// CHECK-DAG:     <<Const2:i\d+>>   IntConstant 2
    721   /// CHECK-DAG:     <<Shl:j\d+>>      Shl [<<Const3L>>,<<Const2>>]
    722   /// CHECK-DAG:                       Return [<<Shl>>]
    723 
    724   /// CHECK-START: long Main.ShlLongInt() constant_folding_after_inlining (after)
    725   /// CHECK-DAG:     <<Const12L:j\d+>> LongConstant 12
    726   /// CHECK-DAG:                       Return [<<Const12L>>]
    727 
    728   /// CHECK-START: long Main.ShlLongInt() constant_folding_after_inlining (after)
    729   /// CHECK-NOT:                       Shl
    730 
    731   public static long ShlLongInt() {
    732     long lhs = $inline$long(3L);
    733     int rhs = $inline$int(2);
    734     return lhs << rhs;
    735   }
    736 
    737 
    738   /**
    739    * Exercise constant folding on right shift.
    740    */
    741 
    742   /// CHECK-START: int Main.ShrIntLong() constant_folding_after_inlining (before)
    743   /// CHECK-DAG:     <<Const7:i\d+>>   IntConstant 7
    744   /// CHECK-DAG:     <<Const2L:j\d+>>  LongConstant 2
    745   /// CHECK-DAG:     <<TypeConv:i\d+>> TypeConversion [<<Const2L>>]
    746   /// CHECK-DAG:     <<Shr:i\d+>>      Shr [<<Const7>>,<<TypeConv>>]
    747   /// CHECK-DAG:                       Return [<<Shr>>]
    748 
    749   /// CHECK-START: int Main.ShrIntLong() constant_folding_after_inlining (after)
    750   /// CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
    751   /// CHECK-DAG:                       Return [<<Const1>>]
    752 
    753   /// CHECK-START: int Main.ShrIntLong() constant_folding_after_inlining (after)
    754   /// CHECK-NOT:                       Shr
    755 
    756   public static int ShrIntLong() {
    757     int lhs = $inline$int(7);
    758     long rhs = $inline$long(2L);
    759     return lhs >> rhs;
    760   }
    761 
    762   /// CHECK-START: long Main.ShrLongInt() constant_folding_after_inlining (before)
    763   /// CHECK-DAG:     <<Const9L:j\d+>>  LongConstant 9
    764   /// CHECK-DAG:     <<Const2:i\d+>>   IntConstant 2
    765   /// CHECK-DAG:     <<Shr:j\d+>>      Shr [<<Const9L>>,<<Const2>>]
    766   /// CHECK-DAG:                       Return [<<Shr>>]
    767 
    768   /// CHECK-START: long Main.ShrLongInt() constant_folding_after_inlining (after)
    769   /// CHECK-DAG:     <<Const2L:j\d+>>  LongConstant 2
    770   /// CHECK-DAG:                       Return [<<Const2L>>]
    771 
    772   /// CHECK-START: long Main.ShrLongInt() constant_folding_after_inlining (after)
    773   /// CHECK-NOT:                       Shr
    774 
    775   public static long ShrLongInt() {
    776     long lhs = $inline$long(9);
    777     int rhs = $inline$int(2);
    778     return lhs >> rhs;
    779   }
    780 
    781 
    782   /**
    783    * Exercise constant folding on unsigned right shift.
    784    */
    785 
    786   /// CHECK-START: int Main.UShrIntLong() constant_folding_after_inlining (before)
    787   /// CHECK-DAG:     <<ConstM7:i\d+>>  IntConstant -7
    788   /// CHECK-DAG:     <<Const2L:j\d+>>  LongConstant 2
    789   /// CHECK-DAG:     <<TypeConv:i\d+>> TypeConversion [<<Const2L>>]
    790   /// CHECK-DAG:     <<UShr:i\d+>>     UShr [<<ConstM7>>,<<TypeConv>>]
    791   /// CHECK-DAG:                       Return [<<UShr>>]
    792 
    793   /// CHECK-START: int Main.UShrIntLong() constant_folding_after_inlining (after)
    794   /// CHECK-DAG:     <<ConstRes:i\d+>> IntConstant 1073741822
    795   /// CHECK-DAG:                       Return [<<ConstRes>>]
    796 
    797   /// CHECK-START: int Main.UShrIntLong() constant_folding_after_inlining (after)
    798   /// CHECK-NOT:                       UShr
    799 
    800   public static int UShrIntLong() {
    801     int lhs = $inline$int(-7);
    802     long rhs = $inline$long(2L);
    803     return lhs >>> rhs;
    804   }
    805 
    806   /// CHECK-START: long Main.UShrLongInt() constant_folding_after_inlining (before)
    807   /// CHECK-DAG:     <<ConstM9L:j\d+>> LongConstant -9
    808   /// CHECK-DAG:     <<Const2:i\d+>>   IntConstant 2
    809   /// CHECK-DAG:     <<UShr:j\d+>>     UShr [<<ConstM9L>>,<<Const2>>]
    810   /// CHECK-DAG:                       Return [<<UShr>>]
    811 
    812   /// CHECK-START: long Main.UShrLongInt() constant_folding_after_inlining (after)
    813   /// CHECK-DAG:     <<ConstRes:j\d+>> LongConstant 4611686018427387901
    814   /// CHECK-DAG:                       Return [<<ConstRes>>]
    815 
    816   /// CHECK-START: long Main.UShrLongInt() constant_folding_after_inlining (after)
    817   /// CHECK-NOT:                       UShr
    818 
    819   public static long UShrLongInt() {
    820     long lhs = $inline$long(-9);
    821     int rhs = $inline$int(2);
    822     return lhs >>> rhs;
    823   }
    824 
    825 
    826   /**
    827    * Exercise constant folding on logical and.
    828    */
    829 
    830   /// CHECK-START: long Main.AndIntLong() constant_folding_after_inlining (before)
    831   /// CHECK-DAG:     <<Const10:i\d+>>  IntConstant 10
    832   /// CHECK-DAG:     <<Const3L:j\d+>>  LongConstant 3
    833   /// CHECK-DAG:     <<TypeConv:j\d+>> TypeConversion [<<Const10>>]
    834   /// CHECK-DAG:     <<And:j\d+>>      And [<<TypeConv>>,<<Const3L>>]
    835   /// CHECK-DAG:                       Return [<<And>>]
    836 
    837   /// CHECK-START: long Main.AndIntLong() constant_folding_after_inlining (after)
    838   /// CHECK-DAG:     <<Const2:j\d+>>   LongConstant 2
    839   /// CHECK-DAG:                       Return [<<Const2>>]
    840 
    841   /// CHECK-START: long Main.AndIntLong() constant_folding_after_inlining (after)
    842   /// CHECK-NOT:                       And
    843 
    844   public static long AndIntLong() {
    845     int lhs = $inline$int(10);
    846     long rhs = $inline$long(3L);
    847     return lhs & rhs;
    848   }
    849 
    850   /// CHECK-START: long Main.AndLongInt() constant_folding_after_inlining (before)
    851   /// CHECK-DAG:     <<Const10L:j\d+>> LongConstant 10
    852   /// CHECK-DAG:     <<Const3:i\d+>>   IntConstant 3
    853   /// CHECK-DAG:     <<TypeConv:j\d+>> TypeConversion [<<Const3>>]
    854   /// CHECK-DAG:     <<And:j\d+>>      And [<<TypeConv>>,<<Const10L>>]
    855   /// CHECK-DAG:                       Return [<<And>>]
    856 
    857   /// CHECK-START: long Main.AndLongInt() constant_folding_after_inlining (after)
    858   /// CHECK-DAG:     <<Const2:j\d+>>   LongConstant 2
    859   /// CHECK-DAG:                       Return [<<Const2>>]
    860 
    861   /// CHECK-START: long Main.AndLongInt() constant_folding_after_inlining (after)
    862   /// CHECK-NOT:                       And
    863 
    864   public static long AndLongInt() {
    865     long lhs = $inline$long(10L);
    866     int rhs = $inline$int(3);
    867     return lhs & rhs;
    868   }
    869 
    870 
    871   /**
    872    * Exercise constant folding on logical or.
    873    */
    874 
    875   /// CHECK-START: long Main.OrIntLong() constant_folding_after_inlining (before)
    876   /// CHECK-DAG:     <<Const10:i\d+>>  IntConstant 10
    877   /// CHECK-DAG:     <<Const3L:j\d+>>  LongConstant 3
    878   /// CHECK-DAG:     <<TypeConv:j\d+>> TypeConversion [<<Const10>>]
    879   /// CHECK-DAG:     <<Or:j\d+>>       Or [<<TypeConv>>,<<Const3L>>]
    880   /// CHECK-DAG:                       Return [<<Or>>]
    881 
    882   /// CHECK-START: long Main.OrIntLong() constant_folding_after_inlining (after)
    883   /// CHECK-DAG:     <<Const11:j\d+>>  LongConstant 11
    884   /// CHECK-DAG:                       Return [<<Const11>>]
    885 
    886   /// CHECK-START: long Main.OrIntLong() constant_folding_after_inlining (after)
    887   /// CHECK-NOT:                       Or
    888 
    889   public static long OrIntLong() {
    890     int lhs = $inline$int(10);
    891     long rhs = $inline$long(3L);
    892     return lhs | rhs;
    893   }
    894 
    895   /// CHECK-START: long Main.OrLongInt() constant_folding_after_inlining (before)
    896   /// CHECK-DAG:     <<Const10L:j\d+>> LongConstant 10
    897   /// CHECK-DAG:     <<Const3:i\d+>>   IntConstant 3
    898   /// CHECK-DAG:     <<TypeConv:j\d+>> TypeConversion [<<Const3>>]
    899   /// CHECK-DAG:     <<Or:j\d+>>       Or [<<TypeConv>>,<<Const10L>>]
    900   /// CHECK-DAG:                       Return [<<Or>>]
    901 
    902   /// CHECK-START: long Main.OrLongInt() constant_folding_after_inlining (after)
    903   /// CHECK-DAG:     <<Const11:j\d+>>  LongConstant 11
    904   /// CHECK-DAG:                       Return [<<Const11>>]
    905 
    906   /// CHECK-START: long Main.OrLongInt() constant_folding_after_inlining (after)
    907   /// CHECK-NOT:                       Or
    908 
    909   public static long OrLongInt() {
    910     long lhs = $inline$long(10L);
    911     int rhs = $inline$int(3);
    912     return lhs | rhs;
    913   }
    914 
    915 
    916   /**
    917    * Exercise constant folding on logical exclusive or.
    918    */
    919 
    920   /// CHECK-START: long Main.XorIntLong() constant_folding_after_inlining (before)
    921   /// CHECK-DAG:     <<Const10:i\d+>>  IntConstant 10
    922   /// CHECK-DAG:     <<Const3L:j\d+>>  LongConstant 3
    923   /// CHECK-DAG:     <<TypeConv:j\d+>> TypeConversion [<<Const10>>]
    924   /// CHECK-DAG:     <<Xor:j\d+>>      Xor [<<TypeConv>>,<<Const3L>>]
    925   /// CHECK-DAG:                       Return [<<Xor>>]
    926 
    927   /// CHECK-START: long Main.XorIntLong() constant_folding_after_inlining (after)
    928   /// CHECK-DAG:     <<Const9:j\d+>>   LongConstant 9
    929   /// CHECK-DAG:                       Return [<<Const9>>]
    930 
    931   /// CHECK-START: long Main.XorIntLong() constant_folding_after_inlining (after)
    932   /// CHECK-NOT:                       Xor
    933 
    934   public static long XorIntLong() {
    935     int lhs = $inline$int(10);
    936     long rhs = $inline$long(3L);
    937     return lhs ^ rhs;
    938   }
    939 
    940   /// CHECK-START: long Main.XorLongInt() constant_folding_after_inlining (before)
    941   /// CHECK-DAG:     <<Const10L:j\d+>> LongConstant 10
    942   /// CHECK-DAG:     <<Const3:i\d+>>   IntConstant 3
    943   /// CHECK-DAG:     <<TypeConv:j\d+>> TypeConversion [<<Const3>>]
    944   /// CHECK-DAG:     <<Xor:j\d+>>      Xor [<<TypeConv>>,<<Const10L>>]
    945   /// CHECK-DAG:                       Return [<<Xor>>]
    946 
    947   /// CHECK-START: long Main.XorLongInt() constant_folding_after_inlining (after)
    948   /// CHECK-DAG:     <<Const9:j\d+>>   LongConstant 9
    949   /// CHECK-DAG:                       Return [<<Const9>>]
    950 
    951   /// CHECK-START: long Main.XorLongInt() constant_folding_after_inlining (after)
    952   /// CHECK-NOT:                       Xor
    953 
    954   public static long XorLongInt() {
    955     long lhs = $inline$long(10L);
    956     int rhs = $inline$int(3);
    957     return lhs ^ rhs;
    958   }
    959 
    960 
    961   /**
    962    * Exercise constant folding on constant (static) condition.
    963    */
    964 
    965   /// CHECK-START: int Main.StaticCondition() constant_folding_after_inlining (before)
    966   /// CHECK-DAG:     <<Const7:i\d+>>  IntConstant 7
    967   /// CHECK-DAG:     <<Const2:i\d+>>  IntConstant 2
    968   /// CHECK-DAG:     <<Cond:z\d+>>    GreaterThanOrEqual [<<Const7>>,<<Const2>>]
    969   /// CHECK-DAG:                      Select [{{i\d+}},{{i\d+}},<<Cond>>]
    970 
    971   /// CHECK-START: int Main.StaticCondition() constant_folding_after_inlining (after)
    972   /// CHECK-DAG:     <<Const1:i\d+>>  IntConstant 1
    973   /// CHECK-DAG:                      Select [{{i\d+}},{{i\d+}},<<Const1>>]
    974 
    975   /// CHECK-START: int Main.StaticCondition() constant_folding_after_inlining (after)
    976   /// CHECK-NOT:                      GreaterThanOrEqual
    977 
    978   public static int StaticCondition() {
    979     int a, b, c;
    980     a = $inline$int(7);
    981     b = $inline$int(2);
    982     if (a < b)
    983       c = a + b;
    984     else
    985       c = a - b;
    986     return c;
    987   }
    988 
    989 
    990   /**
    991    * Exercise constant folding on constant (static) condition for null references.
    992    */
    993 
    994   /// CHECK-START: int Main.StaticConditionNulls() constant_folding_after_inlining (before)
    995   /// CHECK-DAG:     <<Null:l\d+>>    NullConstant
    996   /// CHECK-DAG:     <<Cond:z\d+>>    NotEqual [<<Null>>,<<Null>>]
    997   /// CHECK-DAG:                      Select [{{i\d+}},{{i\d+}},<<Cond>>]
    998 
    999   /// CHECK-START: int Main.StaticConditionNulls() constant_folding_after_inlining (after)
   1000   /// CHECK-DAG:     <<Const0:i\d+>>  IntConstant 0
   1001   /// CHECK-DAG:                      Select [{{i\d+}},{{i\d+}},<<Const0>>]
   1002 
   1003   /// CHECK-START: int Main.StaticConditionNulls() constant_folding_after_inlining (after)
   1004   /// CHECK-NOT:                      NotEqual
   1005 
   1006   private static Object getNull() {
   1007     return null;
   1008   }
   1009 
   1010   public static int StaticConditionNulls() {
   1011     Object a = getNull();
   1012     Object b = getNull();
   1013     return (a == b) ? 5 : 2;
   1014   }
   1015 
   1016 
   1017   /**
   1018    * Exercise constant folding on a program with condition
   1019    * (i.e. jumps) leading to the creation of many blocks.
   1020    *
   1021    * The intent of this test is to ensure that all constant expressions
   1022    * are actually evaluated at compile-time, thanks to the reverse
   1023    * (forward) post-order traversal of the the dominator tree.
   1024    */
   1025 
   1026   /// CHECK-START: int Main.JumpsAndConditionals(boolean) constant_folding_after_inlining (before)
   1027   /// CHECK-DAG:     <<Cond:z\d+>>    ParameterValue
   1028   /// CHECK-DAG:     <<Const2:i\d+>>  IntConstant 2
   1029   /// CHECK-DAG:     <<Const5:i\d+>>  IntConstant 5
   1030   /// CHECK-DAG:     <<Add:i\d+>>     Add [<<Const5>>,<<Const2>>]
   1031   /// CHECK-DAG:     <<Sub:i\d+>>     Sub [<<Const5>>,<<Const2>>]
   1032   /// CHECK-DAG:     <<Phi:i\d+>>     Select [<<Sub>>,<<Add>>,<<Cond>>]
   1033   /// CHECK-DAG:                      Return [<<Phi>>]
   1034 
   1035   /// CHECK-START: int Main.JumpsAndConditionals(boolean) constant_folding_after_inlining (after)
   1036   /// CHECK-DAG:     <<Cond:z\d+>>    ParameterValue
   1037   /// CHECK-DAG:     <<Const3:i\d+>>  IntConstant 3
   1038   /// CHECK-DAG:     <<Const7:i\d+>>  IntConstant 7
   1039   /// CHECK-DAG:     <<Phi:i\d+>>     Select [<<Const3>>,<<Const7>>,<<Cond>>]
   1040   /// CHECK-DAG:                      Return [<<Phi>>]
   1041 
   1042   /// CHECK-START: int Main.JumpsAndConditionals(boolean) constant_folding_after_inlining (after)
   1043   /// CHECK-NOT:                      Add
   1044   /// CHECK-NOT:                      Sub
   1045 
   1046   public static int JumpsAndConditionals(boolean cond) {
   1047     int a, b, c;
   1048     a = $inline$int(5);
   1049     b = $inline$int(2);
   1050     if (cond)
   1051       c = a + b;
   1052     else
   1053       c = a - b;
   1054     return c;
   1055   }
   1056 
   1057 
   1058   /**
   1059    * Test optimizations of arithmetic identities yielding a constant result.
   1060    */
   1061 
   1062   /// CHECK-START: int Main.And0(int) constant_folding (before)
   1063   /// CHECK-DAG:     <<Arg:i\d+>>      ParameterValue
   1064   /// CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
   1065   /// CHECK-DAG:     <<And:i\d+>>      And [<<Arg>>,<<Const0>>]
   1066   /// CHECK-DAG:                       Return [<<And>>]
   1067 
   1068   /// CHECK-START: int Main.And0(int) constant_folding (after)
   1069   /// CHECK-DAG:     <<Arg:i\d+>>      ParameterValue
   1070   /// CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
   1071   /// CHECK-DAG:                       Return [<<Const0>>]
   1072 
   1073   /// CHECK-START: int Main.And0(int) constant_folding (after)
   1074   /// CHECK-NOT:                       And
   1075 
   1076   public static int And0(int arg) {
   1077     return arg & 0;
   1078   }
   1079 
   1080   /// CHECK-START: long Main.Mul0(long) constant_folding (before)
   1081   /// CHECK-DAG:     <<Arg:j\d+>>      ParameterValue
   1082   /// CHECK-DAG:     <<Const0:j\d+>>   LongConstant 0
   1083   /// CHECK-DAG:     <<Mul:j\d+>>      Mul [<<Const0>>,<<Arg>>]
   1084   /// CHECK-DAG:                       Return [<<Mul>>]
   1085 
   1086   /// CHECK-START: long Main.Mul0(long) constant_folding (after)
   1087   /// CHECK-DAG:     <<Arg:j\d+>>      ParameterValue
   1088   /// CHECK-DAG:     <<Const0:j\d+>>   LongConstant 0
   1089   /// CHECK-DAG:                       Return [<<Const0>>]
   1090 
   1091   /// CHECK-START: long Main.Mul0(long) constant_folding (after)
   1092   /// CHECK-NOT:                       Mul
   1093 
   1094   public static long Mul0(long arg) {
   1095     return arg * 0;
   1096   }
   1097 
   1098   /// CHECK-START: int Main.OrAllOnes(int) constant_folding (before)
   1099   /// CHECK-DAG:     <<Arg:i\d+>>      ParameterValue
   1100   /// CHECK-DAG:     <<ConstF:i\d+>>   IntConstant -1
   1101   /// CHECK-DAG:     <<Or:i\d+>>       Or [<<Arg>>,<<ConstF>>]
   1102   /// CHECK-DAG:                       Return [<<Or>>]
   1103 
   1104   /// CHECK-START: int Main.OrAllOnes(int) constant_folding (after)
   1105   /// CHECK-DAG:     <<ConstF:i\d+>>   IntConstant -1
   1106   /// CHECK-DAG:                       Return [<<ConstF>>]
   1107 
   1108   /// CHECK-START: int Main.OrAllOnes(int) constant_folding (after)
   1109   /// CHECK-NOT:                       Or
   1110 
   1111   public static int OrAllOnes(int arg) {
   1112     return arg | -1;
   1113   }
   1114 
   1115   /// CHECK-START: long Main.Rem0(long) constant_folding (before)
   1116   /// CHECK-DAG:     <<Arg:j\d+>>           ParameterValue
   1117   /// CHECK-DAG:     <<Const0:j\d+>>        LongConstant 0
   1118   /// CHECK-DAG:     <<DivZeroCheck:j\d+>>  DivZeroCheck [<<Arg>>]
   1119   /// CHECK-DAG:     <<Rem:j\d+>>           Rem [<<Const0>>,<<DivZeroCheck>>]
   1120   /// CHECK-DAG:                            Return [<<Rem>>]
   1121 
   1122   /// CHECK-START: long Main.Rem0(long) constant_folding (after)
   1123   /// CHECK-DAG:     <<Const0:j\d+>>        LongConstant 0
   1124   /// CHECK-DAG:                            Return [<<Const0>>]
   1125 
   1126   /// CHECK-START: long Main.Rem0(long) constant_folding (after)
   1127   /// CHECK-NOT:                            Rem
   1128 
   1129   public static long Rem0(long arg) {
   1130     return 0 % arg;
   1131   }
   1132 
   1133   /// CHECK-START: int Main.Rem1(int) constant_folding (before)
   1134   /// CHECK-DAG:     <<Arg:i\d+>>      ParameterValue
   1135   /// CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
   1136   /// CHECK-DAG:     <<Rem:i\d+>>      Rem [<<Arg>>,<<Const1>>]
   1137   /// CHECK-DAG:                       Return [<<Rem>>]
   1138 
   1139   /// CHECK-START: int Main.Rem1(int) constant_folding (after)
   1140   /// CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
   1141   /// CHECK-DAG:                       Return [<<Const0>>]
   1142 
   1143   /// CHECK-START: int Main.Rem1(int) constant_folding (after)
   1144   /// CHECK-NOT:                       Rem
   1145 
   1146   public static int Rem1(int arg) {
   1147     return arg % 1;
   1148   }
   1149 
   1150   /// CHECK-START: long Main.RemN1(long) constant_folding (before)
   1151   /// CHECK-DAG:     <<Arg:j\d+>>           ParameterValue
   1152   /// CHECK-DAG:     <<ConstN1:j\d+>>       LongConstant -1
   1153   /// CHECK-DAG:     <<DivZeroCheck:j\d+>>  DivZeroCheck [<<ConstN1>>]
   1154   /// CHECK-DAG:     <<Rem:j\d+>>           Rem [<<Arg>>,<<DivZeroCheck>>]
   1155   /// CHECK-DAG:                            Return [<<Rem>>]
   1156 
   1157   /// CHECK-START: long Main.RemN1(long) constant_folding (after)
   1158   /// CHECK-DAG:     <<Const0:j\d+>>        LongConstant 0
   1159   /// CHECK-DAG:                            Return [<<Const0>>]
   1160 
   1161   /// CHECK-START: long Main.RemN1(long) constant_folding (after)
   1162   /// CHECK-NOT:                            Rem
   1163 
   1164   public static long RemN1(long arg) {
   1165     return arg % -1;
   1166   }
   1167 
   1168   /// CHECK-START: int Main.Shl0(int) constant_folding (before)
   1169   /// CHECK-DAG:     <<Arg:i\d+>>      ParameterValue
   1170   /// CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
   1171   /// CHECK-DAG:     <<Shl:i\d+>>      Shl [<<Const0>>,<<Arg>>]
   1172   /// CHECK-DAG:                       Return [<<Shl>>]
   1173 
   1174   /// CHECK-START: int Main.Shl0(int) constant_folding (after)
   1175   /// CHECK-DAG:     <<Arg:i\d+>>      ParameterValue
   1176   /// CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
   1177   /// CHECK-DAG:                       Return [<<Const0>>]
   1178 
   1179   /// CHECK-START: int Main.Shl0(int) constant_folding (after)
   1180   /// CHECK-NOT:                       Shl
   1181 
   1182   public static int Shl0(int arg) {
   1183     return 0 << arg;
   1184   }
   1185 
   1186   /// CHECK-START: long Main.ShlLong0WithInt(int) constant_folding (before)
   1187   /// CHECK-DAG:     <<Arg:i\d+>>      ParameterValue
   1188   /// CHECK-DAG:     <<Const0L:j\d+>>  LongConstant 0
   1189   /// CHECK-DAG:     <<Shl:j\d+>>      Shl [<<Const0L>>,<<Arg>>]
   1190   /// CHECK-DAG:                       Return [<<Shl>>]
   1191 
   1192   /// CHECK-START: long Main.ShlLong0WithInt(int) constant_folding (after)
   1193   /// CHECK-DAG:     <<Arg:i\d+>>      ParameterValue
   1194   /// CHECK-DAG:     <<Const0L:j\d+>>  LongConstant 0
   1195   /// CHECK-DAG:                       Return [<<Const0L>>]
   1196 
   1197   /// CHECK-START: long Main.ShlLong0WithInt(int) constant_folding (after)
   1198   /// CHECK-NOT:                       Shl
   1199 
   1200   public static long ShlLong0WithInt(int arg) {
   1201     long long_zero = 0;
   1202     return long_zero << arg;
   1203   }
   1204 
   1205   /// CHECK-START: long Main.Shr0(int) constant_folding (before)
   1206   /// CHECK-DAG:     <<Arg:i\d+>>      ParameterValue
   1207   /// CHECK-DAG:     <<Const0:j\d+>>   LongConstant 0
   1208   /// CHECK-DAG:     <<Shr:j\d+>>      Shr [<<Const0>>,<<Arg>>]
   1209   /// CHECK-DAG:                       Return [<<Shr>>]
   1210 
   1211   /// CHECK-START: long Main.Shr0(int) constant_folding (after)
   1212   /// CHECK-DAG:     <<Arg:i\d+>>      ParameterValue
   1213   /// CHECK-DAG:     <<Const0:j\d+>>   LongConstant 0
   1214   /// CHECK-DAG:                       Return [<<Const0>>]
   1215 
   1216   /// CHECK-START: long Main.Shr0(int) constant_folding (after)
   1217   /// CHECK-NOT:                       Shr
   1218 
   1219   public static long Shr0(int arg) {
   1220     return (long)0 >> arg;
   1221   }
   1222 
   1223   /// CHECK-START: long Main.SubSameLong(long) constant_folding (before)
   1224   /// CHECK-DAG:     <<Arg:j\d+>>      ParameterValue
   1225   /// CHECK-DAG:     <<Sub:j\d+>>      Sub [<<Arg>>,<<Arg>>]
   1226   /// CHECK-DAG:                       Return [<<Sub>>]
   1227 
   1228   /// CHECK-START: long Main.SubSameLong(long) constant_folding (after)
   1229   /// CHECK-DAG:     <<Arg:j\d+>>      ParameterValue
   1230   /// CHECK-DAG:     <<Const0:j\d+>>   LongConstant 0
   1231   /// CHECK-DAG:                       Return [<<Const0>>]
   1232 
   1233   /// CHECK-START: long Main.SubSameLong(long) constant_folding (after)
   1234   /// CHECK-NOT:                       Sub
   1235 
   1236   public static long SubSameLong(long arg) {
   1237     return arg - arg;
   1238   }
   1239 
   1240   /// CHECK-START: int Main.UShr0(int) constant_folding (before)
   1241   /// CHECK-DAG:     <<Arg:i\d+>>      ParameterValue
   1242   /// CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
   1243   /// CHECK-DAG:     <<UShr:i\d+>>     UShr [<<Const0>>,<<Arg>>]
   1244   /// CHECK-DAG:                       Return [<<UShr>>]
   1245 
   1246   /// CHECK-START: int Main.UShr0(int) constant_folding (after)
   1247   /// CHECK-DAG:     <<Arg:i\d+>>      ParameterValue
   1248   /// CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
   1249   /// CHECK-DAG:                       Return [<<Const0>>]
   1250 
   1251   /// CHECK-START: int Main.UShr0(int) constant_folding (after)
   1252   /// CHECK-NOT:                       UShr
   1253 
   1254   public static int UShr0(int arg) {
   1255     return 0 >>> arg;
   1256   }
   1257 
   1258   /// CHECK-START: int Main.XorSameInt(int) constant_folding (before)
   1259   /// CHECK-DAG:     <<Arg:i\d+>>      ParameterValue
   1260   /// CHECK-DAG:     <<Xor:i\d+>>      Xor [<<Arg>>,<<Arg>>]
   1261   /// CHECK-DAG:                       Return [<<Xor>>]
   1262 
   1263   /// CHECK-START: int Main.XorSameInt(int) constant_folding (after)
   1264   /// CHECK-DAG:     <<Arg:i\d+>>      ParameterValue
   1265   /// CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
   1266   /// CHECK-DAG:                       Return [<<Const0>>]
   1267 
   1268   /// CHECK-START: int Main.XorSameInt(int) constant_folding (after)
   1269   /// CHECK-NOT:                       Xor
   1270 
   1271   public static int XorSameInt(int arg) {
   1272     return arg ^ arg;
   1273   }
   1274 
   1275   /// CHECK-START: boolean Main.CmpFloatGreaterThanNaN(float) constant_folding (before)
   1276   /// CHECK-DAG:     <<Arg:f\d+>>      ParameterValue
   1277   /// CHECK-DAG:     <<ConstNan:f\d+>> FloatConstant nan
   1278   /// CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
   1279   /// CHECK-DAG:                       IntConstant 1
   1280   /// CHECK-DAG:     <<Cmp:i\d+>>      Compare [<<Arg>>,<<ConstNan>>]
   1281   /// CHECK-DAG:     <<Le:z\d+>>       LessThanOrEqual [<<Cmp>>,<<Const0>>]
   1282   /// CHECK-DAG:                       If [<<Le>>]
   1283 
   1284   /// CHECK-START: boolean Main.CmpFloatGreaterThanNaN(float) constant_folding (after)
   1285   /// CHECK-DAG:                       ParameterValue
   1286   /// CHECK-DAG:                       FloatConstant nan
   1287   /// CHECK-DAG:                       IntConstant 0
   1288   /// CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
   1289   /// CHECK-DAG:                       If [<<Const1>>]
   1290 
   1291   /// CHECK-START: boolean Main.CmpFloatGreaterThanNaN(float) constant_folding (after)
   1292   /// CHECK-NOT:                       Compare
   1293   /// CHECK-NOT:                       LessThanOrEqual
   1294 
   1295   public static boolean CmpFloatGreaterThanNaN(float arg) {
   1296     return arg > Float.NaN;
   1297   }
   1298 
   1299   /// CHECK-START: boolean Main.CmpDoubleLessThanNaN(double) constant_folding (before)
   1300   /// CHECK-DAG:     <<Arg:d\d+>>      ParameterValue
   1301   /// CHECK-DAG:     <<ConstNan:d\d+>> DoubleConstant nan
   1302   /// CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
   1303   /// CHECK-DAG:                       IntConstant 1
   1304   /// CHECK-DAG:     <<Cmp:i\d+>>      Compare [<<Arg>>,<<ConstNan>>]
   1305   /// CHECK-DAG:     <<Ge:z\d+>>       GreaterThanOrEqual [<<Cmp>>,<<Const0>>]
   1306   /// CHECK-DAG:                       If [<<Ge>>]
   1307 
   1308   /// CHECK-START: boolean Main.CmpDoubleLessThanNaN(double) constant_folding (after)
   1309   /// CHECK-DAG:                       ParameterValue
   1310   /// CHECK-DAG:                       DoubleConstant nan
   1311   /// CHECK-DAG:                       IntConstant 0
   1312   /// CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
   1313   /// CHECK-DAG:                       If [<<Const1>>]
   1314 
   1315   /// CHECK-START: boolean Main.CmpDoubleLessThanNaN(double) constant_folding (after)
   1316   /// CHECK-NOT:                       Compare
   1317   /// CHECK-NOT:                       GreaterThanOrEqual
   1318 
   1319   public static boolean CmpDoubleLessThanNaN(double arg) {
   1320     return arg < Double.NaN;
   1321   }
   1322 
   1323 
   1324   /**
   1325    * Exercise constant folding on type conversions.
   1326    */
   1327 
   1328   /// CHECK-START: int Main.ReturnInt33() constant_folding_after_inlining (before)
   1329   /// CHECK-DAG:     <<Const33:j\d+>>  LongConstant 33
   1330   /// CHECK-DAG:     <<Convert:i\d+>>  TypeConversion [<<Const33>>]
   1331   /// CHECK-DAG:                       Return [<<Convert>>]
   1332 
   1333   /// CHECK-START: int Main.ReturnInt33() constant_folding_after_inlining (after)
   1334   /// CHECK-DAG:     <<Const33:i\d+>>  IntConstant 33
   1335   /// CHECK-DAG:                       Return [<<Const33>>]
   1336 
   1337   /// CHECK-START: int Main.ReturnInt33() constant_folding_after_inlining (after)
   1338   /// CHECK-NOT:                       TypeConversion
   1339 
   1340   public static int ReturnInt33() {
   1341     long imm = $inline$long(33L);
   1342     return (int) imm;
   1343   }
   1344 
   1345   /// CHECK-START: int Main.ReturnIntMax() constant_folding_after_inlining (before)
   1346   /// CHECK-DAG:     <<ConstMax:f\d+>> FloatConstant 1e+34
   1347   /// CHECK-DAG:     <<Convert:i\d+>>  TypeConversion [<<ConstMax>>]
   1348   /// CHECK-DAG:                       Return [<<Convert>>]
   1349 
   1350   /// CHECK-START: int Main.ReturnIntMax() constant_folding_after_inlining (after)
   1351   /// CHECK-DAG:     <<ConstMax:i\d+>> IntConstant 2147483647
   1352   /// CHECK-DAG:                       Return [<<ConstMax>>]
   1353 
   1354   /// CHECK-START: int Main.ReturnIntMax() constant_folding_after_inlining (after)
   1355   /// CHECK-NOT:                       TypeConversion
   1356 
   1357   public static int ReturnIntMax() {
   1358     float imm = $inline$float(1.0e34f);
   1359     return (int) imm;
   1360   }
   1361 
   1362   /// CHECK-START: int Main.ReturnInt0() constant_folding_after_inlining (before)
   1363   /// CHECK-DAG:     <<ConstNaN:d\d+>> DoubleConstant nan
   1364   /// CHECK-DAG:     <<Convert:i\d+>>  TypeConversion [<<ConstNaN>>]
   1365   /// CHECK-DAG:                       Return [<<Convert>>]
   1366 
   1367   /// CHECK-START: int Main.ReturnInt0() constant_folding_after_inlining (after)
   1368   /// CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
   1369   /// CHECK-DAG:                       Return [<<Const0>>]
   1370 
   1371   /// CHECK-START: int Main.ReturnInt0() constant_folding_after_inlining (after)
   1372   /// CHECK-NOT:                       TypeConversion
   1373 
   1374   public static int ReturnInt0() {
   1375     double imm = $inline$double(Double.NaN);
   1376     return (int) imm;
   1377   }
   1378 
   1379   /// CHECK-START: long Main.ReturnLong33() constant_folding_after_inlining (before)
   1380   /// CHECK-DAG:     <<Const33:i\d+>>  IntConstant 33
   1381   /// CHECK-DAG:     <<Convert:j\d+>>  TypeConversion [<<Const33>>]
   1382   /// CHECK-DAG:                       Return [<<Convert>>]
   1383 
   1384   /// CHECK-START: long Main.ReturnLong33() constant_folding_after_inlining (after)
   1385   /// CHECK-DAG:     <<Const33:j\d+>>  LongConstant 33
   1386   /// CHECK-DAG:                       Return [<<Const33>>]
   1387 
   1388   /// CHECK-START: long Main.ReturnLong33() constant_folding_after_inlining (after)
   1389   /// CHECK-NOT:                       TypeConversion
   1390 
   1391   public static long ReturnLong33() {
   1392     int imm = $inline$int(33);
   1393     return (long) imm;
   1394   }
   1395 
   1396   /// CHECK-START: long Main.ReturnLong34() constant_folding_after_inlining (before)
   1397   /// CHECK-DAG:     <<Const34:f\d+>>  FloatConstant 34
   1398   /// CHECK-DAG:     <<Convert:j\d+>>  TypeConversion [<<Const34>>]
   1399   /// CHECK-DAG:                       Return [<<Convert>>]
   1400 
   1401   /// CHECK-START: long Main.ReturnLong34() constant_folding_after_inlining (after)
   1402   /// CHECK-DAG:     <<Const34:j\d+>>  LongConstant 34
   1403   /// CHECK-DAG:                       Return [<<Const34>>]
   1404 
   1405   /// CHECK-START: long Main.ReturnLong34() constant_folding_after_inlining (after)
   1406   /// CHECK-NOT:                       TypeConversion
   1407 
   1408   public static long ReturnLong34() {
   1409     float imm = $inline$float(34.0f);
   1410     return (long) imm;
   1411   }
   1412 
   1413   /// CHECK-START: long Main.ReturnLong0() constant_folding_after_inlining (before)
   1414   /// CHECK-DAG:     <<ConstNaN:d\d+>> DoubleConstant nan
   1415   /// CHECK-DAG:     <<Convert:j\d+>>  TypeConversion [<<ConstNaN>>]
   1416   /// CHECK-DAG:                       Return [<<Convert>>]
   1417 
   1418   /// CHECK-START: long Main.ReturnLong0() constant_folding_after_inlining (after)
   1419   /// CHECK-DAG:     <<Const0:j\d+>>   LongConstant 0
   1420   /// CHECK-DAG:                       Return [<<Const0>>]
   1421 
   1422   /// CHECK-START: long Main.ReturnLong0() constant_folding_after_inlining (after)
   1423   /// CHECK-NOT:                       TypeConversion
   1424 
   1425   public static long ReturnLong0() {
   1426     double imm = $inline$double(-Double.NaN);
   1427     return (long) imm;
   1428   }
   1429 
   1430   /// CHECK-START: float Main.ReturnFloat33() constant_folding_after_inlining (before)
   1431   /// CHECK-DAG:     <<Const33:i\d+>>  IntConstant 33
   1432   /// CHECK-DAG:     <<Convert:f\d+>>  TypeConversion [<<Const33>>]
   1433   /// CHECK-DAG:                       Return [<<Convert>>]
   1434 
   1435   /// CHECK-START: float Main.ReturnFloat33() constant_folding_after_inlining (after)
   1436   /// CHECK-DAG:     <<Const33:f\d+>>  FloatConstant 33
   1437   /// CHECK-DAG:                       Return [<<Const33>>]
   1438 
   1439   /// CHECK-START: float Main.ReturnFloat33() constant_folding_after_inlining (after)
   1440   /// CHECK-NOT:                       TypeConversion
   1441 
   1442   public static float ReturnFloat33() {
   1443     int imm = $inline$int(33);
   1444     return (float) imm;
   1445   }
   1446 
   1447   /// CHECK-START: float Main.ReturnFloat34() constant_folding_after_inlining (before)
   1448   /// CHECK-DAG:     <<Const34:j\d+>>  LongConstant 34
   1449   /// CHECK-DAG:     <<Convert:f\d+>>  TypeConversion [<<Const34>>]
   1450   /// CHECK-DAG:                       Return [<<Convert>>]
   1451 
   1452   /// CHECK-START: float Main.ReturnFloat34() constant_folding_after_inlining (after)
   1453   /// CHECK-DAG:     <<Const34:f\d+>>  FloatConstant 34
   1454   /// CHECK-DAG:                       Return [<<Const34>>]
   1455 
   1456   /// CHECK-START: float Main.ReturnFloat34() constant_folding_after_inlining (after)
   1457   /// CHECK-NOT:                       TypeConversion
   1458 
   1459   public static float ReturnFloat34() {
   1460     long imm = $inline$long(34L);
   1461     return (float) imm;
   1462   }
   1463 
   1464   /// CHECK-START: float Main.ReturnFloat99P25() constant_folding_after_inlining (before)
   1465   /// CHECK-DAG:     <<Const:d\d+>>    DoubleConstant 99.25
   1466   /// CHECK-DAG:     <<Convert:f\d+>>  TypeConversion [<<Const>>]
   1467   /// CHECK-DAG:                       Return [<<Convert>>]
   1468 
   1469   /// CHECK-START: float Main.ReturnFloat99P25() constant_folding_after_inlining (after)
   1470   /// CHECK-DAG:     <<Const:f\d+>>    FloatConstant 99.25
   1471   /// CHECK-DAG:                       Return [<<Const>>]
   1472 
   1473   /// CHECK-START: float Main.ReturnFloat99P25() constant_folding_after_inlining (after)
   1474   /// CHECK-NOT:                       TypeConversion
   1475 
   1476   public static float ReturnFloat99P25() {
   1477     double imm = $inline$double(99.25);
   1478     return (float) imm;
   1479   }
   1480 
   1481   /// CHECK-START: double Main.ReturnDouble33() constant_folding_after_inlining (before)
   1482   /// CHECK-DAG:     <<Const33:i\d+>>  IntConstant 33
   1483   /// CHECK-DAG:     <<Convert:d\d+>>  TypeConversion [<<Const33>>]
   1484   /// CHECK-DAG:                       Return [<<Convert>>]
   1485 
   1486   /// CHECK-START: double Main.ReturnDouble33() constant_folding_after_inlining (after)
   1487   /// CHECK-DAG:     <<Const33:d\d+>>  DoubleConstant 33
   1488   /// CHECK-DAG:                       Return [<<Const33>>]
   1489 
   1490   public static double ReturnDouble33() {
   1491     int imm = $inline$int(33);
   1492     return (double) imm;
   1493   }
   1494 
   1495   /// CHECK-START: double Main.ReturnDouble34() constant_folding_after_inlining (before)
   1496   /// CHECK-DAG:     <<Const34:j\d+>>  LongConstant 34
   1497   /// CHECK-DAG:     <<Convert:d\d+>>  TypeConversion [<<Const34>>]
   1498   /// CHECK-DAG:                       Return [<<Convert>>]
   1499 
   1500   /// CHECK-START: double Main.ReturnDouble34() constant_folding_after_inlining (after)
   1501   /// CHECK-DAG:     <<Const34:d\d+>>  DoubleConstant 34
   1502   /// CHECK-DAG:                       Return [<<Const34>>]
   1503 
   1504   /// CHECK-START: double Main.ReturnDouble34() constant_folding_after_inlining (after)
   1505   /// CHECK-NOT:                       TypeConversion
   1506 
   1507   public static double ReturnDouble34() {
   1508     long imm = $inline$long(34L);
   1509     return (double) imm;
   1510   }
   1511 
   1512   /// CHECK-START: double Main.ReturnDouble99P25() constant_folding_after_inlining (before)
   1513   /// CHECK-DAG:     <<Const:f\d+>>    FloatConstant 99.25
   1514   /// CHECK-DAG:     <<Convert:d\d+>>  TypeConversion [<<Const>>]
   1515   /// CHECK-DAG:                       Return [<<Convert>>]
   1516 
   1517   /// CHECK-START: double Main.ReturnDouble99P25() constant_folding_after_inlining (after)
   1518   /// CHECK-DAG:     <<Const:d\d+>>    DoubleConstant 99.25
   1519   /// CHECK-DAG:                       Return [<<Const>>]
   1520 
   1521   /// CHECK-START: double Main.ReturnDouble99P25() constant_folding_after_inlining (after)
   1522   /// CHECK-NOT:                       TypeConversion
   1523 
   1524   public static double ReturnDouble99P25() {
   1525     float imm = $inline$float(99.25f);
   1526     return (double) imm;
   1527   }
   1528 
   1529 
   1530   public static void main(String[] args) throws Exception {
   1531     assertIntEquals(-42, IntNegation());
   1532     assertLongEquals(-42L, LongNegation());
   1533     assertFloatEquals(-42F, FloatNegation());
   1534     assertDoubleEquals(-42D, DoubleNegation());
   1535 
   1536     assertIntEquals(3, IntAddition1());
   1537     assertIntEquals(14, IntAddition2());
   1538     assertLongEquals(3L, LongAddition());
   1539     assertFloatEquals(3F, FloatAddition());
   1540     assertDoubleEquals(3D, DoubleAddition());
   1541 
   1542     assertIntEquals(4, IntSubtraction());
   1543     assertLongEquals(4L, LongSubtraction());
   1544     assertFloatEquals(4F, FloatSubtraction());
   1545     assertDoubleEquals(4D, DoubleSubtraction());
   1546 
   1547     assertIntEquals(21, IntMultiplication());
   1548     assertLongEquals(21L, LongMultiplication());
   1549     assertFloatEquals(21F, FloatMultiplication());
   1550     assertDoubleEquals(21D, DoubleMultiplication());
   1551 
   1552     assertIntEquals(2, IntDivision());
   1553     assertLongEquals(2L, LongDivision());
   1554     assertFloatEquals(3.2F, FloatDivision());
   1555     assertDoubleEquals(3.2D, DoubleDivision());
   1556 
   1557     assertIntEquals(2, IntRemainder());
   1558     assertLongEquals(2L, LongRemainder());
   1559     assertFloatEquals(0.5F, FloatRemainder());
   1560     assertDoubleEquals(0.5D, DoubleRemainder());
   1561 
   1562     assertIntEquals(4, ShlIntLong());
   1563     assertLongEquals(12L, ShlLongInt());
   1564 
   1565     assertIntEquals(1, ShrIntLong());
   1566     assertLongEquals(2L, ShrLongInt());
   1567 
   1568     assertIntEquals(1073741822, UShrIntLong());
   1569     assertLongEquals(4611686018427387901L, UShrLongInt());
   1570 
   1571     assertLongEquals(2, AndIntLong());
   1572     assertLongEquals(2, AndLongInt());
   1573 
   1574     assertLongEquals(11, OrIntLong());
   1575     assertLongEquals(11, OrLongInt());
   1576 
   1577     assertLongEquals(9, XorIntLong());
   1578     assertLongEquals(9, XorLongInt());
   1579 
   1580     assertIntEquals(5, StaticCondition());
   1581     assertIntEquals(5, StaticConditionNulls());
   1582 
   1583     assertIntEquals(7, JumpsAndConditionals(true));
   1584     assertIntEquals(3, JumpsAndConditionals(false));
   1585 
   1586     int arbitrary = 123456;  // Value chosen arbitrarily.
   1587 
   1588     assertIntEquals(0, And0(arbitrary));
   1589     assertLongEquals(0, Mul0(arbitrary));
   1590     assertIntEquals(-1, OrAllOnes(arbitrary));
   1591     assertLongEquals(0, Rem0(arbitrary));
   1592     assertIntEquals(0, Rem1(arbitrary));
   1593     assertLongEquals(0, RemN1(arbitrary));
   1594     assertIntEquals(0, Shl0(arbitrary));
   1595     assertLongEquals(0, ShlLong0WithInt(arbitrary));
   1596     assertLongEquals(0, Shr0(arbitrary));
   1597     assertLongEquals(0, SubSameLong(arbitrary));
   1598     assertIntEquals(0, UShr0(arbitrary));
   1599     assertIntEquals(0, XorSameInt(arbitrary));
   1600 
   1601     assertFalse(CmpFloatGreaterThanNaN(arbitrary));
   1602     assertFalse(CmpDoubleLessThanNaN(arbitrary));
   1603 
   1604     Main main = new Main();
   1605     assertIntEquals(1, main.smaliCmpLongConstants());
   1606     assertIntEquals(-1, main.smaliCmpGtFloatConstants());
   1607     assertIntEquals(-1, main.smaliCmpLtFloatConstants());
   1608     assertIntEquals(-1, main.smaliCmpGtDoubleConstants());
   1609     assertIntEquals(-1, main.smaliCmpLtDoubleConstants());
   1610 
   1611     assertIntEquals(0, main.smaliCmpLongSameConstant());
   1612     assertIntEquals(0, main.smaliCmpGtFloatSameConstant());
   1613     assertIntEquals(0, main.smaliCmpLtFloatSameConstant());
   1614     assertIntEquals(0, main.smaliCmpGtDoubleSameConstant());
   1615     assertIntEquals(0, main.smaliCmpLtDoubleSameConstant());
   1616 
   1617     assertIntEquals(1, main.smaliCmpGtFloatConstantWithNaN());
   1618     assertIntEquals(-1, main.smaliCmpLtFloatConstantWithNaN());
   1619     assertIntEquals(1, main.smaliCmpGtDoubleConstantWithNaN());
   1620     assertIntEquals(-1, main.smaliCmpLtDoubleConstantWithNaN());
   1621 
   1622     assertIntEquals(33, ReturnInt33());
   1623     assertIntEquals(2147483647, ReturnIntMax());
   1624     assertIntEquals(0, ReturnInt0());
   1625 
   1626     assertLongEquals(33, ReturnLong33());
   1627     assertLongEquals(34, ReturnLong34());
   1628     assertLongEquals(0, ReturnLong0());
   1629 
   1630     assertFloatEquals(33, ReturnFloat33());
   1631     assertFloatEquals(34, ReturnFloat34());
   1632     assertFloatEquals(99.25f, ReturnFloat99P25());
   1633 
   1634     assertDoubleEquals(33, ReturnDouble33());
   1635     assertDoubleEquals(34, ReturnDouble34());
   1636     assertDoubleEquals(99.25, ReturnDouble99P25());
   1637   }
   1638 
   1639   Main() throws ClassNotFoundException {
   1640     testCmp = Class.forName("TestCmp");
   1641   }
   1642 
   1643   private Class<?> testCmp;
   1644 }
   1645