Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2017 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 /**
     18  * Tests for last value of a few periodic sequences
     19  * (found by fuzz testing).
     20  */
     21 public class Main {
     22 
     23   /// CHECK-START: int Main.doitUpInt(int) loop_optimization (before)
     24   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
     25   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
     26   //
     27   /// CHECK-START: int Main.doitUpInt(int) loop_optimization (after)
     28   /// CHECK-NOT: Phi
     29   static int doitUpInt(int n) {
     30     // Complete loop is replaced by last-value.
     31     int lI = 1;
     32     for (int i1 = 0; i1  < n; i1++) {
     33       lI = (1486662021 - lI);
     34     }
     35     return lI;
     36   }
     37 
     38   /// CHECK-START: int Main.doitDownInt(int) loop_optimization (before)
     39   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
     40   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
     41   //
     42   /// CHECK-START: int Main.doitDownInt(int) loop_optimization (after)
     43   /// CHECK-NOT: Phi
     44   static int doitDownInt(int n) {
     45     // Complete loop is replaced by last-value.
     46     int lI = 1;
     47     for (int i1 = n - 1; i1 >= 0; i1--) {
     48       lI = (1486662021 - lI);
     49     }
     50     return lI;
     51   }
     52 
     53   /// CHECK-START: float Main.doitUpFloat(int) loop_optimization (before)
     54   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
     55   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
     56   //
     57   /// CHECK-START: float Main.doitUpFloat(int) loop_optimization (after)
     58   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
     59   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
     60   static float doitUpFloat(int n) {
     61     // FP arithmetic is not sufficiently precise.
     62     // The loop remains.
     63     float lF = 1.0f;
     64     for (int i1 = 0; i1  < n; i1++) {
     65       lF = (1486662021.0f - lF);
     66     }
     67     return lF;
     68   }
     69 
     70   /// CHECK-START: float Main.doitDownFloat(int) loop_optimization (before)
     71   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
     72   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
     73   //
     74   /// CHECK-START: float Main.doitDownFloat(int) loop_optimization (after)
     75   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
     76   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
     77   static float doitDownFloat(int n) {
     78     // FP arithmetic is not sufficiently precise.
     79     // The loop remains.
     80     float lF = 1.0f;
     81     for (int i1 = n - 1; i1 >= 0; i1--) {
     82       lF = (1486662021.0f - lF);
     83     }
     84     return lF;
     85   }
     86 
     87   /// CHECK-START: float Main.doitUpFloatAlt(int) loop_optimization (before)
     88   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
     89   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
     90   //
     91   /// CHECK-START: float Main.doitUpFloatAlt(int) loop_optimization (after)
     92   /// CHECK-NOT: Phi
     93   static float doitUpFloatAlt(int n) {
     94     // Complete loop is replaced by last-value
     95     // since the values are now precise.
     96     float lF = 1.0f;
     97     float l2 = 1486662020.0f;
     98     for (int i1 = 0; i1  < n; i1++) {
     99       float old = lF;
    100       lF = l2;
    101       l2 = old;
    102     }
    103     return lF;
    104   }
    105 
    106   /// CHECK-START: float Main.doitDownFloatAlt(int) loop_optimization (before)
    107   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
    108   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
    109   //
    110   /// CHECK-START: float Main.doitDownFloatAlt(int) loop_optimization (after)
    111   /// CHECK-NOT: Phi
    112   static float doitDownFloatAlt(int n) {
    113     // Complete loop is replaced by last-value
    114     // since the values are now precise.
    115     float lF = 1.0f;
    116     float l2 = 1486662020.0f;
    117     for (int i1 = n - 1; i1 >= 0; i1--) {
    118       float old = lF;
    119       lF = l2;
    120       l2 = old;
    121     }
    122     return lF;
    123   }
    124 
    125   // Main driver.
    126   public static void main(String[] args) {
    127     for (int i = 0; i < 10; i++) {
    128       int ei = (i & 1) == 0 ? 1 : 1486662020;
    129       int ci = doitUpInt(i);
    130       expectEquals(ei, ci);
    131     }
    132     for (int i = 0; i < 10; i++) {
    133       int ei = (i & 1) == 0 ? 1 : 1486662020;
    134       int ci = doitDownInt(i);
    135       expectEquals(ei, ci);
    136     }
    137     for (int i = 0; i < 10; i++) {
    138       float ef = i == 0 ? 1.0f : ((i & 1) == 0 ? 0.0f : 1486662021.0f);
    139       float cf = doitUpFloat(i);
    140       expectEquals(ef, cf);
    141     }
    142     for (int i = 0; i < 10; i++) {
    143       float ef = i == 0 ? 1.0f : ((i & 1) == 0 ? 0.0f : 1486662021.0f);
    144       float cf = doitDownFloat(i);
    145       expectEquals(ef, cf);
    146     }
    147     for (int i = 0; i < 10; i++) {
    148       float ef = (i & 1) == 0 ? 1.0f : 1486662020.0f;
    149       float cf = doitUpFloatAlt(i);
    150       expectEquals(ef, cf);
    151     }
    152     for (int i = 0; i < 10; i++) {
    153       float ef = (i & 1) == 0 ? 1.0f : 1486662020.0f;
    154       float cf = doitDownFloatAlt(i);
    155       expectEquals(ef, cf);
    156     }
    157     System.out.println("passed");
    158   }
    159 
    160   private static void expectEquals(int expected, int result) {
    161     if (expected != result) {
    162       throw new Error("Expected: " + expected + ", found: " + result);
    163     }
    164   }
    165 
    166   private static void expectEquals(float expected, float result) {
    167     if (expected != result) {
    168       throw new Error("Expected: " + expected + ", found: " + result);
    169     }
    170   }
    171 }
    172 
    173 
    174