Roland Levillain | 78b3d5d | 2017-01-04 10:27:50 +0000 | [diff] [blame] | 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 | boolean b00; |
| 20 | boolean b01; |
| 21 | boolean b02; |
| 22 | boolean b03; |
| 23 | boolean b04; |
| 24 | boolean b05; |
| 25 | boolean b06; |
| 26 | boolean b07; |
| 27 | boolean b08; |
| 28 | boolean b09; |
| 29 | boolean b10; |
| 30 | boolean b11; |
| 31 | boolean b12; |
| 32 | boolean b13; |
| 33 | boolean b14; |
| 34 | boolean b15; |
| 35 | boolean b16; |
| 36 | boolean b17; |
| 37 | boolean b18; |
| 38 | boolean b19; |
| 39 | boolean b20; |
| 40 | boolean b21; |
| 41 | boolean b22; |
| 42 | boolean b23; |
| 43 | boolean b24; |
| 44 | boolean b25; |
| 45 | boolean b26; |
| 46 | boolean b27; |
| 47 | boolean b28; |
| 48 | boolean b29; |
| 49 | boolean b30; |
| 50 | boolean b31; |
| 51 | boolean b32; |
| 52 | boolean b33; |
| 53 | boolean b34; |
| 54 | boolean b35; |
| 55 | boolean b36; |
| 56 | |
| 57 | boolean conditionA; |
| 58 | boolean conditionB; |
| 59 | boolean conditionC; |
| 60 | |
| 61 | /// CHECK-START-ARM64: void Main.test() register (after) |
| 62 | /// CHECK: begin_block |
| 63 | /// CHECK: name "B0" |
| 64 | /// CHECK: <<This:l\d+>> ParameterValue |
| 65 | /// CHECK: end_block |
| 66 | /// CHECK: begin_block |
Nicolas Geoffray | 94cd28a | 2017-11-16 09:03:45 +0000 | [diff] [blame] | 67 | /// CHECK: successors "<<ThenBlock:B\d+>>" "<<ElseBlock:B\d+>>" |
Roland Levillain | 78b3d5d | 2017-01-04 10:27:50 +0000 | [diff] [blame] | 68 | /// CHECK: <<CondB:z\d+>> InstanceFieldGet [<<This>>] field_name:Main.conditionB |
| 69 | /// CHECK: If [<<CondB>>] |
Nicolas Geoffray | 94cd28a | 2017-11-16 09:03:45 +0000 | [diff] [blame] | 70 | /// CHECK: end_block |
| 71 | /// CHECK: begin_block |
| 72 | /// CHECK: name "<<ElseBlock>>" |
| 73 | /// CHECK: ParallelMove moves:[40(sp)->d0,24(sp)->32(sp),28(sp)->36(sp),d0->d3,d3->d4,d2->d5,d4->d6,d5->d7,d6->d18,d7->d19,d18->d20,d19->d21,d20->d22,d21->d23,d22->d10,d23->d11,16(sp)->24(sp),20(sp)->28(sp),d10->d14,d11->d12,d12->d13,d13->d1,d14->d2,32(sp)->16(sp),36(sp)->20(sp)] |
Roland Levillain | 78b3d5d | 2017-01-04 10:27:50 +0000 | [diff] [blame] | 74 | /// CHECK: end_block |
| 75 | |
| 76 | /// CHECK-START-ARM64: void Main.test() disassembly (after) |
| 77 | /// CHECK: begin_block |
| 78 | /// CHECK: name "B0" |
| 79 | /// CHECK: <<This:l\d+>> ParameterValue |
| 80 | /// CHECK: end_block |
| 81 | /// CHECK: begin_block |
| 82 | /// CHECK: successors "<<ThenBlock:B\d+>>" "<<ElseBlock:B\d+>>" |
| 83 | /// CHECK: <<CondB:z\d+>> InstanceFieldGet [<<This>>] field_name:Main.conditionB |
| 84 | /// CHECK: If [<<CondB>>] |
Nicolas Geoffray | 94cd28a | 2017-11-16 09:03:45 +0000 | [diff] [blame] | 85 | /// CHECK: end_block |
| 86 | /// CHECK: begin_block |
| 87 | /// CHECK: name "<<ElseBlock>>" |
| 88 | /// CHECK: ParallelMove moves:[invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid,invalid->invalid] |
| 89 | /// CHECK: fmov d31, d2 |
| 90 | /// CHECK: ldr s2, [sp, #36] |
| 91 | /// CHECK: ldr w16, [sp, #16] |
| 92 | /// CHECK: str w16, [sp, #36] |
| 93 | /// CHECK: str s14, [sp, #16] |
| 94 | /// CHECK: ldr s14, [sp, #28] |
| 95 | /// CHECK: str s1, [sp, #28] |
| 96 | /// CHECK: ldr s1, [sp, #32] |
| 97 | /// CHECK: str s31, [sp, #32] |
| 98 | /// CHECK: ldr s31, [sp, #20] |
| 99 | /// CHECK: str s31, [sp, #40] |
| 100 | /// CHECK: str s12, [sp, #20] |
| 101 | /// CHECK: fmov d12, d11 |
| 102 | /// CHECK: fmov d11, d10 |
| 103 | /// CHECK: fmov d10, d23 |
| 104 | /// CHECK: fmov d23, d22 |
| 105 | /// CHECK: fmov d22, d21 |
| 106 | /// CHECK: fmov d21, d20 |
| 107 | /// CHECK: fmov d20, d19 |
| 108 | /// CHECK: fmov d19, d18 |
| 109 | /// CHECK: fmov d18, d7 |
| 110 | /// CHECK: fmov d7, d6 |
| 111 | /// CHECK: fmov d6, d5 |
| 112 | /// CHECK: fmov d5, d4 |
| 113 | /// CHECK: fmov d4, d3 |
| 114 | /// CHECK: fmov d3, d13 |
| 115 | /// CHECK: ldr s13, [sp, #24] |
| 116 | /// CHECK: str s3, [sp, #24] |
| 117 | /// CHECK: ldr s3, pc+{{\d+}} (addr {{0x[0-9a-f]+}}) (100) |
Roland Levillain | 78b3d5d | 2017-01-04 10:27:50 +0000 | [diff] [blame] | 118 | /// CHECK: end_block |
| 119 | |
| 120 | public void test() { |
| 121 | String r = ""; |
| 122 | |
| 123 | // For the purpose of this regression test, the order of |
| 124 | // definition of these float variable matters. Likewise with the |
| 125 | // order of the instructions where these variables are used below. |
| 126 | // Reordering these lines make make the original (b/32545705) |
| 127 | // issue vanish. |
| 128 | float f17 = b17 ? 0.0f : 1.0f; |
| 129 | float f16 = b16 ? 0.0f : 1.0f; |
| 130 | float f18 = b18 ? 0.0f : 1.0f; |
| 131 | float f19 = b19 ? 0.0f : 1.0f; |
| 132 | float f20 = b20 ? 0.0f : 1.0f; |
| 133 | float f21 = b21 ? 0.0f : 1.0f; |
| 134 | float f15 = b15 ? 0.0f : 1.0f; |
| 135 | float f00 = b00 ? 0.0f : 1.0f; |
| 136 | float f22 = b22 ? 0.0f : 1.0f; |
| 137 | float f23 = b23 ? 0.0f : 1.0f; |
| 138 | float f24 = b24 ? 0.0f : 1.0f; |
| 139 | float f25 = b25 ? 0.0f : 1.0f; |
| 140 | float f26 = b26 ? 0.0f : 1.0f; |
| 141 | float f27 = b27 ? 0.0f : 1.0f; |
| 142 | float f29 = b29 ? 0.0f : 1.0f; |
| 143 | float f28 = b28 ? 0.0f : 1.0f; |
| 144 | float f01 = b01 ? 0.0f : 1.0f; |
| 145 | float f02 = b02 ? 0.0f : 1.0f; |
| 146 | float f03 = b03 ? 0.0f : 1.0f; |
| 147 | float f04 = b04 ? 0.0f : 1.0f; |
| 148 | float f05 = b05 ? 0.0f : 1.0f; |
| 149 | float f07 = b07 ? 0.0f : 1.0f; |
| 150 | float f06 = b06 ? 0.0f : 1.0f; |
| 151 | float f30 = b30 ? 0.0f : 1.0f; |
| 152 | float f31 = b31 ? 0.0f : 1.0f; |
| 153 | float f32 = b32 ? 0.0f : 1.0f; |
| 154 | float f33 = b33 ? 0.0f : 1.0f; |
| 155 | float f34 = b34 ? 0.0f : 1.0f; |
| 156 | float f36 = b36 ? 0.0f : 1.0f; |
| 157 | float f35 = b35 ? 0.0f : 1.0f; |
| 158 | float f08 = b08 ? 0.0f : 1.0f; |
| 159 | float f09 = b09 ? 0.0f : 1.0f; |
| 160 | float f10 = b10 ? 0.0f : 1.0f; |
| 161 | float f11 = b11 ? 0.0f : 1.0f; |
| 162 | float f12 = b12 ? 0.0f : 1.0f; |
| 163 | float f14 = b14 ? 0.0f : 1.0f; |
| 164 | float f13 = b13 ? 0.0f : 1.0f; |
| 165 | |
| 166 | if (conditionA) { |
| 167 | f16 /= 1000.0f; |
| 168 | f17 /= 1000.0f; |
| 169 | f18 /= 1000.0f; |
| 170 | f19 /= 1000.0f; |
| 171 | f20 /= 1000.0f; |
| 172 | f21 /= 1000.0f; |
| 173 | f15 /= 1000.0f; |
| 174 | f08 /= 1000.0f; |
| 175 | f09 /= 1000.0f; |
| 176 | f10 /= 1000.0f; |
| 177 | f11 /= 1000.0f; |
| 178 | f12 /= 1000.0f; |
| 179 | f30 /= 1000.0f; |
| 180 | f31 /= 1000.0f; |
| 181 | f32 /= 1000.0f; |
| 182 | f33 /= 1000.0f; |
| 183 | f34 /= 1000.0f; |
| 184 | f01 /= 1000.0f; |
| 185 | f02 /= 1000.0f; |
| 186 | f03 /= 1000.0f; |
| 187 | f04 /= 1000.0f; |
| 188 | f05 /= 1000.0f; |
| 189 | f23 /= 1000.0f; |
| 190 | f24 /= 1000.0f; |
| 191 | f25 /= 1000.0f; |
| 192 | f26 /= 1000.0f; |
| 193 | f27 /= 1000.0f; |
| 194 | f22 /= 1000.0f; |
| 195 | f00 /= 1000.0f; |
| 196 | f14 /= 1000.0f; |
| 197 | f13 /= 1000.0f; |
| 198 | f36 /= 1000.0f; |
| 199 | f35 /= 1000.0f; |
| 200 | f07 /= 1000.0f; |
| 201 | f06 /= 1000.0f; |
| 202 | f29 /= 1000.0f; |
| 203 | f28 /= 1000.0f; |
| 204 | } |
| 205 | // The parallel move that used to exhaust the ARM64 parallel move |
| 206 | // resolver's scratch register pool (provided by VIXL) was in the |
| 207 | // "else" branch of the following condition generated by ART's |
| 208 | // compiler. |
| 209 | if (conditionB) { |
| 210 | f16 /= 100.0f; |
| 211 | f17 /= 100.0f; |
| 212 | f18 /= 100.0f; |
| 213 | f19 /= 100.0f; |
| 214 | f20 /= 100.0f; |
| 215 | f21 /= 100.0f; |
| 216 | f15 /= 100.0f; |
| 217 | f08 /= 100.0f; |
| 218 | f09 /= 100.0f; |
| 219 | f10 /= 100.0f; |
| 220 | f11 /= 100.0f; |
| 221 | f12 /= 100.0f; |
| 222 | f30 /= 100.0f; |
| 223 | f31 /= 100.0f; |
| 224 | f32 /= 100.0f; |
| 225 | f33 /= 100.0f; |
| 226 | f34 /= 100.0f; |
| 227 | f01 /= 100.0f; |
| 228 | f02 /= 100.0f; |
| 229 | f03 /= 100.0f; |
| 230 | f04 /= 100.0f; |
| 231 | f05 /= 100.0f; |
| 232 | f23 /= 100.0f; |
| 233 | f24 /= 100.0f; |
| 234 | f25 /= 100.0f; |
| 235 | f26 /= 100.0f; |
| 236 | f27 /= 100.0f; |
| 237 | f22 /= 100.0f; |
| 238 | f00 /= 100.0f; |
| 239 | f14 /= 100.0f; |
| 240 | f13 /= 100.0f; |
| 241 | f36 /= 100.0f; |
| 242 | f35 /= 100.0f; |
| 243 | f07 /= 100.0f; |
| 244 | f06 /= 100.0f; |
| 245 | f29 /= 100.0f; |
| 246 | f28 /= 100.0f; |
| 247 | } |
| 248 | if (conditionC) { |
| 249 | f16 /= 12.0f; |
| 250 | f17 /= 12.0f; |
| 251 | f18 /= 12.0f; |
| 252 | f19 /= 12.0f; |
| 253 | f20 /= 12.0f; |
| 254 | f21 /= 12.0f; |
| 255 | f15 /= 12.0f; |
| 256 | f08 /= 12.0f; |
| 257 | f09 /= 12.0f; |
| 258 | f10 /= 12.0f; |
| 259 | f11 /= 12.0f; |
| 260 | f12 /= 12.0f; |
| 261 | f30 /= 12.0f; |
| 262 | f31 /= 12.0f; |
| 263 | f32 /= 12.0f; |
| 264 | f33 /= 12.0f; |
| 265 | f34 /= 12.0f; |
| 266 | f01 /= 12.0f; |
| 267 | f02 /= 12.0f; |
| 268 | f03 /= 12.0f; |
| 269 | f04 /= 12.0f; |
| 270 | f05 /= 12.0f; |
| 271 | f23 /= 12.0f; |
| 272 | f24 /= 12.0f; |
| 273 | f25 /= 12.0f; |
| 274 | f26 /= 12.0f; |
| 275 | f27 /= 12.0f; |
| 276 | f22 /= 12.0f; |
| 277 | f00 /= 12.0f; |
| 278 | f14 /= 12.0f; |
| 279 | f13 /= 12.0f; |
| 280 | f36 /= 12.0f; |
| 281 | f35 /= 12.0f; |
| 282 | f07 /= 12.0f; |
| 283 | f06 /= 12.0f; |
| 284 | f29 /= 12.0f; |
| 285 | f28 /= 12.0f; |
| 286 | } |
| 287 | float s = 0.0f; |
| 288 | s = ((float) Math.round(100.0f * s)) / 100.0f; |
| 289 | String res = s + r; |
| 290 | } |
| 291 | |
Nicolas Geoffray | 94cd28a | 2017-11-16 09:03:45 +0000 | [diff] [blame] | 292 | public static void main(String[] args) { |
Roland Levillain | 78b3d5d | 2017-01-04 10:27:50 +0000 | [diff] [blame] | 293 | Main main = new Main(); |
| 294 | main.test(); |
Roland Levillain | 78b3d5d | 2017-01-04 10:27:50 +0000 | [diff] [blame] | 295 | System.out.println("passed"); |
| 296 | } |
| 297 | } |