summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2019-06-26 14:37:17 +0100
committer Vladimir Marko <vmarko@google.com> 2019-06-27 14:37:54 +0000
commitee1f1264314303829f6dca288781ed114c65dd93 (patch)
treeac042304d0cb4b978d1532cad704e8604236a897
parentda5e041d8cbd714e791974dbdd876c23141801cb (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.h13
-rw-r--r--test/565-checker-condition-liveness/src/Main.java28
-rw-r--r--test/knownfailures.json6
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",