diff options
author | 2017-09-06 08:52:23 +0000 | |
---|---|---|
committer | 2017-09-06 08:52:23 +0000 | |
commit | 562086585f002babaaa542488a91bf7dd25e222c (patch) | |
tree | e38dcf69aaf0a04df249516c159c52b72999530b | |
parent | 28f53f57265134a9eac2dd3fe7782056357ce4fb (diff) | |
parent | b03f3ebfef7343718ef609bd677b23a2d7c997bb (diff) |
Merge "Port two methods in checker-dead-blocks to Smali"
-rw-r--r-- | test/480-checker-dead-blocks/smali/Smali.smali | 122 | ||||
-rw-r--r-- | test/480-checker-dead-blocks/src/Main.java | 69 |
2 files changed, 135 insertions, 56 deletions
diff --git a/test/480-checker-dead-blocks/smali/Smali.smali b/test/480-checker-dead-blocks/smali/Smali.smali new file mode 100644 index 0000000000..b93d5ac886 --- /dev/null +++ b/test/480-checker-dead-blocks/smali/Smali.smali @@ -0,0 +1,122 @@ +# Copyright (C) 2017 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +.class public LSmali; +.super Ljava/lang/Object; + +## CHECK-START: int Smali.testTrueBranch(int, int) dead_code_elimination$after_inlining (before) +## CHECK-DAG: <<ArgX:i\d+>> ParameterValue +## CHECK-DAG: <<ArgY:i\d+>> ParameterValue +## CHECK-DAG: If +## CHECK-DAG: <<Add:i\d+>> Add [<<ArgX>>,<<ArgY>>] +## CHECK-DAG: <<Sub:i\d+>> Sub [<<ArgX>>,<<ArgY>>] +## CHECK-DAG: <<Phi:i\d+>> Phi [<<Add>>,<<Sub>>] +## CHECK-DAG: Return [<<Phi>>] + +## CHECK-START: int Smali.testTrueBranch(int, int) dead_code_elimination$after_inlining (after) +## CHECK-DAG: <<ArgX:i\d+>> ParameterValue +## CHECK-DAG: <<ArgY:i\d+>> ParameterValue +## CHECK-DAG: <<Add:i\d+>> Add [<<ArgX>>,<<ArgY>>] +## CHECK-DAG: Return [<<Add>>] + +## CHECK-START: int Smali.testTrueBranch(int, int) dead_code_elimination$after_inlining (after) +## CHECK-NOT: If +## CHECK-NOT: Sub +## CHECK-NOT: Phi +.method public static testTrueBranch(II)I + # int z; + # if (inlineTrue()) { + # z = x + y; + # } else { + # z = x - y; + # // Prevent HSelect simplification by having a branch with multiple instructions. + # System.nanoTime(); + # } + #return z; + + .registers 4 + .param p0, "x" # I + .param p1, "y" # I + + invoke-static {}, LMain;->inlineTrue()Z + + move-result v1 + + if-eqz v1, :cond_9 + + add-int v0, p0, p1 + + :goto_8 + return v0 + + :cond_9 + sub-int v0, p0, p1 + + invoke-static {}, Ljava/lang/System;->nanoTime()J + + goto :goto_8 +.end method + +## CHECK-START: int Smali.testFalseBranch(int, int) dead_code_elimination$after_inlining (before) +## CHECK-DAG: <<ArgX:i\d+>> ParameterValue +## CHECK-DAG: <<ArgY:i\d+>> ParameterValue +## CHECK-DAG: If +## CHECK-DAG: <<Add:i\d+>> Add [<<ArgX>>,<<ArgY>>] +## CHECK-DAG: <<Sub:i\d+>> Sub [<<ArgX>>,<<ArgY>>] +## CHECK-DAG: <<Phi:i\d+>> Phi [<<Add>>,<<Sub>>] +## CHECK-DAG: Return [<<Phi>>] + +## CHECK-START: int Smali.testFalseBranch(int, int) dead_code_elimination$after_inlining (after) +## CHECK-DAG: <<ArgX:i\d+>> ParameterValue +## CHECK-DAG: <<ArgY:i\d+>> ParameterValue +## CHECK-DAG: <<Sub:i\d+>> Sub [<<ArgX>>,<<ArgY>>] +## CHECK-DAG: Return [<<Sub>>] + +## CHECK-START: int Smali.testFalseBranch(int, int) dead_code_elimination$after_inlining (after) +## CHECK-NOT: If +## CHECK-NOT: Add +## CHECK-NOT: Phi +.method public static testFalseBranch(II)I + # int z; + # if (inlineFalse()) { + # z = x + y; + # } else { + # z = x - y; + # // Prevent HSelect simplification by having a branch with multiple instructions. + # System.nanoTime(); + # } + # return z; + + .registers 4 + .param p0, "x" # I + .param p1, "y" # I + + invoke-static {}, LMain;->inlineFalse()Z + + move-result v1 + + if-eqz v1, :cond_9 + + add-int v0, p0, p1 + + :goto_8 + return v0 + + :cond_9 + sub-int v0, p0, p1 + + invoke-static {}, Ljava/lang/System;->nanoTime()J + + goto :goto_8 +.end method diff --git a/test/480-checker-dead-blocks/src/Main.java b/test/480-checker-dead-blocks/src/Main.java index 0ca822f54d..485efd9a2f 100644 --- a/test/480-checker-dead-blocks/src/Main.java +++ b/test/480-checker-dead-blocks/src/Main.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import java.lang.reflect.Method; public class Main { @@ -30,68 +31,24 @@ public class Main { return false; } - /// CHECK-START: int Main.testTrueBranch(int, int) dead_code_elimination$after_inlining (before) - /// CHECK-DAG: <<ArgX:i\d+>> ParameterValue - /// CHECK-DAG: <<ArgY:i\d+>> ParameterValue - /// CHECK-DAG: If - /// CHECK-DAG: <<Add:i\d+>> Add [<<ArgX>>,<<ArgY>>] - /// CHECK-DAG: <<Sub:i\d+>> Sub [<<ArgX>>,<<ArgY>>] - /// CHECK-DAG: <<Phi:i\d+>> Phi [<<Add>>,<<Sub>>] - /// CHECK-DAG: Return [<<Phi>>] - - /// CHECK-START: int Main.testTrueBranch(int, int) dead_code_elimination$after_inlining (after) - /// CHECK-DAG: <<ArgX:i\d+>> ParameterValue - /// CHECK-DAG: <<ArgY:i\d+>> ParameterValue - /// CHECK-DAG: <<Add:i\d+>> Add [<<ArgX>>,<<ArgY>>] - /// CHECK-DAG: Return [<<Add>>] - - /// CHECK-START: int Main.testTrueBranch(int, int) dead_code_elimination$after_inlining (after) - /// CHECK-NOT: If - /// CHECK-NOT: Sub - /// CHECK-NOT: Phi - public static int testTrueBranch(int x, int y) { - int z; - if (inlineTrue()) { - z = x + y; - } else { - z = x - y; - // Prevent HSelect simplification by having a branch with multiple instructions. - System.nanoTime(); + try { + Class<?> c = Class.forName("Smali"); + Method m = c.getMethod("testTrueBranch", int.class, int.class); + return (Integer) m.invoke(null, x, y); + } catch (Throwable t) { + throw new RuntimeException(t); } - return z; } - /// CHECK-START: int Main.testFalseBranch(int, int) dead_code_elimination$after_inlining (before) - /// CHECK-DAG: <<ArgX:i\d+>> ParameterValue - /// CHECK-DAG: <<ArgY:i\d+>> ParameterValue - /// CHECK-DAG: If - /// CHECK-DAG: <<Add:i\d+>> Add [<<ArgX>>,<<ArgY>>] - /// CHECK-DAG: <<Sub:i\d+>> Sub [<<ArgX>>,<<ArgY>>] - /// CHECK-DAG: <<Phi:i\d+>> Phi [<<Add>>,<<Sub>>] - /// CHECK-DAG: Return [<<Phi>>] - - /// CHECK-START: int Main.testFalseBranch(int, int) dead_code_elimination$after_inlining (after) - /// CHECK-DAG: <<ArgX:i\d+>> ParameterValue - /// CHECK-DAG: <<ArgY:i\d+>> ParameterValue - /// CHECK-DAG: <<Sub:i\d+>> Sub [<<ArgX>>,<<ArgY>>] - /// CHECK-DAG: Return [<<Sub>>] - - /// CHECK-START: int Main.testFalseBranch(int, int) dead_code_elimination$after_inlining (after) - /// CHECK-NOT: If - /// CHECK-NOT: Add - /// CHECK-NOT: Phi - public static int testFalseBranch(int x, int y) { - int z; - if (inlineFalse()) { - z = x + y; - } else { - z = x - y; - // Prevent HSelect simplification by having a branch with multiple instructions. - System.nanoTime(); + try { + Class<?> c = Class.forName("Smali"); + Method m = c.getMethod("testFalseBranch", int.class, int.class); + return (Integer) m.invoke(null, x, y); + } catch (Throwable t) { + throw new RuntimeException(t); } - return z; } /// CHECK-START: int Main.testRemoveLoop(int) dead_code_elimination$after_inlining (before) |