1 # Copyright (C) 2015 The Android Open Source Project 2 # 3 # Licensed under the Apache License, Version 2.0 (the "License"); 4 # you may not use this file except in compliance with the License. 5 # You may obtain a copy of the License at 6 # 7 # http://www.apache.org/licenses/LICENSE-2.0 8 # 9 # Unless required by applicable law or agreed to in writing, software 10 # distributed under the License is distributed on an "AS IS" BASIS, 11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 # See the License for the specific language governing permissions and 13 # limitations under the License. 14 15 .class public LTestCase; 16 .super Ljava/lang/Object; 17 18 # The following test case would crash liveness analysis because the back edge of 19 # the outer loop would have a smaller liveness position than the two back edges 20 # of the inner loop. This was caused by a bug which did not split the critical 21 # edge between TryBoundary and outer loop header (b/25493695). 22 23 .method public static testCase(II)I 24 .registers 10 25 26 const v0, 0x0 # v0 = result 27 const v1, 0x1 # v1 = const 1 28 29 move v2, p0 # v2 = outer loop counter 30 :outer_loop 31 if-eqz v2, :return 32 sub-int/2addr v2, v1 33 34 :try_start 35 36 move v3, p1 # v3 = inner loop counter 37 :inner_loop 38 invoke-static {}, Ljava/lang/System;->nanoTime()J # throwing instruction 39 if-eqz v3, :outer_loop # back edge of outer loop 40 sub-int/2addr v3, v1 41 42 invoke-static {}, Ljava/lang/System;->nanoTime()J # throwing instruction 43 add-int/2addr v0, v1 44 goto :inner_loop # back edge of inner loop 45 46 :try_end 47 .catchall {:try_start .. :try_end} :catch 48 49 :catch 50 const v4, 0x2 51 add-int/2addr v0, v4 52 goto :inner_loop # back edge of inner loop 53 54 :return 55 return v0 56 57 .end method 58