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 doitUpInt(int n)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 doitDownInt(int n)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: int Main.doitDownInt2(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: int Main.doitDownInt2(int) loop_optimization (after) 58 /// CHECK-NOT: Phi doitDownInt2(int n)59 static int doitDownInt2(int n) { 60 // Complete loop is replaced by last-value. 61 int lI = 1; 62 for (int i1 = n; i1 > 0; i1--) { 63 lI = (1486662021 - lI); 64 } 65 return lI; 66 } 67 68 /// CHECK-START: float Main.doitUpFloat(int) loop_optimization (before) 69 /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 70 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none 71 // 72 /// CHECK-START: float Main.doitUpFloat(int) loop_optimization (after) 73 /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 74 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none doitUpFloat(int n)75 static float doitUpFloat(int n) { 76 // FP arithmetic is not sufficiently precise. 77 // The loop remains. 78 float lF = 1.0f; 79 for (int i1 = 0; i1 < n; i1++) { 80 lF = (1486662021.0f - lF); 81 } 82 return lF; 83 } 84 85 /// CHECK-START: float Main.doitDownFloat(int) loop_optimization (before) 86 /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 87 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none 88 // 89 /// CHECK-START: float Main.doitDownFloat(int) loop_optimization (after) 90 /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 91 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none doitDownFloat(int n)92 static float doitDownFloat(int n) { 93 // FP arithmetic is not sufficiently precise. 94 // The loop remains. 95 float lF = 1.0f; 96 for (int i1 = n - 1; i1 >= 0; i1--) { 97 lF = (1486662021.0f - lF); 98 } 99 return lF; 100 } 101 102 /// CHECK-START: float Main.doitUpFloatAlt(int) loop_optimization (before) 103 /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 104 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none 105 // 106 /// CHECK-START: float Main.doitUpFloatAlt(int) loop_optimization (after) 107 /// CHECK-NOT: Phi doitUpFloatAlt(int n)108 static float doitUpFloatAlt(int n) { 109 // Complete loop is replaced by last-value 110 // since the values are now precise. 111 float lF = 1.0f; 112 float l2 = 1486662020.0f; 113 for (int i1 = 0; i1 < n; i1++) { 114 float old = lF; 115 lF = l2; 116 l2 = old; 117 } 118 return lF; 119 } 120 121 /// CHECK-START: float Main.doitDownFloatAlt(int) loop_optimization (before) 122 /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 123 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none 124 // 125 /// CHECK-START: float Main.doitDownFloatAlt(int) loop_optimization (after) 126 /// CHECK-NOT: Phi doitDownFloatAlt(int n)127 static float doitDownFloatAlt(int n) { 128 // Complete loop is replaced by last-value 129 // since the values are now precise. 130 float lF = 1.0f; 131 float l2 = 1486662020.0f; 132 for (int i1 = n - 1; i1 >= 0; i1--) { 133 float old = lF; 134 lF = l2; 135 l2 = old; 136 } 137 return lF; 138 } 139 140 /// CHECK-START: float Main.doitDownFloatAlt2(int) loop_optimization (before) 141 /// CHECK-DAG: <<Phi:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none 142 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none 143 // 144 /// CHECK-START: float Main.doitDownFloatAlt2(int) loop_optimization (after) 145 /// CHECK-NOT: Phi doitDownFloatAlt2(int n)146 static float doitDownFloatAlt2(int n) { 147 // Complete loop is replaced by last-value 148 // since the values are now precise. 149 float lF = 1.0f; 150 float l2 = 1486662020.0f; 151 for (int i1 = n; i1 > 0; i1--) { 152 float old = lF; 153 lF = l2; 154 l2 = old; 155 } 156 return lF; 157 } 158 159 // Main driver. main(String[] args)160 public static void main(String[] args) { 161 for (int i = 0; i < 10; i++) { 162 int ei = (i & 1) == 0 ? 1 : 1486662020; 163 int ci = doitUpInt(i); 164 expectEquals(ei, ci); 165 } 166 for (int i = 0; i < 10; i++) { 167 int ei = (i & 1) == 0 ? 1 : 1486662020; 168 int ci = doitDownInt(i); 169 expectEquals(ei, ci); 170 } 171 for (int i = 0; i < 10; i++) { 172 int ei = (i & 1) == 0 ? 1 : 1486662020; 173 int ci = doitDownInt2(i); 174 expectEquals(ei, ci); 175 } 176 for (int i = 0; i < 10; i++) { 177 float ef = i == 0 ? 1.0f : ((i & 1) == 0 ? 0.0f : 1486662021.0f); 178 float cf = doitUpFloat(i); 179 expectEquals(ef, cf); 180 } 181 for (int i = 0; i < 10; i++) { 182 float ef = i == 0 ? 1.0f : ((i & 1) == 0 ? 0.0f : 1486662021.0f); 183 float cf = doitDownFloat(i); 184 expectEquals(ef, cf); 185 } 186 for (int i = 0; i < 10; i++) { 187 float ef = (i & 1) == 0 ? 1.0f : 1486662020.0f; 188 float cf = doitUpFloatAlt(i); 189 expectEquals(ef, cf); 190 } 191 for (int i = 0; i < 10; i++) { 192 float ef = (i & 1) == 0 ? 1.0f : 1486662020.0f; 193 float cf = doitDownFloatAlt(i); 194 expectEquals(ef, cf); 195 } 196 for (int i = 0; i < 10; i++) { 197 float ef = (i & 1) == 0 ? 1.0f : 1486662020.0f; 198 float cf = doitDownFloatAlt2(i); 199 expectEquals(ef, cf); 200 } 201 System.out.println("passed"); 202 } 203 expectEquals(int expected, int result)204 private static void expectEquals(int expected, int result) { 205 if (expected != result) { 206 throw new Error("Expected: " + expected + ", found: " + result); 207 } 208 } 209 expectEquals(float expected, float result)210 private static void expectEquals(float expected, float result) { 211 if (expected != result) { 212 throw new Error("Expected: " + expected + ", found: " + result); 213 } 214 } 215 } 216 217 218