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 LTypePropagation; 16.super Ljava/lang/Object; 17 18## CHECK-START-DEBUGGABLE: void TypePropagation.mergeDeadPhi(boolean, boolean, int, float, float) builder (after) 19## CHECK-NOT: Phi 20.method public static mergeDeadPhi(ZZIFF)V 21 .registers 8 22 23 if-eqz p0, :after1 24 move p2, p3 25 :after1 26 # p2 = merge(int,float) = conflict 27 28 if-eqz p1, :after2 29 move p2, p4 30 :after2 31 # p2 = merge(conflict,float) = conflict 32 33 invoke-static {}, Ljava/lang/System;->nanoTime()J # create an env use 34 return-void 35.end method 36 37## CHECK-START-DEBUGGABLE: void TypePropagation.mergeSameType(boolean, int, int) builder (after) 38## CHECK: {{i\d+}} Phi 39## CHECK-NOT: Phi 40.method public static mergeSameType(ZII)V 41 .registers 8 42 if-eqz p0, :after 43 move p1, p2 44 :after 45 # p1 = merge(int,int) = int 46 invoke-static {}, Ljava/lang/System;->nanoTime()J # create an env use 47 return-void 48.end method 49 50## CHECK-START-DEBUGGABLE: void TypePropagation.mergeVoidInput(boolean, boolean, int, int) builder (after) 51## CHECK: {{i\d+}} Phi 52## CHECK: {{i\d+}} Phi 53## CHECK-NOT: Phi 54.method public static mergeVoidInput(ZZII)V 55 .registers 8 56 :loop 57 # p2 = void (loop phi) => p2 = merge(int,int) = int 58 if-eqz p0, :after 59 move p2, p3 60 :after 61 # p2 = merge(void,int) = int 62 if-eqz p1, :loop 63 invoke-static {}, Ljava/lang/System;->nanoTime()J # create an env use 64 return-void 65.end method 66 67## CHECK-START-DEBUGGABLE: void TypePropagation.mergeDifferentSize(boolean, int, long) builder (after) 68## CHECK-NOT: Phi 69.method public static mergeDifferentSize(ZIJ)V 70 .registers 8 71 if-eqz p0, :after 72 move-wide p1, p2 73 :after 74 # p1 = merge(int,long) = conflict 75 invoke-static {}, Ljava/lang/System;->nanoTime()J # create an env use 76 return-void 77.end method 78 79## CHECK-START-DEBUGGABLE: void TypePropagation.mergeRefFloat(boolean, float, java.lang.Object) builder (after) 80## CHECK-NOT: Phi 81.method public static mergeRefFloat(ZFLjava/lang/Object;)V 82 .registers 8 83 if-eqz p0, :after 84 move-object p1, p2 85 :after 86 # p1 = merge(float,reference) = conflict 87 invoke-static {}, Ljava/lang/System;->nanoTime()J # create an env use 88 return-void 89.end method 90 91## CHECK-START-DEBUGGABLE: void TypePropagation.mergeIntFloat_Success(boolean, float) builder (after) 92## CHECK: {{f\d+}} Phi 93## CHECK-NOT: Phi 94.method public static mergeIntFloat_Success(ZF)V 95 .registers 8 96 if-eqz p0, :after 97 const/4 p1, 0x0 98 :after 99 # p1 = merge(float,0x0) = float 100 invoke-static {}, Ljava/lang/System;->nanoTime()J # create an env use 101 return-void 102.end method 103 104## CHECK-START-DEBUGGABLE: void TypePropagation.mergeIntFloat_Fail(boolean, int, float) builder (after) 105## CHECK-NOT: Phi 106.method public static mergeIntFloat_Fail(ZIF)V 107 .registers 8 108 if-eqz p0, :after 109 move p1, p2 110 :after 111 # p1 = merge(int,float) = conflict 112 invoke-static {}, Ljava/lang/System;->nanoTime()J # create an env use 113 return-void 114.end method 115 116## CHECK-START-DEBUGGABLE: void TypePropagation.updateAllUsersOnConflict(boolean, boolean, int, float, int) builder (after) 117## CHECK-NOT: Phi 118.method public static updateAllUsersOnConflict(ZZIFI)V 119 .registers 8 120 121 :loop1 122 # loop phis for all args 123 # p2 = merge(int,float) = float? => conflict 124 move p2, p3 125 if-eqz p0, :loop1 126 127 :loop2 128 # loop phis for all args 129 # requests float equivalent of p4 phi in loop1 => conflict 130 # propagates conflict to loop2's phis 131 move p2, p4 132 if-eqz p1, :loop2 133 134 invoke-static {}, Ljava/lang/System;->nanoTime()J # create an env use 135 return-void 136.end method 137