diff options
Diffstat (limited to 'compiler/optimizing')
-rw-r--r-- | compiler/optimizing/instruction_simplifier.cc | 15 | ||||
-rw-r--r-- | compiler/optimizing/intrinsics_arm.cc | 3 | ||||
-rw-r--r-- | compiler/optimizing/intrinsics_arm64.cc | 3 | ||||
-rw-r--r-- | compiler/optimizing/intrinsics_arm_vixl.cc | 3 | ||||
-rw-r--r-- | compiler/optimizing/intrinsics_mips.cc | 3 | ||||
-rw-r--r-- | compiler/optimizing/intrinsics_mips64.cc | 3 | ||||
-rw-r--r-- | compiler/optimizing/intrinsics_x86.cc | 3 | ||||
-rw-r--r-- | compiler/optimizing/intrinsics_x86_64.cc | 3 | ||||
-rw-r--r-- | compiler/optimizing/nodes.h | 6 |
9 files changed, 39 insertions, 3 deletions
diff --git a/compiler/optimizing/instruction_simplifier.cc b/compiler/optimizing/instruction_simplifier.cc index e06fdee370..85b461dcf6 100644 --- a/compiler/optimizing/instruction_simplifier.cc +++ b/compiler/optimizing/instruction_simplifier.cc @@ -106,6 +106,7 @@ class InstructionSimplifierVisitor : public HGraphDelegateVisitor { void SimplifyFP2Int(HInvoke* invoke); void SimplifyStringCharAt(HInvoke* invoke); void SimplifyStringIsEmptyOrLength(HInvoke* invoke); + void SimplifyNPEOnArgN(HInvoke* invoke, size_t); void SimplifyMemBarrier(HInvoke* invoke, MemBarrierKind barrier_kind); OptimizingCompilerStats* stats_; @@ -1858,6 +1859,16 @@ void InstructionSimplifierVisitor::SimplifyStringIsEmptyOrLength(HInvoke* invoke invoke->GetBlock()->ReplaceAndRemoveInstructionWith(invoke, replacement); } +// This method should only be used on intrinsics whose sole way of throwing an +// exception is raising a NPE when the nth argument is null. If that argument +// is provably non-null, we can clear the flag. +void InstructionSimplifierVisitor::SimplifyNPEOnArgN(HInvoke* invoke, size_t n) { + HInstruction* arg = invoke->InputAt(n); + if (!arg->CanBeNull()) { + invoke->SetCanThrow(false); + } +} + void InstructionSimplifierVisitor::SimplifyMemBarrier(HInvoke* invoke, MemBarrierKind barrier_kind) { uint32_t dex_pc = invoke->GetDexPc(); HMemoryBarrier* mem_barrier = new (GetGraph()->GetArena()) HMemoryBarrier(barrier_kind, dex_pc); @@ -1911,6 +1922,10 @@ void InstructionSimplifierVisitor::VisitInvoke(HInvoke* instruction) { case Intrinsics::kStringLength: SimplifyStringIsEmptyOrLength(instruction); break; + case Intrinsics::kStringStringIndexOf: + case Intrinsics::kStringStringIndexOfAfter: + SimplifyNPEOnArgN(instruction, 1); // 0th has own NullCheck + break; case Intrinsics::kUnsafeLoadFence: SimplifyMemBarrier(instruction, MemBarrierKind::kLoadAny); break; diff --git a/compiler/optimizing/intrinsics_arm.cc b/compiler/optimizing/intrinsics_arm.cc index 93a2340a32..0c39223388 100644 --- a/compiler/optimizing/intrinsics_arm.cc +++ b/compiler/optimizing/intrinsics_arm.cc @@ -2600,6 +2600,9 @@ UNIMPLEMENTED_INTRINSIC(ARM, LongHighestOneBit) UNIMPLEMENTED_INTRINSIC(ARM, IntegerLowestOneBit) UNIMPLEMENTED_INTRINSIC(ARM, LongLowestOneBit) +UNIMPLEMENTED_INTRINSIC(ARM, StringStringIndexOf); +UNIMPLEMENTED_INTRINSIC(ARM, StringStringIndexOfAfter); + // 1.8. UNIMPLEMENTED_INTRINSIC(ARM, UnsafeGetAndAddInt) UNIMPLEMENTED_INTRINSIC(ARM, UnsafeGetAndAddLong) diff --git a/compiler/optimizing/intrinsics_arm64.cc b/compiler/optimizing/intrinsics_arm64.cc index 47e6d9699d..b9424a3f20 100644 --- a/compiler/optimizing/intrinsics_arm64.cc +++ b/compiler/optimizing/intrinsics_arm64.cc @@ -2788,6 +2788,9 @@ UNIMPLEMENTED_INTRINSIC(ARM64, LongHighestOneBit) UNIMPLEMENTED_INTRINSIC(ARM64, IntegerLowestOneBit) UNIMPLEMENTED_INTRINSIC(ARM64, LongLowestOneBit) +UNIMPLEMENTED_INTRINSIC(ARM64, StringStringIndexOf); +UNIMPLEMENTED_INTRINSIC(ARM64, StringStringIndexOfAfter); + // 1.8. UNIMPLEMENTED_INTRINSIC(ARM64, UnsafeGetAndAddInt) UNIMPLEMENTED_INTRINSIC(ARM64, UnsafeGetAndAddLong) diff --git a/compiler/optimizing/intrinsics_arm_vixl.cc b/compiler/optimizing/intrinsics_arm_vixl.cc index 6ff0ca4eab..e5240a2871 100644 --- a/compiler/optimizing/intrinsics_arm_vixl.cc +++ b/compiler/optimizing/intrinsics_arm_vixl.cc @@ -2679,6 +2679,9 @@ UNIMPLEMENTED_INTRINSIC(ARMVIXL, LongHighestOneBit) UNIMPLEMENTED_INTRINSIC(ARMVIXL, IntegerLowestOneBit) UNIMPLEMENTED_INTRINSIC(ARMVIXL, LongLowestOneBit) +UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringStringIndexOf); +UNIMPLEMENTED_INTRINSIC(ARMVIXL, StringStringIndexOfAfter); + // 1.8. UNIMPLEMENTED_INTRINSIC(ARMVIXL, UnsafeGetAndAddInt) UNIMPLEMENTED_INTRINSIC(ARMVIXL, UnsafeGetAndAddLong) diff --git a/compiler/optimizing/intrinsics_mips.cc b/compiler/optimizing/intrinsics_mips.cc index 5239f8f020..7c81588cda 100644 --- a/compiler/optimizing/intrinsics_mips.cc +++ b/compiler/optimizing/intrinsics_mips.cc @@ -2495,6 +2495,9 @@ UNIMPLEMENTED_INTRINSIC(MIPS, MathSinh) UNIMPLEMENTED_INTRINSIC(MIPS, MathTan) UNIMPLEMENTED_INTRINSIC(MIPS, MathTanh) +UNIMPLEMENTED_INTRINSIC(MIPS, StringStringIndexOf); +UNIMPLEMENTED_INTRINSIC(MIPS, StringStringIndexOfAfter); + // 1.8. UNIMPLEMENTED_INTRINSIC(MIPS, UnsafeGetAndAddInt) UNIMPLEMENTED_INTRINSIC(MIPS, UnsafeGetAndAddLong) diff --git a/compiler/optimizing/intrinsics_mips64.cc b/compiler/optimizing/intrinsics_mips64.cc index 1d153e2e18..2d4f417b14 100644 --- a/compiler/optimizing/intrinsics_mips64.cc +++ b/compiler/optimizing/intrinsics_mips64.cc @@ -1947,6 +1947,9 @@ UNIMPLEMENTED_INTRINSIC(MIPS64, MathSinh) UNIMPLEMENTED_INTRINSIC(MIPS64, MathTan) UNIMPLEMENTED_INTRINSIC(MIPS64, MathTanh) +UNIMPLEMENTED_INTRINSIC(MIPS64, StringStringIndexOf); +UNIMPLEMENTED_INTRINSIC(MIPS64, StringStringIndexOfAfter); + // 1.8. UNIMPLEMENTED_INTRINSIC(MIPS64, UnsafeGetAndAddInt) UNIMPLEMENTED_INTRINSIC(MIPS64, UnsafeGetAndAddLong) diff --git a/compiler/optimizing/intrinsics_x86.cc b/compiler/optimizing/intrinsics_x86.cc index 43682c5633..bac98d52ac 100644 --- a/compiler/optimizing/intrinsics_x86.cc +++ b/compiler/optimizing/intrinsics_x86.cc @@ -3323,6 +3323,9 @@ UNIMPLEMENTED_INTRINSIC(X86, LongHighestOneBit) UNIMPLEMENTED_INTRINSIC(X86, IntegerLowestOneBit) UNIMPLEMENTED_INTRINSIC(X86, LongLowestOneBit) +UNIMPLEMENTED_INTRINSIC(X86, StringStringIndexOf); +UNIMPLEMENTED_INTRINSIC(X86, StringStringIndexOfAfter); + // 1.8. UNIMPLEMENTED_INTRINSIC(X86, UnsafeGetAndAddInt) UNIMPLEMENTED_INTRINSIC(X86, UnsafeGetAndAddLong) diff --git a/compiler/optimizing/intrinsics_x86_64.cc b/compiler/optimizing/intrinsics_x86_64.cc index de2606c327..01577f751c 100644 --- a/compiler/optimizing/intrinsics_x86_64.cc +++ b/compiler/optimizing/intrinsics_x86_64.cc @@ -2992,6 +2992,9 @@ void IntrinsicCodeGeneratorX86_64::VisitReferenceGetReferent(HInvoke* invoke) { UNIMPLEMENTED_INTRINSIC(X86_64, FloatIsInfinite) UNIMPLEMENTED_INTRINSIC(X86_64, DoubleIsInfinite) +UNIMPLEMENTED_INTRINSIC(X86_64, StringStringIndexOf); +UNIMPLEMENTED_INTRINSIC(X86_64, StringStringIndexOfAfter); + // 1.8. UNIMPLEMENTED_INTRINSIC(X86_64, UnsafeGetAndAddInt) UNIMPLEMENTED_INTRINSIC(X86_64, UnsafeGetAndAddLong) diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index ce2edde1c1..7890183229 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -1956,7 +1956,7 @@ class HInstruction : public ArenaObject<kArenaAllocInstruction> { bool IsRemovable() const { return - !HasSideEffects() && + !DoesAnyWrite() && !CanThrow() && !IsSuspendCheck() && !IsControlFlow() && @@ -3782,6 +3782,8 @@ class HInvoke : public HInstruction { return GetEnvironment()->IsFromInlinedInvoke(); } + void SetCanThrow(bool can_throw) { SetPackedFlag<kFlagCanThrow>(can_throw); } + bool CanThrow() const OVERRIDE { return GetPackedFlag<kFlagCanThrow>(); } bool CanBeMoved() const OVERRIDE { return IsIntrinsic(); } @@ -3840,8 +3842,6 @@ class HInvoke : public HInstruction { SetPackedFlag<kFlagCanThrow>(true); } - void SetCanThrow(bool can_throw) { SetPackedFlag<kFlagCanThrow>(can_throw); } - uint32_t number_of_arguments_; ArtMethod* const resolved_method_; ArenaVector<HUserRecord<HInstruction*>> inputs_; |