diff options
author | 2019-06-26 14:37:17 +0100 | |
---|---|---|
committer | 2019-06-27 14:37:54 +0000 | |
commit | ee1f1264314303829f6dca288781ed114c65dd93 (patch) | |
tree | ac042304d0cb4b978d1532cad704e8604236a897 | |
parent | da5e041d8cbd714e791974dbdd876c23141801cb (diff) |
Fix search for implicit null check.
There are additional instructions that can be emitted at use
site for x86/x86-64, such as ArrayLength, and the implicit
null check may therefore be emitted later than at the next
instruction. Search for the implicit null check until we
reach an instruction that's not emitted at use site.
This also reverts the blacklisting of the test, i.e.
commit 5be5260cfec2fc0a8c21ef1a08e7144523a8bfcd.
Test: testrunner.py --host \
--jit-on-first-use --debuggable -t 122-npe
Test: testrunner.py --host \
--optimizing --jit --jit-on-first-use \
--debuggable --ndebuggable
Bug: 136021898
Change-Id: I768f55d8c8975dbd0376802c10ca8508df3fe3b0
-rw-r--r-- | compiler/optimizing/nodes.h | 13 | ||||
-rw-r--r-- | test/565-checker-condition-liveness/src/Main.java | 28 | ||||
-rw-r--r-- | test/knownfailures.json | 6 |
3 files changed, 21 insertions, 26 deletions
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index 8ac33a4309..3736413927 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -2140,12 +2140,13 @@ class HInstruction : public ArenaObject<kArenaAllocInstruction> { // If this instruction will do an implicit null check, return the `HNullCheck` associated // with it. Otherwise return null. HNullCheck* GetImplicitNullCheck() const { - // Find the first previous instruction which is not a move. - HInstruction* first_prev_not_move = GetPreviousDisregardingMoves(); - if (first_prev_not_move != nullptr && - first_prev_not_move->IsNullCheck() && - first_prev_not_move->IsEmittedAtUseSite()) { - return first_prev_not_move->AsNullCheck(); + // Go over previous non-move instructions that are emitted at use site. + HInstruction* prev_not_move = GetPreviousDisregardingMoves(); + while (prev_not_move != nullptr && prev_not_move->IsEmittedAtUseSite()) { + if (prev_not_move->IsNullCheck()) { + return prev_not_move->AsNullCheck(); + } + prev_not_move = prev_not_move->GetPreviousDisregardingMoves(); } return nullptr; } diff --git a/test/565-checker-condition-liveness/src/Main.java b/test/565-checker-condition-liveness/src/Main.java index 25ec3f53b1..17a8613fef 100644 --- a/test/565-checker-condition-liveness/src/Main.java +++ b/test/565-checker-condition-liveness/src/Main.java @@ -55,10 +55,10 @@ public class Main { // X86 and X86_64 generate at use site the ArrayLength, meaning only the BoundsCheck will have environment uses. /// CHECK-START-{X86,X86_64}: void Main.testThrowIntoCatchBlock(int, java.lang.Object, int[]) liveness (after) - /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[25] - /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[11,25] - /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[11,25] - /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 env_uses:[25] + /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[25,25] + /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[11,25,25] + /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[11,25,25] + /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 env_uses:[25,25] /// CHECK-DAG: SuspendCheck env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:10 /// CHECK-DAG: NullCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:20 /// CHECK-DAG: ArrayLength liveness:22 @@ -66,10 +66,10 @@ public class Main { /// CHECK-DAG: TryBoundary /// CHECK-START-{X86,X86_64}-DEBUGGABLE: void Main.testThrowIntoCatchBlock(int, java.lang.Object, int[]) liveness (after) - /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[11,25] - /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[11,25] - /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[11,25] - /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 env_uses:[25] + /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[11,25,25] + /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[11,25,25] + /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[11,25,25] + /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 env_uses:[25,25] /// CHECK-DAG: SuspendCheck env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:10 /// CHECK-DAG: NullCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:20 /// CHECK-DAG: ArrayLength liveness:22 @@ -108,8 +108,8 @@ public class Main { /// CHECK-START-{X86,X86_64}: void Main.testBoundsCheck(int, java.lang.Object, int[]) liveness (after) /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[] - /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[11,21] - /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[11,21] + /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[11,21,21] + /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[11,21,21] /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 env_uses:[] /// CHECK-DAG: SuspendCheck env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:10 /// CHECK-DAG: NullCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:16 @@ -117,10 +117,10 @@ public class Main { /// CHECK-DAG: BoundsCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:20 /// CHECK-START-{X86,X86_64}-DEBUGGABLE: void Main.testBoundsCheck(int, java.lang.Object, int[]) liveness (after) - /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[11,21] - /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[11,21] - /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[11,21] - /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 env_uses:[21] + /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[11,21,21] + /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[11,21,21] + /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[11,21,21] + /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 env_uses:[21,21] /// CHECK-DAG: SuspendCheck env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:10 /// CHECK-DAG: NullCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:16 /// CHECK-DAG: ArrayLength liveness:18 diff --git a/test/knownfailures.json b/test/knownfailures.json index 2c67b8ccac..ad0cbe875d 100644 --- a/test/knownfailures.json +++ b/test/knownfailures.json @@ -1220,12 +1220,6 @@ "Requires zip, which isn't available on device"] }, { - "tests": ["122-npe"], - "variant": "jit-on-first-use & debuggable", - "description": ["Fails due to `Unexpected vreg location Kind<-1>` for unknown reasons."], - "bug": "http://b/136021898" - }, - { "tests": ["004-ReferenceMap", "449-checker-bce", "466-get-live-vreg", |