Optimizing: Add `HInstruction::As##type()`.

After the old implementation was renamed in
    https://android-review.googlesource.com/2526708 ,
we introduce a new function with the old name but new
behavior, just `DCHECK()`-ing the instruction kind before
casting down the pointer. We change appropriate calls from
`As##type##OrNull()` to `As##type()` to avoid unncessary
run-time checks and reduce the size of libart-compiler.so.

Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Test: run-gtests.sh
Test: testrunner.py --target --optimizing
Bug: 181943478
Change-Id: I025681612a77ca2157fed4886ca47f2053975d4e
diff --git a/compiler/optimizing/bounds_check_elimination.cc b/compiler/optimizing/bounds_check_elimination.cc
index 6b3d06e..c0d4c37 100644
--- a/compiler/optimizing/bounds_check_elimination.cc
+++ b/compiler/optimizing/bounds_check_elimination.cc
@@ -37,8 +37,7 @@
   ValueBound(HInstruction* instruction, int32_t constant) {
     if (instruction != nullptr && instruction->IsIntConstant()) {
       // Normalize ValueBound with constant instruction.
-      // TODO: Remove "OrNull".
-      int32_t instr_const = instruction->AsIntConstantOrNull()->GetValue();
+      int32_t instr_const = instruction->AsIntConstant()->GetValue();
       if (!WouldAddOverflowOrUnderflow(instr_const, constant)) {
         instruction_ = nullptr;
         constant_ = instr_const + constant;
@@ -72,13 +71,11 @@
     HInstruction* left_so_far = nullptr;
     int32_t right_so_far = 0;
     while (instruction->IsAdd() || instruction->IsSub()) {
-      // TODO: Remove "OrNull".
-      HBinaryOperation* bin_op = instruction->AsBinaryOperationOrNull();
+      HBinaryOperation* bin_op = instruction->AsBinaryOperation();
       HInstruction* left = bin_op->GetLeft();
       HInstruction* right = bin_op->GetRight();
       if (right->IsIntConstant()) {
-        // TODO: Remove "OrNull".
-        int32_t v = right->AsIntConstantOrNull()->GetValue();
+        int32_t v = right->AsIntConstant()->GetValue();
         int32_t c = instruction->IsAdd() ? v : -v;
         if (!WouldAddOverflowOrUnderflow(right_so_far, c)) {
           instruction = left;
@@ -98,8 +95,7 @@
   // Expresses any instruction as a value bound.
   static ValueBound AsValueBound(HInstruction* instruction) {
     if (instruction->IsIntConstant()) {
-      // TODO: Remove "OrNull".
-      return ValueBound(nullptr, instruction->AsIntConstantOrNull()->GetValue());
+      return ValueBound(nullptr, instruction->AsIntConstant()->GetValue());
     }
     HInstruction *left;
     int32_t right;
@@ -115,8 +111,7 @@
     DCHECK(instruction != nullptr);
     if (instruction->IsIntConstant()) {
       *found = true;
-      // TODO: Remove "OrNull".
-      return ValueBound(nullptr, instruction->AsIntConstantOrNull()->GetValue());
+      return ValueBound(nullptr, instruction->AsIntConstant()->GetValue());
     }
 
     if (instruction->IsArrayLength()) {
@@ -446,8 +441,7 @@
       // Be conservative first, assume last number in the sequence hits upper.
       int32_t last_num_in_sequence = upper;
       if (initial_->IsIntConstant()) {
-        // TODO: Remove "OrNull".
-        int32_t initial_constant = initial_->AsIntConstantOrNull()->GetValue();
+        int32_t initial_constant = initial_->AsIntConstant()->GetValue();
         if (upper <= initial_constant) {
           last_num_in_sequence = upper;
         } else {
@@ -883,14 +877,12 @@
       }
     } else {
       // Constant index.
-      // TODO: Remove "OrNull".
-      int32_t constant = index->AsIntConstantOrNull()->GetValue();
+      int32_t constant = index->AsIntConstant()->GetValue();
       if (constant < 0) {
         // Will always throw exception.
         return;
       } else if (array_length->IsIntConstant()) {
-        // TODO: Remove "OrNull".
-        if (constant < array_length->AsIntConstantOrNull()->GetValue()) {
+        if (constant < array_length->AsIntConstant()->GetValue()) {
           ReplaceInstruction(bounds_check, index);
         }
         return;
@@ -1017,8 +1009,7 @@
 
   void VisitIf(HIf* instruction) override {
     if (instruction->InputAt(0)->IsCondition()) {
-      // TODO: Remove "OrNull".
-      HCondition* cond = instruction->InputAt(0)->AsConditionOrNull();
+      HCondition* cond = instruction->InputAt(0)->AsCondition();
       HandleIf(instruction, cond->GetLeft(), cond->GetRight(), cond->GetCondition());
     }
   }
@@ -1060,24 +1051,20 @@
       if (!mul->GetLeft()->IsDiv() || !mul->GetRight()->IsConstant()) {
         return false;
       }
-      // TODO: Remove "OrNull".
-      div = mul->GetLeft()->AsDivOrNull();
-      // TODO: Remove "OrNull".
-      const_divisor = Int64FromConstant(mul->GetRight()->AsConstantOrNull());
+      div = mul->GetLeft()->AsDiv();
+      const_divisor = Int64FromConstant(mul->GetRight()->AsConstant());
     } else if (HAdd* add = instruction->GetRight()->AsAddOrNull()) {
       HShl* shl = add->GetRight()->AsShlOrNull();
       if (!is_needed_shl(shl)) {
         return false;
       }
 
-      // TODO: Remove "OrNull".
-      div = shl->GetLeft()->AsDivOrNull();
+      div = shl->GetLeft()->AsDiv();
       if (add->GetLeft() != div) {
         return false;
       }
 
-      // TODO: Remove "OrNull".
-      int32_t n = shl->GetRight()->AsIntConstantOrNull()->GetValue();
+      int32_t n = shl->GetRight()->AsIntConstant()->GetValue();
       if (n == BitSizeOf<int32_t>() - 1) {
         // 2^n + 1 will be negative.
         return false;
@@ -1089,14 +1076,12 @@
         return false;
       }
 
-      // TODO: Remove "OrNull".
-      div = shl->GetLeft()->AsDivOrNull();
+      div = shl->GetLeft()->AsDiv();
       if (sub->GetRight() != div) {
         return false;
       }
 
-      // TODO: Remove "OrNull".
-      int32_t n = shl->GetRight()->AsIntConstantOrNull()->GetValue();
+      int32_t n = shl->GetRight()->AsIntConstant()->GetValue();
       const_divisor = (1LL << n) - 1;
     }
 
@@ -1133,8 +1118,7 @@
       if (left_range == nullptr) {
         return;
       }
-      // TODO: Remove "OrNull".
-      ValueRange* range = left_range->Add(right->AsIntConstantOrNull()->GetValue());
+      ValueRange* range = left_range->Add(right->AsIntConstant()->GetValue());
       if (range != nullptr) {
         AssignRange(add->GetBlock(), add, range);
       }
@@ -1153,8 +1137,7 @@
       if (left_range == nullptr) {
         return;
       }
-      // TODO: Remove "OrNull".
-      ValueRange* range = left_range->Add(-right->AsIntConstantOrNull()->GetValue());
+      ValueRange* range = left_range->Add(-right->AsIntConstant()->GetValue());
       if (range != nullptr) {
         AssignRange(sub->GetBlock(), sub, range);
         return;
@@ -1174,8 +1157,7 @@
     // The value of left input of the sub equals (left + right_const).
 
     if (left->IsArrayLength()) {
-      // TODO: Remove "OrNull".
-      HInstruction* array_length = left->AsArrayLengthOrNull();
+      HInstruction* array_length = left->AsArrayLength();
       ValueRange* right_range = LookupValueRange(right, sub->GetBlock());
       if (right_range != nullptr) {
         ValueBound lower = right_range->GetLower();
@@ -1211,8 +1193,7 @@
     HInstruction* right = instruction->GetRight();
     int32_t right_const;
     if (right->IsIntConstant()) {
-      // TODO: Remove "OrNull".
-      right_const = right->AsIntConstantOrNull()->GetValue();
+      right_const = right->AsIntConstant()->GetValue();
       // Detect division by two or more.
       if ((instruction->IsDiv() && right_const <= 1) ||
           (instruction->IsShr() && right_const < 1) ||
@@ -1264,8 +1245,7 @@
 
   void VisitAnd(HAnd* instruction) override {
     if (instruction->GetRight()->IsIntConstant()) {
-      // TODO: Remove "OrNull".
-      int32_t constant = instruction->GetRight()->AsIntConstantOrNull()->GetValue();
+      int32_t constant = instruction->GetRight()->AsIntConstant()->GetValue();
       if (constant > 0) {
         // constant serves as a mask so any number masked with it
         // gets a [0, constant] value range.
@@ -1285,8 +1265,7 @@
     // Handle 'i % CONST' format expression in array index, e.g:
     //   array[i % 20];
     if (right->IsIntConstant()) {
-      // TODO: Remove "OrNull".
-      int32_t right_const = std::abs(right->AsIntConstantOrNull()->GetValue());
+      int32_t right_const = std::abs(right->AsIntConstant()->GetValue());
       if (right_const == 0) {
         return;
       }
@@ -1318,8 +1297,7 @@
     if (right->IsDivZeroCheck()) {
       // if array_length can pass div-by-zero check,
       // array_length must be > 0.
-      // TODO: Remove "OrNull".
-      right = right->AsDivZeroCheckOrNull()->InputAt(0);
+      right = right->AsDivZeroCheck()->InputAt(0);
     }
 
     // Handle 'i % array.length' format expression in array index, e.g:
@@ -1456,8 +1434,7 @@
         HInstruction* user = use.GetUser();
         HBasicBlock* other_block = user->GetBlock();
         if (user->IsBoundsCheck() && block->Dominates(other_block)) {
-          // TODO: Remove "OrNull".
-          HBoundsCheck* other_bounds_check = user->AsBoundsCheckOrNull();
+          HBoundsCheck* other_bounds_check = user->AsBoundsCheck();
           HInstruction* other_index = other_bounds_check->InputAt(0);
           HInstruction* other_array_length = other_bounds_check->InputAt(1);
           ValueBound other_value = ValueBound::AsValueBound(other_index);
@@ -1575,8 +1552,7 @@
     for (const HUseListNode<HInstruction*>& use : array_length->GetUses()) {
       HInstruction* user = use.GetUser();
       if (user->IsBoundsCheck() && loop == user->GetBlock()->GetLoopInformation()) {
-        // TODO: Remove "OrNull".
-        HBoundsCheck* other_bounds_check = user->AsBoundsCheckOrNull();
+        HBoundsCheck* other_bounds_check = user->AsBoundsCheck();
         HInstruction* other_index = other_bounds_check->InputAt(0);
         HInstruction* other_array_length = other_bounds_check->InputAt(1);
         ValueBound other_value = ValueBound::AsValueBound(other_index);
@@ -1811,11 +1787,9 @@
       // ensure upper bound cannot cause an infinite loop.
       HInstruction* control = loop->GetHeader()->GetLastInstruction();
       if (control->IsIf()) {
-        // TODO: Remove "OrNull".
-        HInstruction* if_expr = control->AsIfOrNull()->InputAt(0);
+        HInstruction* if_expr = control->AsIf()->InputAt(0);
         if (if_expr->IsCondition()) {
-          // TODO: Remove "OrNull".
-          HCondition* condition = if_expr->AsConditionOrNull();
+          HCondition* condition = if_expr->AsCondition();
           if (index == condition->InputAt(0) ||
               index == condition->InputAt(1)) {
             finite_loop_.insert(loop_id);
diff --git a/compiler/optimizing/code_generator.cc b/compiler/optimizing/code_generator.cc
index 07f018b..f90f17f 100644
--- a/compiler/optimizing/code_generator.cc
+++ b/compiler/optimizing/code_generator.cc
@@ -514,8 +514,7 @@
   locations->SetOut(visitor->GetReturnLocation(invoke->GetType()));
 
   if (invoke->IsInvokeStaticOrDirect()) {
-    // TODO: Remove "OrNull".
-    HInvokeStaticOrDirect* call = invoke->AsInvokeStaticOrDirectOrNull();
+    HInvokeStaticOrDirect* call = invoke->AsInvokeStaticOrDirect();
     MethodLoadKind method_load_kind = call->GetMethodLoadKind();
     CodePtrLocation code_ptr_location = call->GetCodePtrLocation();
     if (code_ptr_location == CodePtrLocation::kCallCriticalNative) {
@@ -999,8 +998,7 @@
         }
       } else if (locations->Intrinsified() &&
                  instruction->IsInvokeStaticOrDirect() &&
-                 // TODO: Remove "OrNull".
-                 !instruction->AsInvokeStaticOrDirectOrNull()->HasCurrentMethodInput()) {
+                 !instruction->AsInvokeStaticOrDirect()->HasCurrentMethodInput()) {
         // A static method call that has been fully intrinsified, and cannot call on the slow
         // path or refer to the current method directly, no longer needs current method.
         return;
@@ -1234,8 +1232,7 @@
       return;
     }
     if (instruction->IsRem()) {
-      // TODO: Remove "OrNull".
-      DataType::Type type = instruction->AsRemOrNull()->GetResultType();
+      DataType::Type type = instruction->AsRem()->GetResultType();
       if ((type == DataType::Type::kFloat32) || (type == DataType::Type::kFloat64)) {
         return;
       }
@@ -1358,8 +1355,7 @@
       dex_pc_list_for_verification.push_back(block->GetDexPc());
     }
     DCHECK(block->GetFirstInstruction()->IsNop());
-    // TODO: Remove "OrNull".
-    DCHECK(block->GetFirstInstruction()->AsNopOrNull()->NeedsEnvironment());
+    DCHECK(block->GetFirstInstruction()->AsNop()->NeedsEnvironment());
     HEnvironment* const environment = block->GetFirstInstruction()->GetEnvironment();
     DCHECK(environment != nullptr);
     HEnvironment* outer_environment = environment;
@@ -1418,29 +1414,25 @@
       case Location::kConstant: {
         DCHECK_EQ(current, location.GetConstant());
         if (current->IsLongConstant()) {
-          // TODO: Remove "OrNull".
-          int64_t value = current->AsLongConstantOrNull()->GetValue();
+          int64_t value = current->AsLongConstant()->GetValue();
           stack_map_stream->AddDexRegisterEntry(Kind::kConstant, Low32Bits(value));
           stack_map_stream->AddDexRegisterEntry(Kind::kConstant, High32Bits(value));
           ++i;
           DCHECK_LT(i, environment_size);
         } else if (current->IsDoubleConstant()) {
-          // TODO: Remove "OrNull".
-          int64_t value = bit_cast<int64_t, double>(current->AsDoubleConstantOrNull()->GetValue());
+          int64_t value = bit_cast<int64_t, double>(current->AsDoubleConstant()->GetValue());
           stack_map_stream->AddDexRegisterEntry(Kind::kConstant, Low32Bits(value));
           stack_map_stream->AddDexRegisterEntry(Kind::kConstant, High32Bits(value));
           ++i;
           DCHECK_LT(i, environment_size);
         } else if (current->IsIntConstant()) {
-          // TODO: Remove "OrNull".
-          int32_t value = current->AsIntConstantOrNull()->GetValue();
+          int32_t value = current->AsIntConstant()->GetValue();
           stack_map_stream->AddDexRegisterEntry(Kind::kConstant, value);
         } else if (current->IsNullConstant()) {
           stack_map_stream->AddDexRegisterEntry(Kind::kConstant, 0);
         } else {
           DCHECK(current->IsFloatConstant()) << current->DebugName();
-          // TODO: Remove "OrNull".
-          int32_t value = bit_cast<int32_t, float>(current->AsFloatConstantOrNull()->GetValue());
+          int32_t value = bit_cast<int32_t, float>(current->AsFloatConstant()->GetValue());
           stack_map_stream->AddDexRegisterEntry(Kind::kConstant, value);
         }
         break;
@@ -1564,18 +1556,15 @@
   DCHECK_EQ(environment->GetHolder()->GetBlock()->GetFirstInstruction(), environment->GetHolder());
   HInstruction* current_phi = environment->GetHolder()->GetBlock()->GetFirstPhi();
   for (size_t vreg = 0; vreg < environment->Size(); ++vreg) {
-    // TODO: Remove "OrNull".
-    while (current_phi != nullptr && current_phi->AsPhiOrNull()->GetRegNumber() < vreg) {
+    while (current_phi != nullptr && current_phi->AsPhi()->GetRegNumber() < vreg) {
       HInstruction* next_phi = current_phi->GetNext();
       DCHECK(next_phi == nullptr ||
-             // TODO: Remove "OrNull".
-             current_phi->AsPhiOrNull()->GetRegNumber() <= next_phi->AsPhiOrNull()->GetRegNumber())
+             current_phi->AsPhi()->GetRegNumber() <= next_phi->AsPhi()->GetRegNumber())
           << "Phis need to be sorted by vreg number to keep this a linear-time loop.";
       current_phi = next_phi;
     }
 
-    // TODO: Remove "OrNull".
-    if (current_phi == nullptr || current_phi->AsPhiOrNull()->GetRegNumber() != vreg) {
+    if (current_phi == nullptr || current_phi->AsPhi()->GetRegNumber() != vreg) {
       stack_map_stream->AddDexRegisterEntry(DexRegisterLocation::Kind::kNone, 0);
     } else {
       Location location = current_phi->GetLocations()->Out();
diff --git a/compiler/optimizing/code_generator.h b/compiler/optimizing/code_generator.h
index 59ae213..9872efa 100644
--- a/compiler/optimizing/code_generator.h
+++ b/compiler/optimizing/code_generator.h
@@ -552,45 +552,37 @@
 
   static int8_t GetInt8ValueOf(HConstant* constant) {
     DCHECK(constant->IsIntConstant());
-    // TODO: Remove "OrNull".
-    return constant->AsIntConstantOrNull()->GetValue();
+    return constant->AsIntConstant()->GetValue();
   }
 
   static int16_t GetInt16ValueOf(HConstant* constant) {
     DCHECK(constant->IsIntConstant());
-    // TODO: Remove "OrNull".
-    return constant->AsIntConstantOrNull()->GetValue();
+    return constant->AsIntConstant()->GetValue();
   }
 
   static int32_t GetInt32ValueOf(HConstant* constant) {
     if (constant->IsIntConstant()) {
-      // TODO: Remove "OrNull".
-      return constant->AsIntConstantOrNull()->GetValue();
+      return constant->AsIntConstant()->GetValue();
     } else if (constant->IsNullConstant()) {
       return 0;
     } else {
       DCHECK(constant->IsFloatConstant());
-      // TODO: Remove "OrNull".
-      return bit_cast<int32_t, float>(constant->AsFloatConstantOrNull()->GetValue());
+      return bit_cast<int32_t, float>(constant->AsFloatConstant()->GetValue());
     }
   }
 
   static int64_t GetInt64ValueOf(HConstant* constant) {
     if (constant->IsIntConstant()) {
-      // TODO: Remove "OrNull".
-      return constant->AsIntConstantOrNull()->GetValue();
+      return constant->AsIntConstant()->GetValue();
     } else if (constant->IsNullConstant()) {
       return 0;
     } else if (constant->IsFloatConstant()) {
-      // TODO: Remove "OrNull".
-      return bit_cast<int32_t, float>(constant->AsFloatConstantOrNull()->GetValue());
+      return bit_cast<int32_t, float>(constant->AsFloatConstant()->GetValue());
     } else if (constant->IsLongConstant()) {
-      // TODO: Remove "OrNull".
-      return constant->AsLongConstantOrNull()->GetValue();
+      return constant->AsLongConstant()->GetValue();
     } else {
       DCHECK(constant->IsDoubleConstant());
-      // TODO: Remove "OrNull".
-      return bit_cast<int64_t, double>(constant->AsDoubleConstantOrNull()->GetValue());
+      return bit_cast<int64_t, double>(constant->AsDoubleConstant()->GetValue());
     }
   }
 
diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc
index cfe33fc..9b33712 100644
--- a/compiler/optimizing/code_generator_arm64.cc
+++ b/compiler/optimizing/code_generator_arm64.cc
@@ -225,8 +225,7 @@
                                locations->InAt(1),
                                LocationFrom(calling_convention.GetRegisterAt(1)),
                                DataType::Type::kInt32);
-    // TODO: Remove "OrNull".
-    QuickEntrypointEnum entrypoint = instruction_->AsBoundsCheckOrNull()->IsStringCharAt()
+    QuickEntrypointEnum entrypoint = instruction_->AsBoundsCheck()->IsStringCharAt()
         ? kQuickThrowStringBounds
         : kQuickThrowArrayBounds;
     arm64_codegen->InvokeRuntime(entrypoint, instruction_, instruction_->GetDexPc(), this);
@@ -341,8 +340,7 @@
     SaveLiveRegisters(codegen, locations);
 
     InvokeRuntimeCallingConvention calling_convention;
-    // TODO: Remove "OrNull".
-    const dex::StringIndex string_index = instruction_->AsLoadStringOrNull()->GetStringIndex();
+    const dex::StringIndex string_index = instruction_->AsLoadString()->GetStringIndex();
     __ Mov(calling_convention.GetRegisterAt(0).W(), string_index.index_);
     arm64_codegen->InvokeRuntime(kQuickResolveString, instruction_, instruction_->GetDexPc(), this);
     CheckEntrypointTypes<kQuickResolveString, void*, uint32_t>();
@@ -494,8 +492,7 @@
     SaveLiveRegisters(codegen, locations);
     InvokeRuntimeCallingConvention calling_convention;
     __ Mov(calling_convention.GetRegisterAt(0),
-           // TODO: Remove "OrNull".
-           static_cast<uint32_t>(instruction_->AsDeoptimizeOrNull()->GetDeoptimizationKind()));
+           static_cast<uint32_t>(instruction_->AsDeoptimize()->GetDeoptimizationKind()));
     arm64_codegen->InvokeRuntime(kQuickDeoptimize, instruction_, instruction_->GetDexPc(), this);
     CheckEntrypointTypes<kQuickDeoptimize, void, DeoptimizationKind>();
   }
@@ -618,8 +615,7 @@
     // instructions does not support the HIntermediateAddress
     // instruction.
     DCHECK(!(instruction_->IsArrayGet() &&
-             // TODO: Remove "OrNull".
-             instruction_->AsArrayGetOrNull()->GetArray()->IsIntermediateAddress()));
+             instruction_->AsArrayGet()->GetArray()->IsIntermediateAddress()));
 
     __ Bind(GetEntryLabel());
 
@@ -683,8 +679,7 @@
         // object.
         DCHECK(instruction_->IsInvoke()) << instruction_->DebugName();
         DCHECK(instruction_->GetLocations()->Intrinsified());
-        // TODO: Remove "OrNull".
-        HInvoke* invoke = instruction_->AsInvokeOrNull();
+        HInvoke* invoke = instruction_->AsInvoke();
         DCHECK(IsUnsafeGetObject(invoke) ||
                IsVarHandleGet(invoke) ||
                IsUnsafeCASObject(invoke) ||
@@ -1565,20 +1560,16 @@
 
 void CodeGeneratorARM64::MoveConstant(CPURegister destination, HConstant* constant) {
   if (constant->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    __ Mov(Register(destination), constant->AsIntConstantOrNull()->GetValue());
+    __ Mov(Register(destination), constant->AsIntConstant()->GetValue());
   } else if (constant->IsLongConstant()) {
-    // TODO: Remove "OrNull".
-    __ Mov(Register(destination), constant->AsLongConstantOrNull()->GetValue());
+    __ Mov(Register(destination), constant->AsLongConstant()->GetValue());
   } else if (constant->IsNullConstant()) {
     __ Mov(Register(destination), 0);
   } else if (constant->IsFloatConstant()) {
-    // TODO: Remove "OrNull".
-    __ Fmov(VRegister(destination), constant->AsFloatConstantOrNull()->GetValue());
+    __ Fmov(VRegister(destination), constant->AsFloatConstant()->GetValue());
   } else {
     DCHECK(constant->IsDoubleConstant());
-    // TODO: Remove "OrNull".
-    __ Fmov(VRegister(destination), constant->AsDoubleConstantOrNull()->GetValue());
+    __ Fmov(VRegister(destination), constant->AsDoubleConstant()->GetValue());
   }
 }
 
@@ -2271,9 +2262,7 @@
                                                    WriteBarrierKind write_barrier_kind) {
   DCHECK(instruction->IsInstanceFieldSet() || instruction->IsStaticFieldSet());
   bool is_predicated =
-      instruction->IsInstanceFieldSet() &&
-      // TODO: Remove "OrNull".
-      instruction->AsInstanceFieldSetOrNull()->GetIsPredicatedSet();
+      instruction->IsInstanceFieldSet() && instruction->AsInstanceFieldSet()->GetIsPredicatedSet();
 
   Register obj = InputRegisterAt(instruction, 0);
   CPURegister value = InputCPURegisterOrZeroRegAt(instruction, 1);
@@ -2540,8 +2529,7 @@
       __ And(out, left, right_operand);
       break;
     case HInstruction::kNeg:
-      // TODO: Remove "OrNull".
-      DCHECK(instruction->InputAt(0)->AsConstantOrNull()->IsArithmeticZero());
+      DCHECK(instruction->InputAt(0)->AsConstant()->IsArithmeticZero());
       __ Neg(out, right_operand);
       break;
     case HInstruction::kOr:
@@ -2577,8 +2565,7 @@
   LocationSummary* locations =
       new (GetGraph()->GetAllocator()) LocationSummary(instruction, LocationSummary::kNoCall);
 
-  // TODO: Remove "OrNull".
-  HIntConstant* shift = instruction->GetShift()->AsIntConstantOrNull();
+  HIntConstant* shift = instruction->GetShift()->AsIntConstant();
 
   locations->SetInAt(0, Location::RequiresRegister());
   // For byte case we don't need to shift the index variable so we can encode the data offset into
@@ -2596,8 +2583,7 @@
     HIntermediateAddressIndex* instruction) {
   Register index_reg = InputRegisterAt(instruction, 0);
   uint32_t shift = Int64FromLocation(instruction->GetLocations()->InAt(2));
-  // TODO: Remove "OrNull".
-  uint32_t offset = instruction->GetOffset()->AsIntConstantOrNull()->GetValue();
+  uint32_t offset = instruction->GetOffset()->AsIntConstant()->GetValue();
 
   if (shift == 0) {
     __ Add(OutputRegister(instruction), index_reg, offset);
@@ -2613,8 +2599,7 @@
   HInstruction* accumulator = instr->InputAt(HMultiplyAccumulate::kInputAccumulatorIndex);
   if (instr->GetOpKind() == HInstruction::kSub &&
       accumulator->IsConstant() &&
-      // TODO: Remove "OrNull".
-      accumulator->AsConstantOrNull()->IsArithmeticZero()) {
+      accumulator->AsConstant()->IsArithmeticZero()) {
     // Don't allocate register for Mneg instruction.
   } else {
     locations->SetInAt(HMultiplyAccumulate::kInputAccumulatorIndex,
@@ -2651,8 +2636,7 @@
   } else {
     DCHECK(instr->GetOpKind() == HInstruction::kSub);
     HInstruction* accum_instr = instr->InputAt(HMultiplyAccumulate::kInputAccumulatorIndex);
-    // TODO: Remove "OrNull".
-    if (accum_instr->IsConstant() && accum_instr->AsConstantOrNull()->IsArithmeticZero()) {
+    if (accum_instr->IsConstant() && accum_instr->AsConstant()->IsArithmeticZero()) {
       __ Mneg(res, mul_left, mul_right);
     } else {
       Register accumulator = InputRegisterAt(instr, HMultiplyAccumulate::kInputAccumulatorIndex);
@@ -2677,8 +2661,7 @@
       // CodeGeneratorARM64::GenerateFieldLoadWithBakerReadBarrier()
       // only if the offset is too big.
       uint32_t offset = CodeGenerator::GetArrayDataOffset(instruction);
-      // TODO: Remove "OrNull".
-      uint32_t index = instruction->GetIndex()->AsIntConstantOrNull()->GetValue();
+      uint32_t index = instruction->GetIndex()->AsIntConstant()->GetValue();
       offset += index << DataType::SizeShift(DataType::Type::kReference);
       if (offset >= kReferenceLoadMinFarOffset) {
         locations->AddTemp(FixedTempLocation());
@@ -2792,11 +2775,8 @@
         // input instruction has done it already. See the comment in
         // `TryExtractArrayAccessAddress()`.
         if (kIsDebugBuild) {
-          // TODO: Remove "OrNull".
-          HIntermediateAddress* interm_addr =
-              instruction->GetArray()->AsIntermediateAddressOrNull();
-          // TODO: Remove "OrNull".
-          DCHECK_EQ(interm_addr->GetOffset()->AsIntConstantOrNull()->GetValueAsUint64(), offset);
+          HIntermediateAddress* interm_addr = instruction->GetArray()->AsIntermediateAddress();
+          DCHECK_EQ(interm_addr->GetOffset()->AsIntConstant()->GetValueAsUint64(), offset);
         }
         temp = obj;
       } else {
@@ -2907,11 +2887,8 @@
         // input instruction has done it already. See the comment in
         // `TryExtractArrayAccessAddress()`.
         if (kIsDebugBuild) {
-          // TODO: Remove "OrNull".
-          HIntermediateAddress* interm_addr =
-              instruction->GetArray()->AsIntermediateAddressOrNull();
-          // TODO: Remove "OrNull".
-          DCHECK(interm_addr->GetOffset()->AsIntConstantOrNull()->GetValueAsUint64() == offset);
+          HIntermediateAddress* interm_addr = instruction->GetArray()->AsIntermediateAddress();
+          DCHECK(interm_addr->GetOffset()->AsIntConstant()->GetValueAsUint64() == offset);
         }
         temp = array;
       } else {
@@ -3122,9 +3099,8 @@
 }
 
 static bool IsFloatingPointZeroConstant(HInstruction* inst) {
-  // TODO: Remove "OrNull".
-  return (inst->IsFloatConstant() && (inst->AsFloatConstantOrNull()->IsArithmeticZero()))
-      || (inst->IsDoubleConstant() && (inst->AsDoubleConstantOrNull()->IsArithmeticZero()));
+  return (inst->IsFloatConstant() && (inst->AsFloatConstant()->IsArithmeticZero()))
+      || (inst->IsDoubleConstant() && (inst->AsDoubleConstant()->IsArithmeticZero()));
 }
 
 void InstructionCodeGeneratorARM64::GenerateFcmp(HInstruction* instruction) {
@@ -3708,8 +3684,7 @@
     return;  // `GenerateSuspendCheck()` emitted the jump.
   }
   if (block->IsEntryBlock() && (previous != nullptr) && previous->IsSuspendCheck()) {
-    // TODO: Remove "OrNull".
-    GenerateSuspendCheck(previous->AsSuspendCheckOrNull(), nullptr);
+    GenerateSuspendCheck(previous->AsSuspendCheck(), nullptr);
     codegen_->MaybeGenerateMarkingRegisterCheck(/* code= */ __LINE__);
   }
   if (!codegen_->GoesToNextBlock(block, successor)) {
@@ -3747,14 +3722,12 @@
     return;
   } else if (cond->IsIntConstant()) {
     // Constant condition, statically compared against "true" (integer value 1).
-    // TODO: Remove "OrNull".
-    if (cond->AsIntConstantOrNull()->IsTrue()) {
+    if (cond->AsIntConstant()->IsTrue()) {
       if (true_target != nullptr) {
         __ B(true_target);
       }
     } else {
-      // TODO: Remove "OrNull".
-      DCHECK(cond->AsIntConstantOrNull()->IsFalse()) << cond->AsIntConstantOrNull()->GetValue();
+      DCHECK(cond->AsIntConstant()->IsFalse()) << cond->AsIntConstant()->GetValue();
       if (false_target != nullptr) {
         __ B(false_target);
       }
@@ -3782,8 +3755,7 @@
   } else {
     // The condition instruction has not been materialized, use its inputs as
     // the comparison and its condition as the branch condition.
-    // TODO: Remove "OrNull".
-    HCondition* condition = cond->AsConditionOrNull();
+    HCondition* condition = cond->AsCondition();
 
     DataType::Type type = condition->InputAt(0)->GetType();
     if (DataType::IsFloatingPointType(type)) {
@@ -3952,20 +3924,17 @@
   if (IsBooleanValueOrMaterializedCondition(cond)) {
     if (cond->IsCondition() && cond->GetNext() == select) {
       // Use the condition flags set by the previous instruction.
-      // TODO: Remove "OrNull".
-      csel_cond = GetConditionForSelect(cond->AsConditionOrNull());
+      csel_cond = GetConditionForSelect(cond->AsCondition());
     } else {
       __ Cmp(InputRegisterAt(select, 2), 0);
       csel_cond = ne;
     }
   } else if (IsConditionOnFloatingPointValues(cond)) {
     GenerateFcmp(cond);
-    // TODO: Remove "OrNull".
-    csel_cond = GetConditionForSelect(cond->AsConditionOrNull());
+    csel_cond = GetConditionForSelect(cond->AsCondition());
   } else {
     __ Cmp(InputRegisterAt(cond, 0), InputOperandAt(cond, 1));
-    // TODO: Remove "OrNull".
-    csel_cond = GetConditionForSelect(cond->AsConditionOrNull());
+    csel_cond = GetConditionForSelect(cond->AsCondition());
   }
 
   if (DataType::IsFloatingPointType(select->GetType())) {
@@ -5968,8 +5937,7 @@
 void InstructionCodeGeneratorARM64::VisitParallelMove(HParallelMove* instruction) {
   if (instruction->GetNext()->IsSuspendCheck() &&
       instruction->GetBlock()->GetLoopInformation() != nullptr) {
-    // TODO: Remove "OrNull".
-    HSuspendCheck* suspend_check = instruction->GetNext()->AsSuspendCheckOrNull();
+    HSuspendCheck* suspend_check = instruction->GetNext()->AsSuspendCheck();
     // The back edge will generate the suspend check.
     codegen_->ClearSpillSlotsFromLoopPhisInStackMap(suspend_check, instruction);
   }
@@ -6909,10 +6877,8 @@
     // input instruction has done it already. See the comment in
     // `TryExtractArrayAccessAddress()`.
     if (kIsDebugBuild) {
-      // TODO: Remove "OrNull".
-      HIntermediateAddress* interm_addr = instruction->GetArray()->AsIntermediateAddressOrNull();
-      // TODO: Remove "OrNull".
-      DCHECK_EQ(interm_addr->GetOffset()->AsIntConstantOrNull()->GetValueAsUint64(), data_offset);
+      HIntermediateAddress* interm_addr = instruction->GetArray()->AsIntermediateAddress();
+      DCHECK_EQ(interm_addr->GetOffset()->AsIntConstant()->GetValueAsUint64(), data_offset);
     }
     temp = obj;
   } else {
diff --git a/compiler/optimizing/code_generator_arm_vixl.cc b/compiler/optimizing/code_generator_arm_vixl.cc
index c13708a..1e1aee9 100644
--- a/compiler/optimizing/code_generator_arm_vixl.cc
+++ b/compiler/optimizing/code_generator_arm_vixl.cc
@@ -492,8 +492,7 @@
         locations->InAt(1),
         LocationFrom(calling_convention.GetRegisterAt(1)),
         DataType::Type::kInt32);
-    // TODO: Remove "OrNull".
-    QuickEntrypointEnum entrypoint = instruction_->AsBoundsCheckOrNull()->IsStringCharAt()
+    QuickEntrypointEnum entrypoint = instruction_->AsBoundsCheck()->IsStringCharAt()
         ? kQuickThrowStringBounds
         : kQuickThrowArrayBounds;
     arm_codegen->InvokeRuntime(entrypoint, instruction_, instruction_->GetDexPc(), this);
@@ -579,12 +578,10 @@
 
   void EmitNativeCode(CodeGenerator* codegen) override {
     DCHECK(instruction_->IsLoadString());
-    // TODO: Remove "OrNull".
-    DCHECK_EQ(instruction_->AsLoadStringOrNull()->GetLoadKind(), HLoadString::LoadKind::kBssEntry);
+    DCHECK_EQ(instruction_->AsLoadString()->GetLoadKind(), HLoadString::LoadKind::kBssEntry);
     LocationSummary* locations = instruction_->GetLocations();
     DCHECK(!locations->GetLiveRegisters()->ContainsCoreRegister(locations->Out().reg()));
-    // TODO: Remove "OrNull".
-    const dex::StringIndex string_index = instruction_->AsLoadStringOrNull()->GetStringIndex();
+    const dex::StringIndex string_index = instruction_->AsLoadString()->GetStringIndex();
 
     CodeGeneratorARMVIXL* arm_codegen = down_cast<CodeGeneratorARMVIXL*>(codegen);
     __ Bind(GetEntryLabel());
@@ -678,8 +675,7 @@
     SaveLiveRegisters(codegen, locations);
     InvokeRuntimeCallingConventionARMVIXL calling_convention;
     __ Mov(calling_convention.GetRegisterAt(0),
-           // TODO: Remove "OrNull".
-           static_cast<uint32_t>(instruction_->AsDeoptimizeOrNull()->GetDeoptimizationKind()));
+           static_cast<uint32_t>(instruction_->AsDeoptimize()->GetDeoptimizationKind()));
 
     arm_codegen->InvokeRuntime(kQuickDeoptimize, instruction_, instruction_->GetDexPc(), this);
     CheckEntrypointTypes<kQuickDeoptimize, void, DeoptimizationKind>();
@@ -780,8 +776,7 @@
     // instructions does not support the HIntermediateAddress
     // instruction.
     DCHECK(!(instruction_->IsArrayGet() &&
-             // TODO: Remove "OrNull".
-             instruction_->AsArrayGetOrNull()->GetArray()->IsIntermediateAddress()));
+             instruction_->AsArrayGet()->GetArray()->IsIntermediateAddress()));
 
     __ Bind(GetEntryLabel());
     SaveLiveRegisters(codegen, locations);
@@ -844,8 +839,7 @@
         // object.
         DCHECK(instruction_->IsInvoke()) << instruction_->DebugName();
         DCHECK(instruction_->GetLocations()->Intrinsified());
-        // TODO: Remove "OrNull".
-        HInvoke* invoke = instruction_->AsInvokeOrNull();
+        HInvoke* invoke = instruction_->AsInvoke();
         DCHECK(IsUnsafeGetObject(invoke) || IsVarHandleGet(invoke) || IsVarHandleCASFamily(invoke))
             << invoke->GetIntrinsic();
         DCHECK_EQ(offset_, 0U);
@@ -1853,8 +1847,7 @@
 static Location Arm8BitEncodableConstantOrRegister(HInstruction* constant) {
   DCHECK(!DataType::IsFloatingPointType(constant->GetType()));
 
-  // TODO: Remove "OrNull".
-  if (constant->IsConstant() && CanEncodeConstantAs8BitImmediate(constant->AsConstantOrNull())) {
+  if (constant->IsConstant() && CanEncodeConstantAs8BitImmediate(constant->AsConstant())) {
     return Location::ConstantLocation(constant);
   }
 
@@ -1908,8 +1901,7 @@
   if (next->IsGoto() && (info == nullptr ||
                          !info->IsBackEdge(*block) ||
                          !info->HasSuspendCheck())) {
-    // TODO: Remove "OrNull".
-    final_label = GetLabelOf(next->AsGotoOrNull()->GetSuccessor());
+    final_label = GetLabelOf(next->AsGoto()->GetSuccessor());
   }
 
   return final_label;
@@ -2801,8 +2793,7 @@
     return;
   }
   if (block->IsEntryBlock() && (previous != nullptr) && previous->IsSuspendCheck()) {
-    // TODO: Remove "OrNull".
-    GenerateSuspendCheck(previous->AsSuspendCheckOrNull(), nullptr);
+    GenerateSuspendCheck(previous->AsSuspendCheck(), nullptr);
     codegen_->MaybeGenerateMarkingRegisterCheck(/* code= */ 2);
   }
   if (!codegen_->GoesToNextBlock(block, successor)) {
@@ -2886,14 +2877,12 @@
     return;
   } else if (cond->IsIntConstant()) {
     // Constant condition, statically compared against "true" (integer value 1).
-    // TODO: Remove "OrNull".
-    if (cond->AsIntConstantOrNull()->IsTrue()) {
+    if (cond->AsIntConstant()->IsTrue()) {
       if (true_target != nullptr) {
         __ B(true_target);
       }
     } else {
-      // TODO: Remove "OrNull".
-      DCHECK(cond->AsIntConstantOrNull()->IsFalse()) << Int32ConstantFrom(cond);
+      DCHECK(cond->AsIntConstant()->IsFalse()) << Int32ConstantFrom(cond);
       if (false_target != nullptr) {
         __ B(false_target);
       }
@@ -2927,8 +2916,7 @@
   } else {
     // Condition has not been materialized. Use its inputs as the comparison and
     // its condition as the branch condition.
-    // TODO: Remove "OrNull".
-    HCondition* condition = cond->AsConditionOrNull();
+    HCondition* condition = cond->AsCondition();
 
     // If this is a long or FP comparison that has been folded into
     // the HCondition, generate the comparison directly.
@@ -3071,8 +3059,7 @@
   Location src;
 
   if (condition->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    if (condition->AsIntConstantOrNull()->IsFalse()) {
+    if (condition->AsIntConstant()->IsFalse()) {
       src = first;
     } else {
       src = second;
@@ -3112,8 +3099,7 @@
         __ Cmp(InputRegisterAt(select, 2), 0);
         cond = invert ? std::make_pair(eq, ne) : std::make_pair(ne, eq);
       } else {
-        // TODO: Remove "OrNull".
-        cond = GenerateTest(condition->AsConditionOrNull(), invert, codegen_);
+        cond = GenerateTest(condition->AsCondition(), invert, codegen_);
       }
 
       const size_t instr_count = out.IsRegisterPair() ? 4 : 2;
@@ -4068,8 +4054,7 @@
           } else {
             DCHECK(in.IsConstant());
             DCHECK(in.GetConstant()->IsLongConstant());
-            // TODO: Remove "OrNull".
-            int64_t value = in.GetConstant()->AsLongConstantOrNull()->GetValue();
+            int64_t value = in.GetConstant()->AsLongConstant()->GetValue();
             __ Mov(OutputRegister(conversion), static_cast<int32_t>(value));
           }
           break;
@@ -5911,9 +5896,7 @@
   std::optional<vixl::aarch32::Label> pred_is_null;
 
   bool is_predicated =
-      instruction->IsInstanceFieldSet() &&
-      // TODO: Remove "OrNull".
-      instruction->AsInstanceFieldSetOrNull()->GetIsPredicatedSet();
+      instruction->IsInstanceFieldSet() && instruction->AsInstanceFieldSet()->GetIsPredicatedSet();
   bool is_volatile = field_info.IsVolatile();
   bool atomic_ldrd_strd = codegen_->GetInstructionSetFeatures().HasAtomicLdrdAndStrd();
   DataType::Type field_type = field_info.GetFieldType();
@@ -6110,9 +6093,8 @@
 
 Location LocationsBuilderARMVIXL::ArithmeticZeroOrFpuRegister(HInstruction* input) {
   DCHECK(DataType::IsFloatingPointType(input->GetType())) << input->GetType();
-  // TODO: Remove "OrNull".
-  if ((input->IsFloatConstant() && (input->AsFloatConstantOrNull()->IsArithmeticZero())) ||
-      (input->IsDoubleConstant() && (input->AsDoubleConstantOrNull()->IsArithmeticZero()))) {
+  if ((input->IsFloatConstant() && (input->AsFloatConstant()->IsArithmeticZero())) ||
+      (input->IsDoubleConstant() && (input->AsDoubleConstant()->IsArithmeticZero()))) {
     return Location::ConstantLocation(input);
   } else {
     return Location::RequiresFpuRegister();
@@ -6122,9 +6104,7 @@
 Location LocationsBuilderARMVIXL::ArmEncodableConstantOrRegister(HInstruction* constant,
                                                                  Opcode opcode) {
   DCHECK(!DataType::IsFloatingPointType(constant->GetType()));
-  if (constant->IsConstant() &&
-      // TODO: Remove "OrNull".
-      CanEncodeConstantAsImmediate(constant->AsConstantOrNull(), opcode)) {
+  if (constant->IsConstant() && CanEncodeConstantAsImmediate(constant->AsConstant(), opcode)) {
     return Location::ConstantLocation(constant);
   }
   return Location::RequiresRegister();
@@ -6559,8 +6539,7 @@
       // CodeGeneratorARMVIXL::GenerateFieldLoadWithBakerReadBarrier()
       // only if the offset is too big.
       uint32_t offset = CodeGenerator::GetArrayDataOffset(instruction);
-      // TODO: Remove "OrNull".
-      uint32_t index = instruction->GetIndex()->AsIntConstantOrNull()->GetValue();
+      uint32_t index = instruction->GetIndex()->AsIntConstant()->GetValue();
       offset += index << DataType::SizeShift(DataType::Type::kReference);
       if (offset >= kReferenceLoadMinFarOffset) {
         locations->AddTemp(Location::RequiresRegister());
@@ -6645,8 +6624,7 @@
           // input instruction has done it already. See the comment in
           // `TryExtractArrayAccessAddress()`.
           if (kIsDebugBuild) {
-            // TODO: Remove "OrNull".
-            HIntermediateAddress* tmp = array_instr->AsIntermediateAddressOrNull();
+            HIntermediateAddress* tmp = array_instr->AsIntermediateAddress();
             DCHECK_EQ(Uint64ConstantFrom(tmp->GetOffset()), data_offset);
           }
           temp = obj;
@@ -6731,8 +6709,7 @@
             // input instruction has done it already. See the comment in
             // `TryExtractArrayAccessAddress()`.
             if (kIsDebugBuild) {
-              // TODO: Remove "OrNull".
-              HIntermediateAddress* tmp = array_instr->AsIntermediateAddressOrNull();
+              HIntermediateAddress* tmp = array_instr->AsIntermediateAddress();
               DCHECK_EQ(Uint64ConstantFrom(tmp->GetOffset()), data_offset);
             }
             temp = obj;
@@ -6883,8 +6860,7 @@
           // input instruction has done it already. See the comment in
           // `TryExtractArrayAccessAddress()`.
           if (kIsDebugBuild) {
-            // TODO: Remove "OrNull".
-            HIntermediateAddress* tmp = array_instr->AsIntermediateAddressOrNull();
+            HIntermediateAddress* tmp = array_instr->AsIntermediateAddress();
             DCHECK_EQ(Uint64ConstantFrom(tmp->GetOffset()), data_offset);
           }
           temp = array;
@@ -7264,8 +7240,7 @@
 void InstructionCodeGeneratorARMVIXL::VisitParallelMove(HParallelMove* instruction) {
   if (instruction->GetNext()->IsSuspendCheck() &&
       instruction->GetBlock()->GetLoopInformation() != nullptr) {
-    // TODO: Remove "OrNull".
-    HSuspendCheck* suspend_check = instruction->GetNext()->AsSuspendCheckOrNull();
+    HSuspendCheck* suspend_check = instruction->GetNext()->AsSuspendCheck();
     // The back edge will generate the suspend check.
     codegen_->ClearSpillSlotsFromLoopPhisInStackMap(suspend_check, instruction);
   }
@@ -7435,8 +7410,7 @@
                                       destination.GetHighStackIndex(kArmWordSize));
       }
     } else if (constant->IsDoubleConstant()) {
-      // TODO: Remove "OrNull".
-      double value = constant->AsDoubleConstantOrNull()->GetValue();
+      double value = constant->AsDoubleConstant()->GetValue();
       if (destination.IsFpuRegisterPair()) {
         __ Vmov(DRegisterFrom(destination), value);
       } else {
@@ -7453,8 +7427,7 @@
       }
     } else {
       DCHECK(constant->IsFloatConstant()) << constant->DebugName();
-      // TODO: Remove "OrNull".
-      float value = constant->AsFloatConstantOrNull()->GetValue();
+      float value = constant->AsFloatConstant()->GetValue();
       if (destination.IsFpuRegister()) {
         __ Vmov(SRegisterFrom(destination), value);
       } else {
diff --git a/compiler/optimizing/code_generator_utils.cc b/compiler/optimizing/code_generator_utils.cc
index 2306f07..9980592 100644
--- a/compiler/optimizing/code_generator_utils.cc
+++ b/compiler/optimizing/code_generator_utils.cc
@@ -140,8 +140,7 @@
 
   // We need to find a successor basic block of HIf for the case when instr is non-negative.
   // If the successor dominates target_block, instructions in target_block see a non-negative value.
-  // TODO: Remove "OrNull".
-  HIf* if_instr = cond->GetBlock()->GetLastInstruction()->AsIfOrNull();
+  HIf* if_instr = cond->GetBlock()->GetLastInstruction()->AsIf();
   HBasicBlock* successor = nullptr;
   switch (cond->GetCondition()) {
     case kCondGT:
@@ -228,9 +227,7 @@
       // The condition must dominate target_user to guarantee that the value is always checked
       // before it is used by target_user.
       if (user->GetBlock()->Dominates(target_user->GetBlock()) &&
-          // TODO: Remove "OrNull".
-          IsComparedValueNonNegativeInBlock(
-              value, user->AsConditionOrNull(), target_user->GetBlock())) {
+          IsComparedValueNonNegativeInBlock(value, user->AsCondition(), target_user->GetBlock())) {
         return true;
       }
     }
diff --git a/compiler/optimizing/code_generator_vector_arm64_neon.cc b/compiler/optimizing/code_generator_vector_arm64_neon.cc
index b73d0d3..ce02bfa 100644
--- a/compiler/optimizing/code_generator_vector_arm64_neon.cc
+++ b/compiler/optimizing/code_generator_vector_arm64_neon.cc
@@ -47,11 +47,9 @@
     if (constant->IsLongConstant()) {
       return false;
     } else if (constant->IsFloatConstant()) {
-      // TODO: Remove "OrNull".
-      return vixl::aarch64::Assembler::IsImmFP32(constant->AsFloatConstantOrNull()->GetValue());
+      return vixl::aarch64::Assembler::IsImmFP32(constant->AsFloatConstant()->GetValue());
     } else if (constant->IsDoubleConstant()) {
-      // TODO: Remove "OrNull".
-      return vixl::aarch64::Assembler::IsImmFP64(constant->AsDoubleConstantOrNull()->GetValue());
+      return vixl::aarch64::Assembler::IsImmFP64(constant->AsDoubleConstant()->GetValue());
     }
     int64_t value = CodeGenerator::GetInt64ValueOf(constant);
     return IsUint<8>(value);
@@ -64,9 +62,7 @@
 //    encoded into the instruction.
 //  - register location otherwise.
 inline Location NEONEncodableConstantOrRegister(HInstruction* constant, HInstruction* instr) {
-  if (constant->IsConstant() &&
-      // TODO: Remove "OrNull".
-      NEONCanEncodeConstantAsImmediate(constant->AsConstantOrNull(), instr)) {
+  if (constant->IsConstant() && NEONCanEncodeConstantAsImmediate(constant->AsConstant(), instr)) {
     return Location::ConstantLocation(constant);
   }
 
@@ -95,8 +91,7 @@
     case DataType::Type::kFloat32:
     case DataType::Type::kFloat64:
       if (input->IsConstant() &&
-          // TODO: Remove "OrNull".
-          NEONCanEncodeConstantAsImmediate(input->AsConstantOrNull(), instruction)) {
+          NEONCanEncodeConstantAsImmediate(input->AsConstant(), instruction)) {
         locations->SetInAt(0, Location::ConstantLocation(input));
         locations->SetOut(Location::RequiresFpuRegister());
       } else {
@@ -153,8 +148,7 @@
     case DataType::Type::kFloat32:
       DCHECK_EQ(4u, instruction->GetVectorLength());
       if (src_loc.IsConstant()) {
-        // TODO: Remove "OrNull".
-        __ Fmov(dst.V4S(), src_loc.GetConstant()->AsFloatConstantOrNull()->GetValue());
+        __ Fmov(dst.V4S(), src_loc.GetConstant()->AsFloatConstant()->GetValue());
       } else {
         __ Dup(dst.V4S(), VRegisterFrom(src_loc).V4S(), 0);
       }
@@ -162,8 +156,7 @@
     case DataType::Type::kFloat64:
       DCHECK_EQ(2u, instruction->GetVectorLength());
       if (src_loc.IsConstant()) {
-        // TODO: Remove "OrNull".
-        __ Fmov(dst.V2D(), src_loc.GetConstant()->AsDoubleConstantOrNull()->GetValue());
+        __ Fmov(dst.V2D(), src_loc.GetConstant()->AsDoubleConstant()->GetValue());
       } else {
         __ Dup(dst.V2D(), VRegisterFrom(src_loc).V2D(), 0);
       }
@@ -903,8 +896,7 @@
   LocationSummary* locations = instruction->GetLocations();
   VRegister lhs = VRegisterFrom(locations->InAt(0));
   VRegister dst = VRegisterFrom(locations->Out());
-  // TODO: Remove "OrNull".
-  int32_t value = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t value = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
   switch (instruction->GetPackedType()) {
     case DataType::Type::kUint8:
     case DataType::Type::kInt8:
@@ -938,8 +930,7 @@
   LocationSummary* locations = instruction->GetLocations();
   VRegister lhs = VRegisterFrom(locations->InAt(0));
   VRegister dst = VRegisterFrom(locations->Out());
-  // TODO: Remove "OrNull".
-  int32_t value = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t value = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
   switch (instruction->GetPackedType()) {
     case DataType::Type::kUint8:
     case DataType::Type::kInt8:
@@ -973,8 +964,7 @@
   LocationSummary* locations = instruction->GetLocations();
   VRegister lhs = VRegisterFrom(locations->InAt(0));
   VRegister dst = VRegisterFrom(locations->Out());
-  // TODO: Remove "OrNull".
-  int32_t value = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t value = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
   switch (instruction->GetPackedType()) {
     case DataType::Type::kUint8:
     case DataType::Type::kInt8:
@@ -1146,10 +1136,8 @@
   CreateVecAccumLocations(GetGraph()->GetAllocator(), instruction);
   // Some conversions require temporary registers.
   LocationSummary* locations = instruction->GetLocations();
-  // TODO: Remove "OrNull".
-  HVecOperation* a = instruction->InputAt(1)->AsVecOperationOrNull();
-  // TODO: Remove "OrNull".
-  HVecOperation* b = instruction->InputAt(2)->AsVecOperationOrNull();
+  HVecOperation* a = instruction->InputAt(1)->AsVecOperation();
+  HVecOperation* b = instruction->InputAt(2)->AsVecOperation();
   DCHECK_EQ(HVecOperation::ToSignedType(a->GetPackedType()),
             HVecOperation::ToSignedType(b->GetPackedType()));
   switch (a->GetPackedType()) {
@@ -1195,10 +1183,8 @@
   DCHECK(locations->InAt(0).Equals(locations->Out()));
 
   // Handle all feasible acc_T += sad(a_S, b_S) type combinations (T x S).
-  // TODO: Remove "OrNull".
-  HVecOperation* a = instruction->InputAt(1)->AsVecOperationOrNull();
-  // TODO: Remove "OrNull".
-  HVecOperation* b = instruction->InputAt(2)->AsVecOperationOrNull();
+  HVecOperation* a = instruction->InputAt(1)->AsVecOperation();
+  HVecOperation* b = instruction->InputAt(2)->AsVecOperation();
   DCHECK_EQ(HVecOperation::ToSignedType(a->GetPackedType()),
             HVecOperation::ToSignedType(b->GetPackedType()));
   switch (a->GetPackedType()) {
@@ -1337,8 +1323,7 @@
   locations->SetOut(Location::SameAsFirstInput());
 
   // For Int8 and Uint8 general case we need a temp register.
-  // TODO: Remove "OrNull".
-  if ((DataType::Size(instruction->InputAt(1)->AsVecOperationOrNull()->GetPackedType()) == 1) &&
+  if ((DataType::Size(instruction->InputAt(1)->AsVecOperation()->GetPackedType()) == 1) &&
       !ShouldEmitDotProductInstructions(codegen_)) {
     locations->AddTemp(Location::RequiresFpuRegister());
   }
@@ -1350,10 +1335,8 @@
   VRegister acc = VRegisterFrom(locations->InAt(0));
   VRegister left = VRegisterFrom(locations->InAt(1));
   VRegister right = VRegisterFrom(locations->InAt(2));
-  // TODO: Remove "OrNull".
-  HVecOperation* a = instruction->InputAt(1)->AsVecOperationOrNull();
-  // TODO: Remove "OrNull".
-  HVecOperation* b = instruction->InputAt(2)->AsVecOperationOrNull();
+  HVecOperation* a = instruction->InputAt(1)->AsVecOperation();
+  HVecOperation* b = instruction->InputAt(2)->AsVecOperation();
   DCHECK_EQ(HVecOperation::ToSignedType(a->GetPackedType()),
             HVecOperation::ToSignedType(b->GetPackedType()));
   DCHECK_EQ(instruction->GetPackedType(), DataType::Type::kInt32);
diff --git a/compiler/optimizing/code_generator_vector_arm64_sve.cc b/compiler/optimizing/code_generator_vector_arm64_sve.cc
index aa4bbad..4c16c3e 100644
--- a/compiler/optimizing/code_generator_vector_arm64_sve.cc
+++ b/compiler/optimizing/code_generator_vector_arm64_sve.cc
@@ -45,11 +45,9 @@
     if (constant->IsLongConstant()) {
       return false;
     } else if (constant->IsFloatConstant()) {
-      // TODO: Remove "OrNull".
-      return vixl::aarch64::Assembler::IsImmFP32(constant->AsFloatConstantOrNull()->GetValue());
+      return vixl::aarch64::Assembler::IsImmFP32(constant->AsFloatConstant()->GetValue());
     } else if (constant->IsDoubleConstant()) {
-      // TODO: Remove "OrNull".
-      return vixl::aarch64::Assembler::IsImmFP64(constant->AsDoubleConstantOrNull()->GetValue());
+      return vixl::aarch64::Assembler::IsImmFP64(constant->AsDoubleConstant()->GetValue());
     }
     // TODO: Make use of shift part of DUP instruction.
     int64_t value = CodeGenerator::GetInt64ValueOf(constant);
@@ -64,9 +62,7 @@
 //    encoded into the instruction.
 //  - register location otherwise.
 inline Location SVEEncodableConstantOrRegister(HInstruction* constant, HInstruction* instr) {
-  if (constant->IsConstant() &&
-      // TODO: Remove "OrNull".
-      SVECanEncodeConstantAsImmediate(constant->AsConstantOrNull(), instr)) {
+  if (constant->IsConstant() && SVECanEncodeConstantAsImmediate(constant->AsConstant(), instr)) {
     return Location::ConstantLocation(constant);
   }
 
@@ -95,8 +91,7 @@
     case DataType::Type::kFloat32:
     case DataType::Type::kFloat64:
       if (input->IsConstant() &&
-          // TODO: Remove "OrNull".
-          SVECanEncodeConstantAsImmediate(input->AsConstantOrNull(), instruction)) {
+          SVECanEncodeConstantAsImmediate(input->AsConstant(), instruction)) {
         locations->SetInAt(0, Location::ConstantLocation(input));
         locations->SetOut(Location::RequiresFpuRegister());
       } else {
@@ -150,16 +145,14 @@
       break;
     case DataType::Type::kFloat32:
       if (src_loc.IsConstant()) {
-        // TODO: Remove "OrNull".
-        __ Fdup(dst.VnS(), src_loc.GetConstant()->AsFloatConstantOrNull()->GetValue());
+        __ Fdup(dst.VnS(), src_loc.GetConstant()->AsFloatConstant()->GetValue());
       } else {
         __ Dup(dst.VnS(), ZRegisterFrom(src_loc).VnS(), 0);
       }
       break;
     case DataType::Type::kFloat64:
       if (src_loc.IsConstant()) {
-        // TODO: Remove "OrNull".
-        __ Fdup(dst.VnD(), src_loc.GetConstant()->AsDoubleConstantOrNull()->GetValue());
+        __ Fdup(dst.VnD(), src_loc.GetConstant()->AsDoubleConstant()->GetValue());
       } else {
         __ Dup(dst.VnD(), ZRegisterFrom(src_loc).VnD(), 0);
       }
@@ -776,8 +769,7 @@
   const ZRegister lhs = ZRegisterFrom(locations->InAt(0));
   const ZRegister dst = ZRegisterFrom(locations->Out());
   const PRegisterM p_reg = LoopPReg().Merging();
-  // TODO: Remove "OrNull".
-  int32_t value = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t value = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
   ValidateVectorLength(instruction);
   switch (instruction->GetPackedType()) {
     case DataType::Type::kUint8:
@@ -810,8 +802,7 @@
   const ZRegister lhs = ZRegisterFrom(locations->InAt(0));
   const ZRegister dst = ZRegisterFrom(locations->Out());
   const PRegisterM p_reg = LoopPReg().Merging();
-  // TODO: Remove "OrNull".
-  int32_t value = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t value = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
   ValidateVectorLength(instruction);
   switch (instruction->GetPackedType()) {
     case DataType::Type::kUint8:
@@ -844,8 +835,7 @@
   const ZRegister lhs = ZRegisterFrom(locations->InAt(0));
   const ZRegister dst = ZRegisterFrom(locations->Out());
   const PRegisterM p_reg = LoopPReg().Merging();
-  // TODO: Remove "OrNull".
-  int32_t value = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t value = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
   ValidateVectorLength(instruction);
   switch (instruction->GetPackedType()) {
     case DataType::Type::kUint8:
@@ -1039,10 +1029,8 @@
   const ZRegister left = ZRegisterFrom(locations->InAt(1));
   const ZRegister right = ZRegisterFrom(locations->InAt(2));
   const PRegisterM p_reg = LoopPReg().Merging();
-  // TODO: Remove "OrNull".
-  HVecOperation* a = instruction->InputAt(1)->AsVecOperationOrNull();
-  // TODO: Remove "OrNull".
-  HVecOperation* b = instruction->InputAt(2)->AsVecOperationOrNull();
+  HVecOperation* a = instruction->InputAt(1)->AsVecOperation();
+  HVecOperation* b = instruction->InputAt(2)->AsVecOperation();
   DCHECK_EQ(HVecOperation::ToSignedType(a->GetPackedType()),
             HVecOperation::ToSignedType(b->GetPackedType()));
   DCHECK_EQ(instruction->GetPackedType(), DataType::Type::kInt32);
diff --git a/compiler/optimizing/code_generator_vector_arm_vixl.cc b/compiler/optimizing/code_generator_vector_arm_vixl.cc
index 0ee6564..e8ecf28 100644
--- a/compiler/optimizing/code_generator_vector_arm_vixl.cc
+++ b/compiler/optimizing/code_generator_vector_arm_vixl.cc
@@ -657,8 +657,7 @@
   LocationSummary* locations = instruction->GetLocations();
   vixl32::DRegister lhs = DRegisterFrom(locations->InAt(0));
   vixl32::DRegister dst = DRegisterFrom(locations->Out());
-  // TODO: Remove "OrNull".
-  int32_t value = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t value = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
   switch (instruction->GetPackedType()) {
     case DataType::Type::kUint8:
     case DataType::Type::kInt8:
@@ -688,8 +687,7 @@
   LocationSummary* locations = instruction->GetLocations();
   vixl32::DRegister lhs = DRegisterFrom(locations->InAt(0));
   vixl32::DRegister dst = DRegisterFrom(locations->Out());
-  // TODO: Remove "OrNull".
-  int32_t value = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t value = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
   switch (instruction->GetPackedType()) {
     case DataType::Type::kUint8:
     case DataType::Type::kInt8:
@@ -719,8 +717,7 @@
   LocationSummary* locations = instruction->GetLocations();
   vixl32::DRegister lhs = DRegisterFrom(locations->InAt(0));
   vixl32::DRegister dst = DRegisterFrom(locations->Out());
-  // TODO: Remove "OrNull".
-  int32_t value = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t value = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
   switch (instruction->GetPackedType()) {
     case DataType::Type::kUint8:
     case DataType::Type::kInt8:
@@ -830,10 +827,8 @@
   DCHECK(locations->InAt(0).Equals(locations->Out()));
 
   // Handle all feasible acc_T += sad(a_S, b_S) type combinations (T x S).
-  // TODO: Remove "OrNull".
-  HVecOperation* a = instruction->InputAt(1)->AsVecOperationOrNull();
-  // TODO: Remove "OrNull".
-  HVecOperation* b = instruction->InputAt(2)->AsVecOperationOrNull();
+  HVecOperation* a = instruction->InputAt(1)->AsVecOperation();
+  HVecOperation* b = instruction->InputAt(2)->AsVecOperation();
   DCHECK_EQ(a->GetPackedType(), b->GetPackedType());
   switch (a->GetPackedType()) {
     case DataType::Type::kInt32:
diff --git a/compiler/optimizing/code_generator_vector_x86.cc b/compiler/optimizing/code_generator_vector_x86.cc
index 5fb63d3..343a6e1 100644
--- a/compiler/optimizing/code_generator_vector_x86.cc
+++ b/compiler/optimizing/code_generator_vector_x86.cc
@@ -997,8 +997,7 @@
 void InstructionCodeGeneratorX86::VisitVecShl(HVecShl* instruction) {
   LocationSummary* locations = instruction->GetLocations();
   DCHECK(locations->InAt(0).Equals(locations->Out()));
-  // TODO: Remove "OrNull".
-  int32_t value = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t value = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
   XmmRegister dst = locations->Out().AsFpuRegister<XmmRegister>();
   switch (instruction->GetPackedType()) {
     case DataType::Type::kUint16:
@@ -1027,8 +1026,7 @@
 void InstructionCodeGeneratorX86::VisitVecShr(HVecShr* instruction) {
   LocationSummary* locations = instruction->GetLocations();
   DCHECK(locations->InAt(0).Equals(locations->Out()));
-  // TODO: Remove "OrNull".
-  int32_t value = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t value = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
   XmmRegister dst = locations->Out().AsFpuRegister<XmmRegister>();
   switch (instruction->GetPackedType()) {
     case DataType::Type::kUint16:
@@ -1053,8 +1051,7 @@
 void InstructionCodeGeneratorX86::VisitVecUShr(HVecUShr* instruction) {
   LocationSummary* locations = instruction->GetLocations();
   DCHECK(locations->InAt(0).Equals(locations->Out()));
-  // TODO: Remove "OrNull".
-  int32_t value = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t value = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
   XmmRegister dst = locations->Out().AsFpuRegister<XmmRegister>();
   switch (instruction->GetPackedType()) {
     case DataType::Type::kUint16:
diff --git a/compiler/optimizing/code_generator_vector_x86_64.cc b/compiler/optimizing/code_generator_vector_x86_64.cc
index 72c766f..fb6e4e7 100644
--- a/compiler/optimizing/code_generator_vector_x86_64.cc
+++ b/compiler/optimizing/code_generator_vector_x86_64.cc
@@ -980,8 +980,7 @@
 void InstructionCodeGeneratorX86_64::VisitVecShl(HVecShl* instruction) {
   LocationSummary* locations = instruction->GetLocations();
   DCHECK(locations->InAt(0).Equals(locations->Out()));
-  // TODO: Remove "OrNull".
-  int32_t value = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t value = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
   XmmRegister dst = locations->Out().AsFpuRegister<XmmRegister>();
   switch (instruction->GetPackedType()) {
     case DataType::Type::kUint16:
@@ -1010,8 +1009,7 @@
 void InstructionCodeGeneratorX86_64::VisitVecShr(HVecShr* instruction) {
   LocationSummary* locations = instruction->GetLocations();
   DCHECK(locations->InAt(0).Equals(locations->Out()));
-  // TODO: Remove "OrNull".
-  int32_t value = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t value = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
   XmmRegister dst = locations->Out().AsFpuRegister<XmmRegister>();
   switch (instruction->GetPackedType()) {
     case DataType::Type::kUint16:
@@ -1036,8 +1034,7 @@
 void InstructionCodeGeneratorX86_64::VisitVecUShr(HVecUShr* instruction) {
   LocationSummary* locations = instruction->GetLocations();
   DCHECK(locations->InAt(0).Equals(locations->Out()));
-  // TODO: Remove "OrNull".
-  int32_t value = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t value = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
   XmmRegister dst = locations->Out().AsFpuRegister<XmmRegister>();
   switch (instruction->GetPackedType()) {
     case DataType::Type::kUint16:
diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc
index e19d49b..d85e0f6 100644
--- a/compiler/optimizing/code_generator_x86.cc
+++ b/compiler/optimizing/code_generator_x86.cc
@@ -164,8 +164,7 @@
     // Are we using an array length from memory?
     if (!length_loc.IsValid()) {
       DCHECK(instruction_->InputAt(1)->IsArrayLength());
-      // TODO: Remove "OrNull".
-      HArrayLength* array_length = instruction_->InputAt(1)->AsArrayLengthOrNull();
+      HArrayLength* array_length = instruction_->InputAt(1)->AsArrayLength();
       DCHECK(array_length->IsEmittedAtUseSite());
       uint32_t len_offset = CodeGenerator::GetArrayLengthOffset(array_length);
       Location array_loc = array_length->GetLocations()->InAt(0);
@@ -207,8 +206,7 @@
           DataType::Type::kInt32);
     }
 
-    // TODO: Remove "OrNull".
-    QuickEntrypointEnum entrypoint = instruction_->AsBoundsCheckOrNull()->IsStringCharAt()
+    QuickEntrypointEnum entrypoint = instruction_->AsBoundsCheck()->IsStringCharAt()
         ? kQuickThrowStringBounds
         : kQuickThrowArrayBounds;
     x86_codegen->InvokeRuntime(entrypoint, instruction_, instruction_->GetDexPc(), this);
@@ -275,8 +273,7 @@
     SaveLiveRegisters(codegen, locations);
 
     InvokeRuntimeCallingConvention calling_convention;
-    // TODO: Remove "OrNull".
-    const dex::StringIndex string_index = instruction_->AsLoadStringOrNull()->GetStringIndex();
+    const dex::StringIndex string_index = instruction_->AsLoadString()->GetStringIndex();
     __ movl(calling_convention.GetRegisterAt(0), Immediate(string_index.index_));
     x86_codegen->InvokeRuntime(kQuickResolveString, instruction_, instruction_->GetDexPc(), this);
     CheckEntrypointTypes<kQuickResolveString, void*, uint32_t>();
@@ -370,8 +367,7 @@
 
     if (kPoisonHeapReferences &&
         instruction_->IsCheckCast() &&
-        // TODO: Remove "OrNull".
-        instruction_->AsCheckCastOrNull()->GetTypeCheckKind() == TypeCheckKind::kInterfaceCheck) {
+        instruction_->AsCheckCast()->GetTypeCheckKind() == TypeCheckKind::kInterfaceCheck) {
       // First, unpoison the `cls` reference that was poisoned for direct memory comparison.
       __ UnpoisonHeapReference(locations->InAt(1).AsRegister<Register>());
     }
@@ -436,8 +432,7 @@
     InvokeRuntimeCallingConvention calling_convention;
     x86_codegen->Load32BitValue(
         calling_convention.GetRegisterAt(0),
-        // TODO: Remove "OrNull".
-        static_cast<uint32_t>(instruction_->AsDeoptimizeOrNull()->GetDeoptimizationKind()));
+        static_cast<uint32_t>(instruction_->AsDeoptimize()->GetDeoptimizationKind()));
     x86_codegen->InvokeRuntime(kQuickDeoptimize, instruction_, instruction_->GetDexPc(), this);
     CheckEntrypointTypes<kQuickDeoptimize, void, DeoptimizationKind>();
   }
@@ -608,8 +603,7 @@
     DCHECK((instruction_->IsInvoke() && instruction_->GetLocations()->Intrinsified()))
         << "Unexpected instruction in read barrier marking and field updating slow path: "
         << instruction_->DebugName();
-    // TODO: Remove "OrNull".
-    HInvoke* invoke = instruction_->AsInvokeOrNull();
+    HInvoke* invoke = instruction_->AsInvoke();
     DCHECK(IsUnsafeCASObject(invoke) || IsVarHandleCASFamily(invoke)) << invoke->GetIntrinsic();
 
     __ Bind(GetEntryLabel());
@@ -842,17 +836,13 @@
         // to an object field within an object.
         DCHECK(instruction_->IsInvoke()) << instruction_->DebugName();
         DCHECK(instruction_->GetLocations()->Intrinsified());
-        // TODO: Remove "OrNull".
-        DCHECK((instruction_->AsInvokeOrNull()->GetIntrinsic() == Intrinsics::kUnsafeGetObject) ||
-               (instruction_->AsInvokeOrNull()->GetIntrinsic() ==
-                    Intrinsics::kUnsafeGetObjectVolatile) ||
-               (instruction_->AsInvokeOrNull()->GetIntrinsic() ==
-                    Intrinsics::kJdkUnsafeGetObject) ||
-               (instruction_->AsInvokeOrNull()->GetIntrinsic() ==
+        DCHECK((instruction_->AsInvoke()->GetIntrinsic() == Intrinsics::kUnsafeGetObject) ||
+               (instruction_->AsInvoke()->GetIntrinsic() == Intrinsics::kUnsafeGetObjectVolatile) ||
+               (instruction_->AsInvoke()->GetIntrinsic() == Intrinsics::kJdkUnsafeGetObject) ||
+               (instruction_->AsInvoke()->GetIntrinsic() ==
                     Intrinsics::kJdkUnsafeGetObjectVolatile) ||
-               (instruction_->AsInvokeOrNull()->GetIntrinsic() ==
-                    Intrinsics::kJdkUnsafeGetObjectAcquire))
-            << instruction_->AsInvokeOrNull()->GetIntrinsic();
+               (instruction_->AsInvoke()->GetIntrinsic() == Intrinsics::kJdkUnsafeGetObjectAcquire))
+            << instruction_->AsInvoke()->GetIntrinsic();
         DCHECK_EQ(offset_, 0U);
         DCHECK(index_.IsRegisterPair());
         // UnsafeGet's offset location is a register pair, the low
@@ -1846,8 +1836,7 @@
   }
 
   if (block->IsEntryBlock() && (previous != nullptr) && previous->IsSuspendCheck()) {
-    // TODO: Remove "OrNull".
-    GenerateSuspendCheck(previous->AsSuspendCheckOrNull(), nullptr);
+    GenerateSuspendCheck(previous->AsSuspendCheck(), nullptr);
   }
   if (!codegen_->GoesToNextBlock(got->GetBlock(), successor)) {
     __ jmp(codegen_->GetLabelOf(successor));
@@ -1941,8 +1930,7 @@
   }
 
   if (right.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int64_t value = right.GetConstant()->AsLongConstantOrNull()->GetValue();
+    int64_t value = right.GetConstant()->AsLongConstant()->GetValue();
     int32_t val_high = High32Bits(value);
     int32_t val_low = Low32Bits(value);
 
@@ -2002,8 +1990,7 @@
       DCHECK(const_area->IsEmittedAtUseSite());
       __ ucomisd(lhs.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralDoubleAddress(
-                     // TODO: Remove "OrNull".
-                     const_area->GetConstant()->AsDoubleConstantOrNull()->GetValue(),
+                     const_area->GetConstant()->AsDoubleConstant()->GetValue(),
                      const_area->GetBaseMethodAddress(),
                      const_area->GetLocations()->InAt(0).AsRegister<Register>()));
     } else {
@@ -2017,8 +2004,7 @@
       DCHECK(const_area->IsEmittedAtUseSite());
       __ ucomiss(lhs.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralFloatAddress(
-                     // TODO: Remove "OrNull".
-                     const_area->GetConstant()->AsFloatConstantOrNull()->GetValue(),
+                     const_area->GetConstant()->AsFloatConstant()->GetValue(),
                      const_area->GetBaseMethodAddress(),
                      const_area->GetLocations()->InAt(0).AsRegister<Register>()));
     } else {
@@ -2090,14 +2076,12 @@
     return;
   } else if (cond->IsIntConstant()) {
     // Constant condition, statically compared against "true" (integer value 1).
-    // TODO: Remove "OrNull".
-    if (cond->AsIntConstantOrNull()->IsTrue()) {
+    if (cond->AsIntConstant()->IsTrue()) {
       if (true_target != nullptr) {
         __ jmp(true_target);
       }
     } else {
-      // TODO: Remove "OrNull".
-      DCHECK(cond->AsIntConstantOrNull()->IsFalse()) << cond->AsIntConstantOrNull()->GetValue();
+      DCHECK(cond->AsIntConstant()->IsFalse()) << cond->AsIntConstant()->GetValue();
       if (false_target != nullptr) {
         __ jmp(false_target);
       }
@@ -2116,11 +2100,9 @@
   if (IsBooleanValueOrMaterializedCondition(cond)) {
     if (AreEflagsSetFrom(cond, instruction)) {
       if (true_target == nullptr) {
-        // TODO: Remove "OrNull".
-        __ j(X86Condition(cond->AsConditionOrNull()->GetOppositeCondition()), false_target);
+        __ j(X86Condition(cond->AsCondition()->GetOppositeCondition()), false_target);
       } else {
-        // TODO: Remove "OrNull".
-        __ j(X86Condition(cond->AsConditionOrNull()->GetCondition()), true_target);
+        __ j(X86Condition(cond->AsCondition()->GetCondition()), true_target);
       }
     } else {
       // Materialized condition, compare against 0.
@@ -2139,8 +2121,7 @@
   } else {
     // Condition has not been materialized, use its inputs as the comparison and
     // its condition as the branch condition.
-    // TODO: Remove "OrNull".
-    HCondition* condition = cond->AsConditionOrNull();
+    HCondition* condition = cond->AsCondition();
 
     // If this is a long or FP comparison that has been folded into
     // the HCondition, generate the comparison directly.
@@ -2273,8 +2254,7 @@
 
     // Figure out how to test the 'condition'.
     if (select_condition->IsCondition()) {
-      // TODO: Remove "OrNull".
-      HCondition* condition = select_condition->AsConditionOrNull();
+      HCondition* condition = select_condition->AsCondition();
       if (!condition->IsEmittedAtUseSite()) {
         // This was a previously materialized condition.
         // Can we use the existing condition code?
@@ -3172,8 +3152,7 @@
             __ movzxb(out.AsRegister<Register>(), in.AsRegister<ByteRegister>());
           } else {
             DCHECK(in.GetConstant()->IsIntConstant());
-            // TODO: Remove "OrNull".
-            int32_t value = in.GetConstant()->AsIntConstantOrNull()->GetValue();
+            int32_t value = in.GetConstant()->AsIntConstant()->GetValue();
             __ movl(out.AsRegister<Register>(), Immediate(static_cast<uint8_t>(value)));
           }
           break;
@@ -3182,8 +3161,7 @@
             __ movzxb(out.AsRegister<Register>(), in.AsRegisterPairLow<ByteRegister>());
           } else {
             DCHECK(in.GetConstant()->IsLongConstant());
-            // TODO: Remove "OrNull".
-            int64_t value = in.GetConstant()->AsLongConstantOrNull()->GetValue();
+            int64_t value = in.GetConstant()->AsLongConstant()->GetValue();
             __ movl(out.AsRegister<Register>(), Immediate(static_cast<uint8_t>(value)));
           }
           break;
@@ -3204,8 +3182,7 @@
             __ movsxb(out.AsRegister<Register>(), in.AsRegister<ByteRegister>());
           } else {
             DCHECK(in.GetConstant()->IsIntConstant());
-            // TODO: Remove "OrNull".
-            int32_t value = in.GetConstant()->AsIntConstantOrNull()->GetValue();
+            int32_t value = in.GetConstant()->AsIntConstant()->GetValue();
             __ movl(out.AsRegister<Register>(), Immediate(static_cast<int8_t>(value)));
           }
           break;
@@ -3214,8 +3191,7 @@
             __ movsxb(out.AsRegister<Register>(), in.AsRegisterPairLow<ByteRegister>());
           } else {
             DCHECK(in.GetConstant()->IsLongConstant());
-            // TODO: Remove "OrNull".
-            int64_t value = in.GetConstant()->AsLongConstantOrNull()->GetValue();
+            int64_t value = in.GetConstant()->AsLongConstant()->GetValue();
             __ movl(out.AsRegister<Register>(), Immediate(static_cast<int8_t>(value)));
           }
           break;
@@ -3237,8 +3213,7 @@
             __ movzxw(out.AsRegister<Register>(), Address(ESP, in.GetStackIndex()));
           } else {
             DCHECK(in.GetConstant()->IsIntConstant());
-            // TODO: Remove "OrNull".
-            int32_t value = in.GetConstant()->AsIntConstantOrNull()->GetValue();
+            int32_t value = in.GetConstant()->AsIntConstant()->GetValue();
             __ movl(out.AsRegister<Register>(), Immediate(static_cast<uint16_t>(value)));
           }
           break;
@@ -3249,8 +3224,7 @@
             __ movzxw(out.AsRegister<Register>(), Address(ESP, in.GetStackIndex()));
           } else {
             DCHECK(in.GetConstant()->IsLongConstant());
-            // TODO: Remove "OrNull".
-            int64_t value = in.GetConstant()->AsLongConstantOrNull()->GetValue();
+            int64_t value = in.GetConstant()->AsLongConstant()->GetValue();
             __ movl(out.AsRegister<Register>(), Immediate(static_cast<uint16_t>(value)));
           }
           break;
@@ -3271,8 +3245,7 @@
             __ movsxw(out.AsRegister<Register>(), Address(ESP, in.GetStackIndex()));
           } else {
             DCHECK(in.GetConstant()->IsIntConstant());
-            // TODO: Remove "OrNull".
-            int32_t value = in.GetConstant()->AsIntConstantOrNull()->GetValue();
+            int32_t value = in.GetConstant()->AsIntConstant()->GetValue();
             __ movl(out.AsRegister<Register>(), Immediate(static_cast<int16_t>(value)));
           }
           break;
@@ -3283,8 +3256,7 @@
             __ movsxw(out.AsRegister<Register>(), Address(ESP, in.GetStackIndex()));
           } else {
             DCHECK(in.GetConstant()->IsLongConstant());
-            // TODO: Remove "OrNull".
-            int64_t value = in.GetConstant()->AsLongConstantOrNull()->GetValue();
+            int64_t value = in.GetConstant()->AsLongConstant()->GetValue();
             __ movl(out.AsRegister<Register>(), Immediate(static_cast<int16_t>(value)));
           }
           break;
@@ -3305,8 +3277,7 @@
           } else {
             DCHECK(in.IsConstant());
             DCHECK(in.GetConstant()->IsLongConstant());
-            // TODO: Remove "OrNull".
-            int64_t value = in.GetConstant()->AsLongConstantOrNull()->GetValue();
+            int64_t value = in.GetConstant()->AsLongConstant()->GetValue();
             __ movl(out.AsRegister<Register>(), Immediate(static_cast<int32_t>(value)));
           }
           break;
@@ -3557,8 +3528,7 @@
               first.AsRegister<Register>(), second.AsRegister<Register>(), TIMES_1, 0));
           }
       } else if (second.IsConstant()) {
-        // TODO: Remove "OrNull".
-        int32_t value = second.GetConstant()->AsIntConstantOrNull()->GetValue();
+        int32_t value = second.GetConstant()->AsIntConstant()->GetValue();
         if (out.AsRegister<Register>() == first.AsRegister<Register>()) {
           __ addl(out.AsRegister<Register>(), Immediate(value));
         } else {
@@ -3581,8 +3551,7 @@
                 Address(ESP, second.GetHighStackIndex(kX86WordSize)));
       } else {
         DCHECK(second.IsConstant()) << second;
-        // TODO: Remove "OrNull".
-        int64_t value = second.GetConstant()->AsLongConstantOrNull()->GetValue();
+        int64_t value = second.GetConstant()->AsLongConstant()->GetValue();
         __ addl(first.AsRegisterPairLow<Register>(), Immediate(Low32Bits(value)));
         __ adcl(first.AsRegisterPairHigh<Register>(), Immediate(High32Bits(value)));
       }
@@ -3593,13 +3562,11 @@
       if (second.IsFpuRegister()) {
         __ addss(first.AsFpuRegister<XmmRegister>(), second.AsFpuRegister<XmmRegister>());
       } else if (add->InputAt(1)->IsX86LoadFromConstantTable()) {
-        // TODO: Remove "OrNull".
-        HX86LoadFromConstantTable* const_area = add->InputAt(1)->AsX86LoadFromConstantTableOrNull();
+        HX86LoadFromConstantTable* const_area = add->InputAt(1)->AsX86LoadFromConstantTable();
         DCHECK(const_area->IsEmittedAtUseSite());
         __ addss(first.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralFloatAddress(
-                     // TODO: Remove "OrNull".
-                     const_area->GetConstant()->AsFloatConstantOrNull()->GetValue(),
+                     const_area->GetConstant()->AsFloatConstant()->GetValue(),
                      const_area->GetBaseMethodAddress(),
                      const_area->GetLocations()->InAt(0).AsRegister<Register>()));
       } else {
@@ -3613,13 +3580,11 @@
       if (second.IsFpuRegister()) {
         __ addsd(first.AsFpuRegister<XmmRegister>(), second.AsFpuRegister<XmmRegister>());
       } else if (add->InputAt(1)->IsX86LoadFromConstantTable()) {
-        // TODO: Remove "OrNull".
-        HX86LoadFromConstantTable* const_area = add->InputAt(1)->AsX86LoadFromConstantTableOrNull();
+        HX86LoadFromConstantTable* const_area = add->InputAt(1)->AsX86LoadFromConstantTable();
         DCHECK(const_area->IsEmittedAtUseSite());
         __ addsd(first.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralDoubleAddress(
-                     // TODO: Remove "OrNull".
-                     const_area->GetConstant()->AsDoubleConstantOrNull()->GetValue(),
+                     const_area->GetConstant()->AsDoubleConstant()->GetValue(),
                      const_area->GetBaseMethodAddress(),
                      const_area->GetLocations()->InAt(0).AsRegister<Register>()));
       } else {
@@ -3675,8 +3640,7 @@
         __ subl(first.AsRegister<Register>(), second.AsRegister<Register>());
       } else if (second.IsConstant()) {
         __ subl(first.AsRegister<Register>(),
-                // TODO: Remove "OrNull".
-                Immediate(second.GetConstant()->AsIntConstantOrNull()->GetValue()));
+                Immediate(second.GetConstant()->AsIntConstant()->GetValue()));
       } else {
         __ subl(first.AsRegister<Register>(), Address(ESP, second.GetStackIndex()));
       }
@@ -3693,8 +3657,7 @@
                 Address(ESP, second.GetHighStackIndex(kX86WordSize)));
       } else {
         DCHECK(second.IsConstant()) << second;
-        // TODO: Remove "OrNull".
-        int64_t value = second.GetConstant()->AsLongConstantOrNull()->GetValue();
+        int64_t value = second.GetConstant()->AsLongConstant()->GetValue();
         __ subl(first.AsRegisterPairLow<Register>(), Immediate(Low32Bits(value)));
         __ sbbl(first.AsRegisterPairHigh<Register>(), Immediate(High32Bits(value)));
       }
@@ -3705,13 +3668,11 @@
       if (second.IsFpuRegister()) {
         __ subss(first.AsFpuRegister<XmmRegister>(), second.AsFpuRegister<XmmRegister>());
       } else if (sub->InputAt(1)->IsX86LoadFromConstantTable()) {
-        // TODO: Remove "OrNull".
-        HX86LoadFromConstantTable* const_area = sub->InputAt(1)->AsX86LoadFromConstantTableOrNull();
+        HX86LoadFromConstantTable* const_area = sub->InputAt(1)->AsX86LoadFromConstantTable();
         DCHECK(const_area->IsEmittedAtUseSite());
         __ subss(first.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralFloatAddress(
-                     // TODO: Remove "OrNull".
-                     const_area->GetConstant()->AsFloatConstantOrNull()->GetValue(),
+                     const_area->GetConstant()->AsFloatConstant()->GetValue(),
                      const_area->GetBaseMethodAddress(),
                      const_area->GetLocations()->InAt(0).AsRegister<Register>()));
       } else {
@@ -3725,13 +3686,11 @@
       if (second.IsFpuRegister()) {
         __ subsd(first.AsFpuRegister<XmmRegister>(), second.AsFpuRegister<XmmRegister>());
       } else if (sub->InputAt(1)->IsX86LoadFromConstantTable()) {
-        // TODO: Remove "OrNull".
-        HX86LoadFromConstantTable* const_area = sub->InputAt(1)->AsX86LoadFromConstantTableOrNull();
+        HX86LoadFromConstantTable* const_area = sub->InputAt(1)->AsX86LoadFromConstantTable();
         DCHECK(const_area->IsEmittedAtUseSite());
         __ subsd(first.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralDoubleAddress(
-                     // TODO: Remove "OrNull".
-                     const_area->GetConstant()->AsDoubleConstantOrNull()->GetValue(),
+                     const_area->GetConstant()->AsDoubleConstant()->GetValue(),
                      const_area->GetBaseMethodAddress(),
                      const_area->GetLocations()->InAt(0).AsRegister<Register>()));
       } else {
@@ -3799,8 +3758,7 @@
       // The constant may have ended up in a register, so test explicitly to avoid
       // problems where the output may not be the same as the first operand.
       if (mul->InputAt(1)->IsIntConstant()) {
-        // TODO: Remove "OrNull".
-        Immediate imm(mul->InputAt(1)->AsIntConstantOrNull()->GetValue());
+        Immediate imm(mul->InputAt(1)->AsIntConstant()->GetValue());
         __ imull(out.AsRegister<Register>(), first.AsRegister<Register>(), imm);
       } else if (second.IsRegister()) {
         DCHECK(first.Equals(out));
@@ -3829,8 +3787,7 @@
       if (second.IsConstant()) {
         DCHECK(second.GetConstant()->IsLongConstant());
 
-        // TODO: Remove "OrNull".
-        int64_t value = second.GetConstant()->AsLongConstantOrNull()->GetValue();
+        int64_t value = second.GetConstant()->AsLongConstant()->GetValue();
         int32_t low_value = Low32Bits(value);
         int32_t high_value = High32Bits(value);
         Immediate low(low_value);
@@ -3900,13 +3857,11 @@
       if (second.IsFpuRegister()) {
         __ mulss(first.AsFpuRegister<XmmRegister>(), second.AsFpuRegister<XmmRegister>());
       } else if (mul->InputAt(1)->IsX86LoadFromConstantTable()) {
-        // TODO: Remove "OrNull".
-        HX86LoadFromConstantTable* const_area = mul->InputAt(1)->AsX86LoadFromConstantTableOrNull();
+        HX86LoadFromConstantTable* const_area = mul->InputAt(1)->AsX86LoadFromConstantTable();
         DCHECK(const_area->IsEmittedAtUseSite());
         __ mulss(first.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralFloatAddress(
-                     // TODO: Remove "OrNull".
-                     const_area->GetConstant()->AsFloatConstantOrNull()->GetValue(),
+                     const_area->GetConstant()->AsFloatConstant()->GetValue(),
                      const_area->GetBaseMethodAddress(),
                      const_area->GetLocations()->InAt(0).AsRegister<Register>()));
       } else {
@@ -3921,13 +3876,11 @@
       if (second.IsFpuRegister()) {
         __ mulsd(first.AsFpuRegister<XmmRegister>(), second.AsFpuRegister<XmmRegister>());
       } else if (mul->InputAt(1)->IsX86LoadFromConstantTable()) {
-        // TODO: Remove "OrNull".
-        HX86LoadFromConstantTable* const_area = mul->InputAt(1)->AsX86LoadFromConstantTableOrNull();
+        HX86LoadFromConstantTable* const_area = mul->InputAt(1)->AsX86LoadFromConstantTable();
         DCHECK(const_area->IsEmittedAtUseSite());
         __ mulsd(first.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralDoubleAddress(
-                     // TODO: Remove "OrNull".
-                     const_area->GetConstant()->AsDoubleConstantOrNull()->GetValue(),
+                     const_area->GetConstant()->AsDoubleConstant()->GetValue(),
                      const_area->GetBaseMethodAddress(),
                      const_area->GetLocations()->InAt(0).AsRegister<Register>()));
       } else {
@@ -4047,8 +4000,7 @@
 
   Register out_register = locations->Out().AsRegister<Register>();
   Register input_register = locations->InAt(0).AsRegister<Register>();
-  // TODO: Remove "OrNull".
-  int32_t imm = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t imm = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
 
   DCHECK(imm == 1 || imm == -1);
 
@@ -4089,8 +4041,7 @@
 
   Register out_register = locations->Out().AsRegister<Register>();
   Register input_register = locations->InAt(0).AsRegister<Register>();
-  // TODO: Remove "OrNull".
-  int32_t imm = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int32_t imm = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
   DCHECK(IsPowerOfTwo(AbsOrMin(imm)));
   uint32_t abs_imm = static_cast<uint32_t>(AbsOrMin(imm));
 
@@ -4113,8 +4064,7 @@
   DCHECK(instruction->IsDiv() || instruction->IsRem());
 
   LocationSummary* locations = instruction->GetLocations();
-  // TODO: Remove "OrNull".
-  int imm = locations->InAt(1).GetConstant()->AsIntConstantOrNull()->GetValue();
+  int imm = locations->InAt(1).GetConstant()->AsIntConstant()->GetValue();
 
   Register eax = locations->InAt(0).AsRegister<Register>();
   Register out = locations->Out().AsRegister<Register>();
@@ -4192,8 +4142,7 @@
       DCHECK_EQ(is_div ? EAX : EDX, out.AsRegister<Register>());
 
       if (second.IsConstant()) {
-        // TODO: Remove "OrNull".
-        int32_t imm = second.GetConstant()->AsIntConstantOrNull()->GetValue();
+        int32_t imm = second.GetConstant()->AsIntConstant()->GetValue();
 
         if (imm == 0) {
           // Do not generate anything for 0. DivZeroCheck would forbid any generated code.
@@ -4201,11 +4150,9 @@
           DivRemOneOrMinusOne(instruction);
         } else if (IsPowerOfTwo(AbsOrMin(imm))) {
           if (is_div) {
-            // TODO: Remove "OrNull".
-            DivByPowerOfTwo(instruction->AsDivOrNull());
+            DivByPowerOfTwo(instruction->AsDiv());
           } else {
-            // TODO: Remove "OrNull".
-            RemByPowerOfTwo(instruction->AsRemOrNull());
+            RemByPowerOfTwo(instruction->AsRem());
           }
         } else {
           DCHECK(imm <= -2 || imm >= 2);
@@ -4323,13 +4270,11 @@
       if (second.IsFpuRegister()) {
         __ divss(first.AsFpuRegister<XmmRegister>(), second.AsFpuRegister<XmmRegister>());
       } else if (div->InputAt(1)->IsX86LoadFromConstantTable()) {
-        // TODO: Remove "OrNull".
-        HX86LoadFromConstantTable* const_area = div->InputAt(1)->AsX86LoadFromConstantTableOrNull();
+        HX86LoadFromConstantTable* const_area = div->InputAt(1)->AsX86LoadFromConstantTable();
         DCHECK(const_area->IsEmittedAtUseSite());
         __ divss(first.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralFloatAddress(
-                   // TODO: Remove "OrNull".
-                   const_area->GetConstant()->AsFloatConstantOrNull()->GetValue(),
+                   const_area->GetConstant()->AsFloatConstant()->GetValue(),
                    const_area->GetBaseMethodAddress(),
                    const_area->GetLocations()->InAt(0).AsRegister<Register>()));
       } else {
@@ -4343,13 +4288,11 @@
       if (second.IsFpuRegister()) {
         __ divsd(first.AsFpuRegister<XmmRegister>(), second.AsFpuRegister<XmmRegister>());
       } else if (div->InputAt(1)->IsX86LoadFromConstantTable()) {
-        // TODO: Remove "OrNull".
-        HX86LoadFromConstantTable* const_area = div->InputAt(1)->AsX86LoadFromConstantTableOrNull();
+        HX86LoadFromConstantTable* const_area = div->InputAt(1)->AsX86LoadFromConstantTable();
         DCHECK(const_area->IsEmittedAtUseSite());
         __ divsd(first.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralDoubleAddress(
-                     // TODO: Remove "OrNull".
-                     const_area->GetConstant()->AsDoubleConstantOrNull()->GetValue(),
+                     const_area->GetConstant()->AsDoubleConstant()->GetValue(),
                      const_area->GetBaseMethodAddress(),
                      const_area->GetLocations()->InAt(0).AsRegister<Register>()));
       } else {
@@ -4769,8 +4712,7 @@
         __ j(kEqual, slow_path->GetEntryLabel());
       } else {
         DCHECK(value.IsConstant()) << value;
-        // TODO: Remove "OrNull".
-        if (value.GetConstant()->AsIntConstantOrNull()->GetValue() == 0) {
+        if (value.GetConstant()->AsIntConstant()->GetValue() == 0) {
           __ jmp(slow_path->GetEntryLabel());
         }
       }
@@ -4784,8 +4726,7 @@
         __ j(kEqual, slow_path->GetEntryLabel());
       } else {
         DCHECK(value.IsConstant()) << value;
-        // TODO: Remove "OrNull".
-        if (value.GetConstant()->AsLongConstantOrNull()->GetValue() == 0) {
+        if (value.GetConstant()->AsLongConstant()->GetValue() == 0) {
           __ jmp(slow_path->GetEntryLabel());
         }
       }
@@ -4840,9 +4781,7 @@
           __ shrl(first_reg, second_reg);
         }
       } else {
-        // TODO: Remove "OrNull".
-        int32_t shift =
-            second.GetConstant()->AsIntConstantOrNull()->GetValue() & kMaxIntShiftDistance;
+        int32_t shift = second.GetConstant()->AsIntConstant()->GetValue() & kMaxIntShiftDistance;
         if (shift == 0) {
           return;
         }
@@ -4870,9 +4809,7 @@
         }
       } else {
         // Shift by a constant.
-        // TODO: Remove "OrNull".
-        int32_t shift =
-            second.GetConstant()->AsIntConstantOrNull()->GetValue() & kMaxLongShiftDistance;
+        int32_t shift = second.GetConstant()->AsIntConstant()->GetValue() & kMaxLongShiftDistance;
         // Nothing to do if the shift is 0, as the input is already the output.
         if (shift != 0) {
           if (op->IsShl()) {
@@ -5029,9 +4966,7 @@
       Register second_reg = second.AsRegister<Register>();
       __ rorl(first_reg, second_reg);
     } else {
-      // TODO: Remove "OrNull".
-      Immediate imm(
-          second.GetConstant()->AsIntConstantOrNull()->GetValue() & kMaxIntShiftDistance);
+      Immediate imm(second.GetConstant()->AsIntConstant()->GetValue() & kMaxIntShiftDistance);
       __ rorl(first_reg, imm);
     }
     return;
@@ -5052,9 +4987,7 @@
     __ cmovl(kNotEqual, first_reg_hi, first_reg_lo);
     __ cmovl(kNotEqual, first_reg_lo, temp_reg);
   } else {
-    // TODO: Remove "OrNull".
-    int32_t shift_amt =
-        second.GetConstant()->AsIntConstantOrNull()->GetValue() & kMaxLongShiftDistance;
+    int32_t shift_amt = second.GetConstant()->AsIntConstant()->GetValue() & kMaxLongShiftDistance;
     if (shift_amt == 0) {
       // Already fine.
       return;
@@ -5297,8 +5230,7 @@
       if (right.IsConstant()) {
         DCHECK(right.GetConstant()->IsLongConstant());
         right_is_const = true;
-        // TODO: Remove "OrNull".
-        int64_t val = right.GetConstant()->AsLongConstantOrNull()->GetValue();
+        int64_t val = right.GetConstant()->AsLongConstant()->GetValue();
         val_low = Low32Bits(val);
         val_high = High32Bits(val);
       }
@@ -5399,13 +5331,11 @@
 
 Register CodeGeneratorX86::GetInvokeExtraParameter(HInvoke* invoke, Register temp) {
   if (invoke->IsInvokeStaticOrDirect()) {
-    // TODO: Remove "OrNull".
-    return GetInvokeStaticOrDirectExtraParameter(invoke->AsInvokeStaticOrDirectOrNull(), temp);
+    return GetInvokeStaticOrDirectExtraParameter(invoke->AsInvokeStaticOrDirect(), temp);
   }
   DCHECK(invoke->IsInvokeInterface());
-  // TODO: Remove "OrNull".
   Location location =
-      invoke->GetLocations()->InAt(invoke->AsInvokeInterfaceOrNull()->GetSpecialInputIndex());
+      invoke->GetLocations()->InAt(invoke->AsInvokeInterface()->GetSpecialInputIndex());
   return location.AsRegister<Register>();
 }
 
@@ -5445,15 +5375,13 @@
       break;
     }
     case MethodLoadKind::kBootImageRelRo: {
-      // TODO: Remove "OrNull".
       size_t index = invoke->IsInvokeInterface()
-          ? invoke->AsInvokeInterfaceOrNull()->GetSpecialInputIndex()
-          : invoke->AsInvokeStaticOrDirectOrNull()->GetSpecialInputIndex();
+          ? invoke->AsInvokeInterface()->GetSpecialInputIndex()
+          : invoke->AsInvokeStaticOrDirect()->GetSpecialInputIndex();
       Register base_reg = GetInvokeExtraParameter(invoke, temp.AsRegister<Register>());
       __ movl(temp.AsRegister<Register>(), Address(base_reg, kPlaceholder32BitOffset));
       RecordBootImageRelRoPatch(
-          // TODO: Remove "OrNull".
-          invoke->InputAt(index)->AsX86ComputeBaseMethodAddressOrNull(),
+          invoke->InputAt(index)->AsX86ComputeBaseMethodAddress(),
           GetBootImageOffset(invoke));
       break;
     }
@@ -5634,13 +5562,11 @@
 }
 
 void CodeGeneratorX86::RecordBootImageMethodPatch(HInvoke* invoke) {
-  // TODO: Remove "OrNull".
   size_t index = invoke->IsInvokeInterface()
-      ? invoke->AsInvokeInterfaceOrNull()->GetSpecialInputIndex()
-      : invoke->AsInvokeStaticOrDirectOrNull()->GetSpecialInputIndex();
-  // TODO: Remove "OrNull".
+      ? invoke->AsInvokeInterface()->GetSpecialInputIndex()
+      : invoke->AsInvokeStaticOrDirect()->GetSpecialInputIndex();
   HX86ComputeBaseMethodAddress* method_address =
-      invoke->InputAt(index)->AsX86ComputeBaseMethodAddressOrNull();
+      invoke->InputAt(index)->AsX86ComputeBaseMethodAddress();
   boot_image_method_patches_.emplace_back(
       method_address,
       invoke->GetResolvedMethodReference().dex_file,
@@ -5649,17 +5575,15 @@
 }
 
 void CodeGeneratorX86::RecordMethodBssEntryPatch(HInvoke* invoke) {
-  // TODO: Remove "OrNull".
   size_t index = invoke->IsInvokeInterface()
-      ? invoke->AsInvokeInterfaceOrNull()->GetSpecialInputIndex()
-      : invoke->AsInvokeStaticOrDirectOrNull()->GetSpecialInputIndex();
+      ? invoke->AsInvokeInterface()->GetSpecialInputIndex()
+      : invoke->AsInvokeStaticOrDirect()->GetSpecialInputIndex();
   DCHECK(IsSameDexFile(GetGraph()->GetDexFile(), *invoke->GetMethodReference().dex_file) ||
          GetCompilerOptions().WithinOatFile(invoke->GetMethodReference().dex_file) ||
          ContainsElement(Runtime::Current()->GetClassLinker()->GetBootClassPath(),
                          invoke->GetMethodReference().dex_file));
-  // TODO: Remove "OrNull".
   HX86ComputeBaseMethodAddress* method_address =
-      invoke->InputAt(index)->AsX86ComputeBaseMethodAddressOrNull();
+      invoke->InputAt(index)->AsX86ComputeBaseMethodAddress();
   // Add the patch entry and bind its label at the end of the instruction.
   method_bss_entry_patches_.emplace_back(
       method_address,
@@ -5669,18 +5593,16 @@
 }
 
 void CodeGeneratorX86::RecordBootImageTypePatch(HLoadClass* load_class) {
-  // TODO: Remove "OrNull".
   HX86ComputeBaseMethodAddress* method_address =
-      load_class->InputAt(0)->AsX86ComputeBaseMethodAddressOrNull();
+      load_class->InputAt(0)->AsX86ComputeBaseMethodAddress();
   boot_image_type_patches_.emplace_back(
       method_address, &load_class->GetDexFile(), load_class->GetTypeIndex().index_);
   __ Bind(&boot_image_type_patches_.back().label);
 }
 
 Label* CodeGeneratorX86::NewTypeBssEntryPatch(HLoadClass* load_class) {
-  // TODO: Remove "OrNull".
   HX86ComputeBaseMethodAddress* method_address =
-      load_class->InputAt(0)->AsX86ComputeBaseMethodAddressOrNull();
+      load_class->InputAt(0)->AsX86ComputeBaseMethodAddress();
   ArenaDeque<X86PcRelativePatchInfo>* patches = nullptr;
   switch (load_class->GetLoadKind()) {
     case HLoadClass::LoadKind::kBssEntry:
@@ -5702,27 +5624,24 @@
 }
 
 void CodeGeneratorX86::RecordBootImageStringPatch(HLoadString* load_string) {
-  // TODO: Remove "OrNull".
   HX86ComputeBaseMethodAddress* method_address =
-      load_string->InputAt(0)->AsX86ComputeBaseMethodAddressOrNull();
+      load_string->InputAt(0)->AsX86ComputeBaseMethodAddress();
   boot_image_string_patches_.emplace_back(
       method_address, &load_string->GetDexFile(), load_string->GetStringIndex().index_);
   __ Bind(&boot_image_string_patches_.back().label);
 }
 
 Label* CodeGeneratorX86::NewStringBssEntryPatch(HLoadString* load_string) {
-  // TODO: Remove "OrNull".
   HX86ComputeBaseMethodAddress* method_address =
-      load_string->InputAt(0)->AsX86ComputeBaseMethodAddressOrNull();
+      load_string->InputAt(0)->AsX86ComputeBaseMethodAddress();
   string_bss_entry_patches_.emplace_back(
       method_address, &load_string->GetDexFile(), load_string->GetStringIndex().index_);
   return &string_bss_entry_patches_.back().label;
 }
 
 void CodeGeneratorX86::RecordBootImageJniEntrypointPatch(HInvokeStaticOrDirect* invoke) {
-  // TODO: Remove "OrNull".
   HX86ComputeBaseMethodAddress* method_address =
-      invoke->InputAt(invoke->GetSpecialInputIndex())->AsX86ComputeBaseMethodAddressOrNull();
+      invoke->InputAt(invoke->GetSpecialInputIndex())->AsX86ComputeBaseMethodAddress();
   boot_image_jni_entrypoint_patches_.emplace_back(
       method_address,
       invoke->GetResolvedMethodReference().dex_file,
@@ -5734,18 +5653,16 @@
                                             uint32_t boot_image_reference,
                                             HInvokeStaticOrDirect* invoke) {
   if (GetCompilerOptions().IsBootImage()) {
-    // TODO: Remove "OrNull".
     HX86ComputeBaseMethodAddress* method_address =
-        invoke->InputAt(invoke->GetSpecialInputIndex())->AsX86ComputeBaseMethodAddressOrNull();
+        invoke->InputAt(invoke->GetSpecialInputIndex())->AsX86ComputeBaseMethodAddress();
     DCHECK(method_address != nullptr);
     Register method_address_reg =
         invoke->GetLocations()->InAt(invoke->GetSpecialInputIndex()).AsRegister<Register>();
     __ leal(reg, Address(method_address_reg, CodeGeneratorX86::kPlaceholder32BitOffset));
     RecordBootImageIntrinsicPatch(method_address, boot_image_reference);
   } else if (GetCompilerOptions().GetCompilePic()) {
-    // TODO: Remove "OrNull".
     HX86ComputeBaseMethodAddress* method_address =
-        invoke->InputAt(invoke->GetSpecialInputIndex())->AsX86ComputeBaseMethodAddressOrNull();
+        invoke->InputAt(invoke->GetSpecialInputIndex())->AsX86ComputeBaseMethodAddress();
     DCHECK(method_address != nullptr);
     Register method_address_reg =
         invoke->GetLocations()->InAt(invoke->GetSpecialInputIndex()).AsRegister<Register>();
@@ -5764,9 +5681,8 @@
   DCHECK_NE(invoke->GetIntrinsic(), Intrinsics::kNone);
   if (GetCompilerOptions().IsBootImage()) {
     // Load the class the same way as for HLoadClass::LoadKind::kBootImageLinkTimePcRelative.
-    // TODO: Remove "OrNull".
     HX86ComputeBaseMethodAddress* method_address =
-        invoke->InputAt(invoke->GetSpecialInputIndex())->AsX86ComputeBaseMethodAddressOrNull();
+        invoke->InputAt(invoke->GetSpecialInputIndex())->AsX86ComputeBaseMethodAddress();
     DCHECK(method_address != nullptr);
     Register method_address_reg =
         invoke->GetLocations()->InAt(invoke->GetSpecialInputIndex()).AsRegister<Register>();
@@ -6185,9 +6101,7 @@
   DataType::Type field_type = field_info.GetFieldType();
   uint32_t offset = field_info.GetFieldOffset().Uint32Value();
   bool is_predicated =
-      instruction->IsInstanceFieldSet() &&
-      // TODO: Remove "OrNull".
-      instruction->AsInstanceFieldSetOrNull()->GetIsPredicatedSet();
+      instruction->IsInstanceFieldSet() && instruction->AsInstanceFieldSet()->GetIsPredicatedSet();
 
   Address field_addr(base, offset);
 
@@ -6441,9 +6355,8 @@
       // Baker's using a slow path (and also unpoison the loaded
       // reference, if heap poisoning is enabled).
       if (index.IsConstant()) {
-        // TODO: Remove "OrNull".
         uint32_t offset =
-            (index.GetConstant()->AsIntConstantOrNull()->GetValue() << TIMES_4) + data_offset;
+            (index.GetConstant()->AsIntConstant()->GetValue() << TIMES_4) + data_offset;
         codegen_->MaybeGenerateReadBarrierSlow(instruction, out_loc, out_loc, obj_loc, offset);
       } else {
         codegen_->MaybeGenerateReadBarrierSlow(
@@ -6682,8 +6595,7 @@
                 value.AsRegisterPairHigh<Register>());
       } else {
         DCHECK(value.IsConstant());
-        // TODO: Remove "OrNull".
-        int64_t val = value.GetConstant()->AsLongConstantOrNull()->GetValue();
+        int64_t val = value.GetConstant()->AsLongConstant()->GetValue();
         __ movl(CodeGeneratorX86::ArrayAddress(array, index, TIMES_8, data_offset),
                 Immediate(Low32Bits(val)));
         codegen_->MaybeRecordImplicitNullCheck(instruction);
@@ -6700,9 +6612,7 @@
         __ movss(address, value.AsFpuRegister<XmmRegister>());
       } else {
         DCHECK(value.IsConstant());
-        // TODO: Remove "OrNull".
-        int32_t v =
-            bit_cast<int32_t, float>(value.GetConstant()->AsFloatConstantOrNull()->GetValue());
+        int32_t v = bit_cast<int32_t, float>(value.GetConstant()->AsFloatConstant()->GetValue());
         __ movl(address, Immediate(v));
       }
       codegen_->MaybeRecordImplicitNullCheck(instruction);
@@ -6718,9 +6628,7 @@
         DCHECK(value.IsConstant());
         Address address_hi =
             CodeGeneratorX86::ArrayAddress(array, index, TIMES_8, offset + kX86WordSize);
-        // TODO: Remove "OrNull".
-        int64_t v =
-            bit_cast<int64_t, double>(value.GetConstant()->AsDoubleConstantOrNull()->GetValue());
+        int64_t v = bit_cast<int64_t, double>(value.GetConstant()->AsDoubleConstant()->GetValue());
         __ movl(address, Immediate(Low32Bits(v)));
         codegen_->MaybeRecordImplicitNullCheck(instruction);
         __ movl(address_hi, Immediate(High32Bits(v)));
@@ -6812,9 +6720,7 @@
     if (array_length->IsEmittedAtUseSite()) {
       // Address the length field in the array.
       DCHECK(array_length->IsArrayLength());
-      // TODO: Remove "OrNull".
-      uint32_t len_offset =
-          CodeGenerator::GetArrayLengthOffset(array_length->AsArrayLengthOrNull());
+      uint32_t len_offset = CodeGenerator::GetArrayLengthOffset(array_length->AsArrayLength());
       Location array_loc = array_length->GetLocations()->InAt(0);
       Address array_len(array_loc.AsRegister<Register>(), len_offset);
       if (is_string_compressed_char_at) {
@@ -6851,8 +6757,7 @@
 void InstructionCodeGeneratorX86::VisitParallelMove(HParallelMove* instruction) {
   if (instruction->GetNext()->IsSuspendCheck() &&
       instruction->GetBlock()->GetLoopInformation() != nullptr) {
-    // TODO: Remove "OrNull".
-    HSuspendCheck* suspend_check = instruction->GetNext()->AsSuspendCheckOrNull();
+    HSuspendCheck* suspend_check = instruction->GetNext()->AsSuspendCheck();
     // The back edge will generate the suspend check.
     codegen_->ClearSpillSlotsFromLoopPhisInStackMap(suspend_check, instruction);
   }
@@ -7031,8 +6936,7 @@
         __ movl(Address(ESP, destination.GetStackIndex()), Immediate(value));
       }
     } else if (constant->IsFloatConstant()) {
-      // TODO: Remove "OrNull".
-      float fp_value = constant->AsFloatConstantOrNull()->GetValue();
+      float fp_value = constant->AsFloatConstant()->GetValue();
       int32_t value = bit_cast<int32_t, float>(fp_value);
       Immediate imm(value);
       if (destination.IsFpuRegister()) {
@@ -7052,8 +6956,7 @@
         __ movl(Address(ESP, destination.GetStackIndex()), imm);
       }
     } else if (constant->IsLongConstant()) {
-      // TODO: Remove "OrNull".
-      int64_t value = constant->AsLongConstantOrNull()->GetValue();
+      int64_t value = constant->AsLongConstant()->GetValue();
       int32_t low_value = Low32Bits(value);
       int32_t high_value = High32Bits(value);
       Immediate low(low_value);
@@ -7067,8 +6970,7 @@
       }
     } else {
       DCHECK(constant->IsDoubleConstant());
-      // TODO: Remove "OrNull".
-      double dbl_value = constant->AsDoubleConstantOrNull()->GetValue();
+      double dbl_value = constant->AsDoubleConstant()->GetValue();
       int64_t value = bit_cast<int64_t, double>(dbl_value);
       int32_t low_value = Low32Bits(value);
       int32_t high_value = High32Bits(value);
@@ -7342,8 +7244,7 @@
       DCHECK(!codegen_->GetCompilerOptions().IsBootImage());
       Register method_address = locations->InAt(0).AsRegister<Register>();
       __ movl(out, Address(method_address, CodeGeneratorX86::kPlaceholder32BitOffset));
-      // TODO: Remove "OrNull".
-      codegen_->RecordBootImageRelRoPatch(cls->InputAt(0)->AsX86ComputeBaseMethodAddressOrNull(),
+      codegen_->RecordBootImageRelRoPatch(cls->InputAt(0)->AsX86ComputeBaseMethodAddress(),
                                           CodeGenerator::GetBootImageOffset(cls));
       break;
     }
@@ -7536,8 +7437,7 @@
       DCHECK(!codegen_->GetCompilerOptions().IsBootImage());
       Register method_address = locations->InAt(0).AsRegister<Register>();
       __ movl(out, Address(method_address, CodeGeneratorX86::kPlaceholder32BitOffset));
-      // TODO: Remove "OrNull".
-      codegen_->RecordBootImageRelRoPatch(load->InputAt(0)->AsX86ComputeBaseMethodAddressOrNull(),
+      codegen_->RecordBootImageRelRoPatch(load->InputAt(0)->AsX86ComputeBaseMethodAddress(),
                                           CodeGenerator::GetBootImageOffset(load));
       return;
     }
@@ -8293,17 +8193,14 @@
     } else if (second.IsConstant()) {
       if (instruction->IsAnd()) {
         __ andl(first.AsRegister<Register>(),
-                // TODO: Remove "OrNull".
-                Immediate(second.GetConstant()->AsIntConstantOrNull()->GetValue()));
+                Immediate(second.GetConstant()->AsIntConstant()->GetValue()));
       } else if (instruction->IsOr()) {
         __ orl(first.AsRegister<Register>(),
-               // TODO: Remove "OrNull".
-               Immediate(second.GetConstant()->AsIntConstantOrNull()->GetValue()));
+               Immediate(second.GetConstant()->AsIntConstant()->GetValue()));
       } else {
         DCHECK(instruction->IsXor());
         __ xorl(first.AsRegister<Register>(),
-                // TODO: Remove "OrNull".
-                Immediate(second.GetConstant()->AsIntConstantOrNull()->GetValue()));
+                Immediate(second.GetConstant()->AsIntConstant()->GetValue()));
       }
     } else {
       if (instruction->IsAnd()) {
@@ -8346,8 +8243,7 @@
       }
     } else {
       DCHECK(second.IsConstant()) << second;
-      // TODO: Remove "OrNull".
-      int64_t value = second.GetConstant()->AsLongConstantOrNull()->GetValue();
+      int64_t value = second.GetConstant()->AsLongConstant()->GetValue();
       int32_t low_value = Low32Bits(value);
       int32_t high_value = High32Bits(value);
       Immediate low(low_value);
@@ -8887,17 +8783,13 @@
     case DataType::Type::kFloat32:
       __ movss(out.AsFpuRegister<XmmRegister>(),
                codegen_->LiteralFloatAddress(
-                   // TODO: Remove "OrNull".
-                   value->AsFloatConstantOrNull()->GetValue(),
-                   insn->GetBaseMethodAddress(),
-                   const_area));
+                   value->AsFloatConstant()->GetValue(), insn->GetBaseMethodAddress(), const_area));
       break;
 
     case DataType::Type::kFloat64:
       __ movsd(out.AsFpuRegister<XmmRegister>(),
                codegen_->LiteralDoubleAddress(
-                   // TODO: Remove "OrNull".
-                   value->AsDoubleConstantOrNull()->GetValue(),
+                   value->AsDoubleConstant()->GetValue(),
                    insn->GetBaseMethodAddress(),
                    const_area));
       break;
@@ -8905,10 +8797,7 @@
     case DataType::Type::kInt32:
       __ movl(out.AsRegister<Register>(),
               codegen_->LiteralInt32Address(
-                  // TODO: Remove "OrNull".
-                  value->AsIntConstantOrNull()->GetValue(),
-                  insn->GetBaseMethodAddress(),
-                  const_area));
+                  value->AsIntConstant()->GetValue(), insn->GetBaseMethodAddress(), const_area));
       break;
 
     default:
@@ -9083,9 +8972,7 @@
                                        ScaleFactor scale,
                                        uint32_t data_offset) {
   return index.IsConstant()
-      ? Address(obj,
-                // TODO: Remove "OrNull".
-                (index.GetConstant()->AsIntConstantOrNull()->GetValue() << scale) + data_offset)
+      ? Address(obj, (index.GetConstant()->AsIntConstant()->GetValue() << scale) + data_offset)
       : Address(obj, index.AsRegister<Register>(), scale, data_offset);
 }
 
diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc
index 1170cd9..df2bef7 100644
--- a/compiler/optimizing/code_generator_x86_64.cc
+++ b/compiler/optimizing/code_generator_x86_64.cc
@@ -215,8 +215,7 @@
     // Are we using an array length from memory?
     if (!length_loc.IsValid()) {
       DCHECK(instruction_->InputAt(1)->IsArrayLength());
-      // TODO: Remove "OrNull".
-      HArrayLength* array_length = instruction_->InputAt(1)->AsArrayLengthOrNull();
+      HArrayLength* array_length = instruction_->InputAt(1)->AsArrayLength();
       DCHECK(array_length->IsEmittedAtUseSite());
       uint32_t len_offset = CodeGenerator::GetArrayLengthOffset(array_length);
       Location array_loc = array_length->GetLocations()->InAt(0);
@@ -252,8 +251,7 @@
           DataType::Type::kInt32);
     }
 
-    // TODO: Remove "OrNull".
-    QuickEntrypointEnum entrypoint = instruction_->AsBoundsCheckOrNull()->IsStringCharAt()
+    QuickEntrypointEnum entrypoint = instruction_->AsBoundsCheck()->IsStringCharAt()
         ? kQuickThrowStringBounds
         : kQuickThrowArrayBounds;
     x86_64_codegen->InvokeRuntime(entrypoint, instruction_, instruction_->GetDexPc(), this);
@@ -345,8 +343,7 @@
     __ Bind(GetEntryLabel());
     SaveLiveRegisters(codegen, locations);
 
-    // TODO: Remove "OrNull".
-    const dex::StringIndex string_index = instruction_->AsLoadStringOrNull()->GetStringIndex();
+    const dex::StringIndex string_index = instruction_->AsLoadString()->GetStringIndex();
     // Custom calling convention: RAX serves as both input and output.
     __ movl(CpuRegister(RAX), Immediate(string_index.index_));
     x86_64_codegen->InvokeRuntime(kQuickResolveString,
@@ -382,8 +379,7 @@
 
     if (kPoisonHeapReferences &&
         instruction_->IsCheckCast() &&
-        // TODO: Remove "OrNull".
-        instruction_->AsCheckCastOrNull()->GetTypeCheckKind() == TypeCheckKind::kInterfaceCheck) {
+        instruction_->AsCheckCast()->GetTypeCheckKind() == TypeCheckKind::kInterfaceCheck) {
       // First, unpoison the `cls` reference that was poisoned for direct memory comparison.
       __ UnpoisonHeapReference(locations->InAt(1).AsRegister<CpuRegister>());
     }
@@ -443,8 +439,7 @@
     InvokeRuntimeCallingConvention calling_convention;
     x86_64_codegen->Load32BitValue(
         CpuRegister(calling_convention.GetRegisterAt(0)),
-        // TODO: Remove "OrNull".
-        static_cast<uint32_t>(instruction_->AsDeoptimizeOrNull()->GetDeoptimizationKind()));
+        static_cast<uint32_t>(instruction_->AsDeoptimize()->GetDeoptimizationKind()));
     x86_64_codegen->InvokeRuntime(kQuickDeoptimize, instruction_, instruction_->GetDexPc(), this);
     CheckEntrypointTypes<kQuickDeoptimize, void, DeoptimizationKind>();
   }
@@ -622,8 +617,7 @@
     DCHECK((instruction_->IsInvoke() && instruction_->GetLocations()->Intrinsified()))
         << "Unexpected instruction in read barrier marking and field updating slow path: "
         << instruction_->DebugName();
-    // TODO: Remove "OrNull".
-    HInvoke* invoke = instruction_->AsInvokeOrNull();
+    HInvoke* invoke = instruction_->AsInvoke();
     DCHECK(IsUnsafeCASObject(invoke) || IsVarHandleCASFamily(invoke)) << invoke->GetIntrinsic();
 
     __ Bind(GetEntryLabel());
@@ -859,17 +853,13 @@
         // to an object field within an object.
         DCHECK(instruction_->IsInvoke()) << instruction_->DebugName();
         DCHECK(instruction_->GetLocations()->Intrinsified());
-        // TODO: Remove "OrNull".
-        DCHECK((instruction_->AsInvokeOrNull()->GetIntrinsic() == Intrinsics::kUnsafeGetObject) ||
-               (instruction_->AsInvokeOrNull()->GetIntrinsic() ==
-                    Intrinsics::kUnsafeGetObjectVolatile) ||
-               (instruction_->AsInvokeOrNull()->GetIntrinsic() ==
-                    Intrinsics::kJdkUnsafeGetObject) ||
-               (instruction_->AsInvokeOrNull()->GetIntrinsic() ==
+        DCHECK((instruction_->AsInvoke()->GetIntrinsic() == Intrinsics::kUnsafeGetObject) ||
+               (instruction_->AsInvoke()->GetIntrinsic() == Intrinsics::kUnsafeGetObjectVolatile) ||
+               (instruction_->AsInvoke()->GetIntrinsic() == Intrinsics::kJdkUnsafeGetObject) ||
+               (instruction_->AsInvoke()->GetIntrinsic() ==
                     Intrinsics::kJdkUnsafeGetObjectVolatile) ||
-               (instruction_->AsInvokeOrNull()->GetIntrinsic() ==
-                    Intrinsics::kJdkUnsafeGetObjectAcquire))
-            << instruction_->AsInvokeOrNull()->GetIntrinsic();
+               (instruction_->AsInvoke()->GetIntrinsic() == Intrinsics::kJdkUnsafeGetObjectAcquire))
+            << instruction_->AsInvoke()->GetIntrinsic();
         DCHECK_EQ(offset_, 0U);
         DCHECK(index_.IsRegister());
       }
@@ -1850,8 +1840,7 @@
     } else if (source.IsConstant()) {
       HConstant* constant = source.GetConstant();
       if (constant->IsLongConstant()) {
-        // TODO: Remove "OrNull".
-        Load64BitValue(dest, constant->AsLongConstantOrNull()->GetValue());
+        Load64BitValue(dest, constant->AsLongConstant()->GetValue());
       } else if (constant->IsDoubleConstant()) {
         Load64BitValue(dest, GetInt64ValueOf(constant));
       } else {
@@ -1991,8 +1980,7 @@
   }
 
   if (block->IsEntryBlock() && (previous != nullptr) && previous->IsSuspendCheck()) {
-    // TODO: Remove "OrNull".
-    GenerateSuspendCheck(previous->AsSuspendCheckOrNull(), nullptr);
+    GenerateSuspendCheck(previous->AsSuspendCheck(), nullptr);
   }
   if (!codegen_->GoesToNextBlock(got->GetBlock(), successor)) {
     __ jmp(codegen_->GetLabelOf(successor));
@@ -2064,8 +2052,7 @@
       } else if (right.IsConstant()) {
         __ ucomiss(left.AsFpuRegister<XmmRegister>(),
                    codegen_->LiteralFloatAddress(
-                       // TODO: Remove "OrNull".
-                       right.GetConstant()->AsFloatConstantOrNull()->GetValue()));
+                       right.GetConstant()->AsFloatConstant()->GetValue()));
       } else {
         DCHECK(right.IsStackSlot());
         __ ucomiss(left.AsFpuRegister<XmmRegister>(),
@@ -2079,8 +2066,7 @@
       } else if (right.IsConstant()) {
         __ ucomisd(left.AsFpuRegister<XmmRegister>(),
                    codegen_->LiteralDoubleAddress(
-                       // TODO: Remove "OrNull".
-                       right.GetConstant()->AsDoubleConstantOrNull()->GetValue()));
+                       right.GetConstant()->AsDoubleConstant()->GetValue()));
       } else {
         DCHECK(right.IsDoubleStackSlot());
         __ ucomisd(left.AsFpuRegister<XmmRegister>(),
@@ -2155,14 +2141,12 @@
     return;
   } else if (cond->IsIntConstant()) {
     // Constant condition, statically compared against "true" (integer value 1).
-    // TODO: Remove "OrNull".
-    if (cond->AsIntConstantOrNull()->IsTrue()) {
+    if (cond->AsIntConstant()->IsTrue()) {
       if (true_target != nullptr) {
         __ jmp(true_target);
       }
     } else {
-      // TODO: Remove "OrNull".
-      DCHECK(cond->AsIntConstantOrNull()->IsFalse()) << cond->AsIntConstantOrNull()->GetValue();
+      DCHECK(cond->AsIntConstant()->IsFalse()) << cond->AsIntConstant()->GetValue();
       if (false_target != nullptr) {
         __ jmp(false_target);
       }
@@ -2181,12 +2165,9 @@
   if (IsBooleanValueOrMaterializedCondition(cond)) {
     if (AreEflagsSetFrom(cond, instruction)) {
       if (true_target == nullptr) {
-        // TODO: Remove "OrNull".
-        __ j(X86_64IntegerCondition(cond->AsConditionOrNull()->GetOppositeCondition()),
-             false_target);
+        __ j(X86_64IntegerCondition(cond->AsCondition()->GetOppositeCondition()), false_target);
       } else {
-        // TODO: Remove "OrNull".
-        __ j(X86_64IntegerCondition(cond->AsConditionOrNull()->GetCondition()), true_target);
+        __ j(X86_64IntegerCondition(cond->AsCondition()->GetCondition()), true_target);
       }
     } else {
       // Materialized condition, compare against 0.
@@ -2205,8 +2186,7 @@
   } else {
     // Condition has not been materialized, use its inputs as the
     // comparison and its condition as the branch condition.
-    // TODO: Remove "OrNull".
-    HCondition* condition = cond->AsConditionOrNull();
+    HCondition* condition = cond->AsCondition();
 
     // If this is a long or FP comparison that has been folded into
     // the HCondition, generate the comparison directly.
@@ -2335,8 +2315,7 @@
 
     // Figure out how to test the 'condition'.
     if (select_condition->IsCondition()) {
-      // TODO: Remove "OrNull".
-      HCondition* condition = select_condition->AsConditionOrNull();
+      HCondition* condition = select_condition->AsCondition();
       if (!condition->IsEmittedAtUseSite()) {
         // This was a previously materialized condition.
         // Can we use the existing condition code?
@@ -2456,8 +2435,7 @@
     case DataType::Type::kFloat32: {
       XmmRegister lhs_reg = lhs.AsFpuRegister<XmmRegister>();
       if (rhs.IsConstant()) {
-        // TODO: Remove "OrNull".
-        float value = rhs.GetConstant()->AsFloatConstantOrNull()->GetValue();
+        float value = rhs.GetConstant()->AsFloatConstant()->GetValue();
         __ ucomiss(lhs_reg, codegen_->LiteralFloatAddress(value));
       } else if (rhs.IsStackSlot()) {
         __ ucomiss(lhs_reg, Address(CpuRegister(RSP), rhs.GetStackIndex()));
@@ -2470,8 +2448,7 @@
     case DataType::Type::kFloat64: {
       XmmRegister lhs_reg = lhs.AsFpuRegister<XmmRegister>();
       if (rhs.IsConstant()) {
-        // TODO: Remove "OrNull".
-        double value = rhs.GetConstant()->AsDoubleConstantOrNull()->GetValue();
+        double value = rhs.GetConstant()->AsDoubleConstant()->GetValue();
         __ ucomisd(lhs_reg, codegen_->LiteralDoubleAddress(value));
       } else if (rhs.IsDoubleStackSlot()) {
         __ ucomisd(lhs_reg, Address(CpuRegister(RSP), rhs.GetStackIndex()));
@@ -2632,8 +2609,7 @@
     case DataType::Type::kFloat32: {
       XmmRegister left_reg = left.AsFpuRegister<XmmRegister>();
       if (right.IsConstant()) {
-        // TODO: Remove "OrNull".
-        float value = right.GetConstant()->AsFloatConstantOrNull()->GetValue();
+        float value = right.GetConstant()->AsFloatConstant()->GetValue();
         __ ucomiss(left_reg, codegen_->LiteralFloatAddress(value));
       } else if (right.IsStackSlot()) {
         __ ucomiss(left_reg, Address(CpuRegister(RSP), right.GetStackIndex()));
@@ -2647,8 +2623,7 @@
     case DataType::Type::kFloat64: {
       XmmRegister left_reg = left.AsFpuRegister<XmmRegister>();
       if (right.IsConstant()) {
-        // TODO: Remove "OrNull".
-        double value = right.GetConstant()->AsDoubleConstantOrNull()->GetValue();
+        double value = right.GetConstant()->AsDoubleConstant()->GetValue();
         __ ucomisd(left_reg, codegen_->LiteralDoubleAddress(value));
       } else if (right.IsDoubleStackSlot()) {
         __ ucomisd(left_reg, Address(CpuRegister(RSP), right.GetStackIndex()));
@@ -3436,8 +3411,7 @@
           } else {
             DCHECK(in.IsConstant());
             DCHECK(in.GetConstant()->IsLongConstant());
-            // TODO: Remove "OrNull".
-            int64_t value = in.GetConstant()->AsLongConstantOrNull()->GetValue();
+            int64_t value = in.GetConstant()->AsLongConstant()->GetValue();
             __ movl(out.AsRegister<CpuRegister>(), Immediate(static_cast<int32_t>(value)));
           }
           break;
@@ -3563,8 +3537,7 @@
           if (in.IsRegister()) {
             __ cvtsi2ss(out.AsFpuRegister<XmmRegister>(), in.AsRegister<CpuRegister>(), false);
           } else if (in.IsConstant()) {
-            // TODO: Remove "OrNull".
-            int32_t v = in.GetConstant()->AsIntConstantOrNull()->GetValue();
+            int32_t v = in.GetConstant()->AsIntConstant()->GetValue();
             XmmRegister dest = out.AsFpuRegister<XmmRegister>();
             codegen_->Load32BitValue(dest, static_cast<float>(v));
           } else {
@@ -3577,8 +3550,7 @@
           if (in.IsRegister()) {
             __ cvtsi2ss(out.AsFpuRegister<XmmRegister>(), in.AsRegister<CpuRegister>(), true);
           } else if (in.IsConstant()) {
-            // TODO: Remove "OrNull".
-            int64_t v = in.GetConstant()->AsLongConstantOrNull()->GetValue();
+            int64_t v = in.GetConstant()->AsLongConstant()->GetValue();
             XmmRegister dest = out.AsFpuRegister<XmmRegister>();
             codegen_->Load32BitValue(dest, static_cast<float>(v));
           } else {
@@ -3591,8 +3563,7 @@
           if (in.IsFpuRegister()) {
             __ cvtsd2ss(out.AsFpuRegister<XmmRegister>(), in.AsFpuRegister<XmmRegister>());
           } else if (in.IsConstant()) {
-            // TODO: Remove "OrNull".
-            double v = in.GetConstant()->AsDoubleConstantOrNull()->GetValue();
+            double v = in.GetConstant()->AsDoubleConstant()->GetValue();
             XmmRegister dest = out.AsFpuRegister<XmmRegister>();
             codegen_->Load32BitValue(dest, static_cast<float>(v));
           } else {
@@ -3618,8 +3589,7 @@
           if (in.IsRegister()) {
             __ cvtsi2sd(out.AsFpuRegister<XmmRegister>(), in.AsRegister<CpuRegister>(), false);
           } else if (in.IsConstant()) {
-            // TODO: Remove "OrNull".
-            int32_t v = in.GetConstant()->AsIntConstantOrNull()->GetValue();
+            int32_t v = in.GetConstant()->AsIntConstant()->GetValue();
             XmmRegister dest = out.AsFpuRegister<XmmRegister>();
             codegen_->Load64BitValue(dest, static_cast<double>(v));
           } else {
@@ -3632,8 +3602,7 @@
           if (in.IsRegister()) {
             __ cvtsi2sd(out.AsFpuRegister<XmmRegister>(), in.AsRegister<CpuRegister>(), true);
           } else if (in.IsConstant()) {
-            // TODO: Remove "OrNull".
-            int64_t v = in.GetConstant()->AsLongConstantOrNull()->GetValue();
+            int64_t v = in.GetConstant()->AsLongConstant()->GetValue();
             XmmRegister dest = out.AsFpuRegister<XmmRegister>();
             codegen_->Load64BitValue(dest, static_cast<double>(v));
           } else {
@@ -3646,8 +3615,7 @@
           if (in.IsFpuRegister()) {
             __ cvtss2sd(out.AsFpuRegister<XmmRegister>(), in.AsFpuRegister<XmmRegister>());
           } else if (in.IsConstant()) {
-            // TODO: Remove "OrNull".
-            float v = in.GetConstant()->AsFloatConstantOrNull()->GetValue();
+            float v = in.GetConstant()->AsFloatConstant()->GetValue();
             XmmRegister dest = out.AsFpuRegister<XmmRegister>();
             codegen_->Load64BitValue(dest, static_cast<double>(v));
           } else {
@@ -3720,13 +3688,10 @@
       } else if (second.IsConstant()) {
         if (out.AsRegister<Register>() == first.AsRegister<Register>()) {
           __ addl(out.AsRegister<CpuRegister>(),
-                  // TODO: Remove "OrNull".
-                  Immediate(second.GetConstant()->AsIntConstantOrNull()->GetValue()));
+                  Immediate(second.GetConstant()->AsIntConstant()->GetValue()));
         } else {
           __ leal(out.AsRegister<CpuRegister>(), Address(
-              first.AsRegister<CpuRegister>(),
-              // TODO: Remove "OrNull".
-              second.GetConstant()->AsIntConstantOrNull()->GetValue()));
+              first.AsRegister<CpuRegister>(), second.GetConstant()->AsIntConstant()->GetValue()));
         }
       } else {
         DCHECK(first.Equals(locations->Out()));
@@ -3747,8 +3712,7 @@
         }
       } else {
         DCHECK(second.IsConstant());
-        // TODO: Remove "OrNull".
-        int64_t value = second.GetConstant()->AsLongConstantOrNull()->GetValue();
+        int64_t value = second.GetConstant()->AsLongConstant()->GetValue();
         int32_t int32_value = Low32Bits(value);
         DCHECK_EQ(int32_value, value);
         if (out.AsRegister<Register>() == first.AsRegister<Register>()) {
@@ -3767,8 +3731,7 @@
       } else if (second.IsConstant()) {
         __ addss(first.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralFloatAddress(
-                     // TODO: Remove "OrNull".
-                     second.GetConstant()->AsFloatConstantOrNull()->GetValue()));
+                     second.GetConstant()->AsFloatConstant()->GetValue()));
       } else {
         DCHECK(second.IsStackSlot());
         __ addss(first.AsFpuRegister<XmmRegister>(),
@@ -3783,8 +3746,7 @@
       } else if (second.IsConstant()) {
         __ addsd(first.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralDoubleAddress(
-                     // TODO: Remove "OrNull".
-                     second.GetConstant()->AsDoubleConstantOrNull()->GetValue()));
+                     second.GetConstant()->AsDoubleConstant()->GetValue()));
       } else {
         DCHECK(second.IsDoubleStackSlot());
         __ addsd(first.AsFpuRegister<XmmRegister>(),
@@ -3836,8 +3798,7 @@
       if (second.IsRegister()) {
         __ subl(first.AsRegister<CpuRegister>(), second.AsRegister<CpuRegister>());
       } else if (second.IsConstant()) {
-        // TODO: Remove "OrNull".
-        Immediate imm(second.GetConstant()->AsIntConstantOrNull()->GetValue());
+        Immediate imm(second.GetConstant()->AsIntConstant()->GetValue());
         __ subl(first.AsRegister<CpuRegister>(), imm);
       } else {
         __ subl(first.AsRegister<CpuRegister>(), Address(CpuRegister(RSP), second.GetStackIndex()));
@@ -3846,8 +3807,7 @@
     }
     case DataType::Type::kInt64: {
       if (second.IsConstant()) {
-        // TODO: Remove "OrNull".
-        int64_t value = second.GetConstant()->AsLongConstantOrNull()->GetValue();
+        int64_t value = second.GetConstant()->AsLongConstant()->GetValue();
         DCHECK(IsInt<32>(value));
         __ subq(first.AsRegister<CpuRegister>(), Immediate(static_cast<int32_t>(value)));
       } else {
@@ -3862,8 +3822,7 @@
       } else if (second.IsConstant()) {
         __ subss(first.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralFloatAddress(
-                     // TODO: Remove "OrNull".
-                     second.GetConstant()->AsFloatConstantOrNull()->GetValue()));
+                     second.GetConstant()->AsFloatConstant()->GetValue()));
       } else {
         DCHECK(second.IsStackSlot());
         __ subss(first.AsFpuRegister<XmmRegister>(),
@@ -3878,8 +3837,7 @@
       } else if (second.IsConstant()) {
         __ subsd(first.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralDoubleAddress(
-                     // TODO: Remove "OrNull".
-                     second.GetConstant()->AsDoubleConstantOrNull()->GetValue()));
+                     second.GetConstant()->AsDoubleConstant()->GetValue()));
       } else {
         DCHECK(second.IsDoubleStackSlot());
         __ subsd(first.AsFpuRegister<XmmRegister>(),
@@ -3912,8 +3870,7 @@
       locations->SetInAt(0, Location::RequiresRegister());
       locations->SetInAt(1, Location::Any());
       if (mul->InputAt(1)->IsLongConstant() &&
-          // TODO: Remove "OrNull".
-          IsInt<32>(mul->InputAt(1)->AsLongConstantOrNull()->GetValue())) {
+          IsInt<32>(mul->InputAt(1)->AsLongConstant()->GetValue())) {
         // Can use 3 operand multiply.
         locations->SetOut(Location::RequiresRegister(), Location::kNoOutputOverlap);
       } else {
@@ -3944,8 +3901,7 @@
       // The constant may have ended up in a register, so test explicitly to avoid
       // problems where the output may not be the same as the first operand.
       if (mul->InputAt(1)->IsIntConstant()) {
-        // TODO: Remove "OrNull".
-        Immediate imm(mul->InputAt(1)->AsIntConstantOrNull()->GetValue());
+        Immediate imm(mul->InputAt(1)->AsIntConstant()->GetValue());
         __ imull(out.AsRegister<CpuRegister>(), first.AsRegister<CpuRegister>(), imm);
       } else if (second.IsRegister()) {
         DCHECK(first.Equals(out));
@@ -3961,8 +3917,7 @@
       // The constant may have ended up in a register, so test explicitly to avoid
       // problems where the output may not be the same as the first operand.
       if (mul->InputAt(1)->IsLongConstant()) {
-        // TODO: Remove "OrNull".
-        int64_t value = mul->InputAt(1)->AsLongConstantOrNull()->GetValue();
+        int64_t value = mul->InputAt(1)->AsLongConstant()->GetValue();
         if (IsInt<32>(value)) {
           __ imulq(out.AsRegister<CpuRegister>(), first.AsRegister<CpuRegister>(),
                    Immediate(static_cast<int32_t>(value)));
@@ -3990,8 +3945,7 @@
       } else if (second.IsConstant()) {
         __ mulss(first.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralFloatAddress(
-                     // TODO: Remove "OrNull".
-                     second.GetConstant()->AsFloatConstantOrNull()->GetValue()));
+                     second.GetConstant()->AsFloatConstant()->GetValue()));
       } else {
         DCHECK(second.IsStackSlot());
         __ mulss(first.AsFpuRegister<XmmRegister>(),
@@ -4007,8 +3961,7 @@
       } else if (second.IsConstant()) {
         __ mulsd(first.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralDoubleAddress(
-                     // TODO: Remove "OrNull".
-                     second.GetConstant()->AsDoubleConstantOrNull()->GetValue()));
+                     second.GetConstant()->AsDoubleConstant()->GetValue()));
       } else {
         DCHECK(second.IsDoubleStackSlot());
         __ mulsd(first.AsFpuRegister<XmmRegister>(),
@@ -4256,8 +4209,7 @@
 
   // TODO: can these branches be written as one?
   if (instruction->GetResultType() == DataType::Type::kInt32) {
-    // TODO: Remove "OrNull".
-    int imm = second.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int imm = second.GetConstant()->AsIntConstant()->GetValue();
 
     CalculateMagicAndShiftForDivRem(imm, false /* is_long= */, &magic, &shift);
 
@@ -4289,8 +4241,7 @@
       __ movl(eax, edx);
     }
   } else {
-    // TODO: Remove "OrNull".
-    int64_t imm = second.GetConstant()->AsLongConstantOrNull()->GetValue();
+    int64_t imm = second.GetConstant()->AsLongConstant()->GetValue();
 
     DCHECK_EQ(instruction->GetResultType(), DataType::Type::kInt64);
 
@@ -4366,11 +4317,9 @@
       DivRemOneOrMinusOne(instruction);
     } else if (IsPowerOfTwo(AbsOrMin(imm))) {
       if (is_div) {
-        // TODO: Remove "OrNull".
-        DivByPowerOfTwo(instruction->AsDivOrNull());
+        DivByPowerOfTwo(instruction->AsDiv());
       } else {
-        // TODO: Remove "OrNull".
-        RemByPowerOfTwo(instruction->AsRemOrNull());
+        RemByPowerOfTwo(instruction->AsRem());
       }
     } else {
       DCHECK(imm <= -2 || imm >= 2);
@@ -4458,8 +4407,7 @@
       } else if (second.IsConstant()) {
         __ divss(first.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralFloatAddress(
-                     // TODO: Remove "OrNull".
-                     second.GetConstant()->AsFloatConstantOrNull()->GetValue()));
+                     second.GetConstant()->AsFloatConstant()->GetValue()));
       } else {
         DCHECK(second.IsStackSlot());
         __ divss(first.AsFpuRegister<XmmRegister>(),
@@ -4474,8 +4422,7 @@
       } else if (second.IsConstant()) {
         __ divsd(first.AsFpuRegister<XmmRegister>(),
                  codegen_->LiteralDoubleAddress(
-                     // TODO: Remove "OrNull".
-                     second.GetConstant()->AsDoubleConstantOrNull()->GetValue()));
+                     second.GetConstant()->AsDoubleConstant()->GetValue()));
       } else {
         DCHECK(second.IsDoubleStackSlot());
         __ divsd(first.AsFpuRegister<XmmRegister>(),
@@ -4805,8 +4752,7 @@
         __ j(kEqual, slow_path->GetEntryLabel());
       } else {
         DCHECK(value.IsConstant()) << value;
-        // TODO: Remove "OrNull".
-        if (value.GetConstant()->AsIntConstantOrNull()->GetValue() == 0) {
+        if (value.GetConstant()->AsIntConstant()->GetValue() == 0) {
           __ jmp(slow_path->GetEntryLabel());
         }
       }
@@ -4821,8 +4767,7 @@
         __ j(kEqual, slow_path->GetEntryLabel());
       } else {
         DCHECK(value.IsConstant()) << value;
-        // TODO: Remove "OrNull".
-        if (value.GetConstant()->AsLongConstantOrNull()->GetValue() == 0) {
+        if (value.GetConstant()->AsLongConstant()->GetValue() == 0) {
           __ jmp(slow_path->GetEntryLabel());
         }
       }
@@ -4872,9 +4817,7 @@
           __ shrl(first_reg, second_reg);
         }
       } else {
-        // TODO: Remove "OrNull".
-        Immediate imm(
-            second.GetConstant()->AsIntConstantOrNull()->GetValue() & kMaxIntShiftDistance);
+        Immediate imm(second.GetConstant()->AsIntConstant()->GetValue() & kMaxIntShiftDistance);
         if (op->IsShl()) {
           __ shll(first_reg, imm);
         } else if (op->IsShr()) {
@@ -4896,9 +4839,7 @@
           __ shrq(first_reg, second_reg);
         }
       } else {
-        // TODO: Remove "OrNull".
-        Immediate imm(
-            second.GetConstant()->AsIntConstantOrNull()->GetValue() & kMaxLongShiftDistance);
+        Immediate imm(second.GetConstant()->AsIntConstant()->GetValue() & kMaxLongShiftDistance);
         if (op->IsShl()) {
           __ shlq(first_reg, imm);
         } else if (op->IsShr()) {
@@ -4945,9 +4886,7 @@
         CpuRegister second_reg = second.AsRegister<CpuRegister>();
         __ rorl(first_reg, second_reg);
       } else {
-        // TODO: Remove "OrNull".
-        Immediate imm(
-            second.GetConstant()->AsIntConstantOrNull()->GetValue() & kMaxIntShiftDistance);
+        Immediate imm(second.GetConstant()->AsIntConstant()->GetValue() & kMaxIntShiftDistance);
         __ rorl(first_reg, imm);
       }
       break;
@@ -4956,9 +4895,7 @@
         CpuRegister second_reg = second.AsRegister<CpuRegister>();
         __ rorq(first_reg, second_reg);
       } else {
-        // TODO: Remove "OrNull".
-        Immediate imm(
-            second.GetConstant()->AsIntConstantOrNull()->GetValue() & kMaxLongShiftDistance);
+        Immediate imm(second.GetConstant()->AsIntConstant()->GetValue() & kMaxLongShiftDistance);
         __ rorq(first_reg, imm);
       }
       break;
@@ -5478,9 +5415,7 @@
   DataType::Type field_type = field_info.GetFieldType();
   uint32_t offset = field_info.GetFieldOffset().Uint32Value();
   bool is_predicated =
-      instruction->IsInstanceFieldSet() &&
-      // TODO: Remove "OrNull".
-      instruction->AsInstanceFieldSetOrNull()->GetIsPredicatedSet();
+      instruction->IsInstanceFieldSet() && instruction->AsInstanceFieldSet()->GetIsPredicatedSet();
 
   NearLabel pred_is_null;
   if (is_predicated) {
@@ -5732,9 +5667,8 @@
       // Baker's using a slow path (and also unpoison the loaded
       // reference, if heap poisoning is enabled).
       if (index.IsConstant()) {
-        // TODO: Remove "OrNull".
         uint32_t offset =
-            (index.GetConstant()->AsIntConstantOrNull()->GetValue() << TIMES_4) + data_offset;
+            (index.GetConstant()->AsIntConstant()->GetValue() << TIMES_4) + data_offset;
         codegen_->MaybeGenerateReadBarrierSlow(instruction, out_loc, out_loc, obj_loc, offset);
       } else {
         codegen_->MaybeGenerateReadBarrierSlow(
@@ -5968,8 +5902,7 @@
         __ movq(address, value.AsRegister<CpuRegister>());
         codegen_->MaybeRecordImplicitNullCheck(instruction);
       } else {
-        // TODO: Remove "OrNull".
-        int64_t v = value.GetConstant()->AsLongConstantOrNull()->GetValue();
+        int64_t v = value.GetConstant()->AsLongConstant()->GetValue();
         Address address_high =
             CodeGeneratorX86_64::ArrayAddress(array, index, TIMES_8, offset + sizeof(int32_t));
         codegen_->MoveInt64ToAddress(address, address_high, v, instruction);
@@ -5984,9 +5917,7 @@
         __ movss(address, value.AsFpuRegister<XmmRegister>());
       } else {
         DCHECK(value.IsConstant());
-        // TODO: Remove "OrNull".
-        int32_t v =
-            bit_cast<int32_t, float>(value.GetConstant()->AsFloatConstantOrNull()->GetValue());
+        int32_t v = bit_cast<int32_t, float>(value.GetConstant()->AsFloatConstant()->GetValue());
         __ movl(address, Immediate(v));
       }
       codegen_->MaybeRecordImplicitNullCheck(instruction);
@@ -6000,9 +5931,7 @@
         __ movsd(address, value.AsFpuRegister<XmmRegister>());
         codegen_->MaybeRecordImplicitNullCheck(instruction);
       } else {
-        // TODO: Remove "OrNull".
-        int64_t v =
-            bit_cast<int64_t, double>(value.GetConstant()->AsDoubleConstantOrNull()->GetValue());
+        int64_t v = bit_cast<int64_t, double>(value.GetConstant()->AsDoubleConstant()->GetValue());
         Address address_high =
             CodeGeneratorX86_64::ArrayAddress(array, index, TIMES_8, offset + sizeof(int32_t));
         codegen_->MoveInt64ToAddress(address, address_high, v, instruction);
@@ -6089,9 +6018,7 @@
     if (array_length->IsEmittedAtUseSite()) {
       // Address the length field in the array.
       DCHECK(array_length->IsArrayLength());
-      // TODO: Remove "OrNull".
-      uint32_t len_offset =
-          CodeGenerator::GetArrayLengthOffset(array_length->AsArrayLengthOrNull());
+      uint32_t len_offset = CodeGenerator::GetArrayLengthOffset(array_length->AsArrayLength());
       Location array_loc = array_length->GetLocations()->InAt(0);
       Address array_len(array_loc.AsRegister<CpuRegister>(), len_offset);
       if (mirror::kUseStringCompression && instruction->IsStringCharAt()) {
@@ -6164,8 +6091,7 @@
 void InstructionCodeGeneratorX86_64::VisitParallelMove(HParallelMove* instruction) {
   if (instruction->GetNext()->IsSuspendCheck() &&
       instruction->GetBlock()->GetLoopInformation() != nullptr) {
-    // TODO: Remove "OrNull".
-    HSuspendCheck* suspend_check = instruction->GetNext()->AsSuspendCheckOrNull();
+    HSuspendCheck* suspend_check = instruction->GetNext()->AsSuspendCheck();
     // The back edge will generate the suspend check.
     codegen_->ClearSpillSlotsFromLoopPhisInStackMap(suspend_check, instruction);
   }
@@ -6296,8 +6222,7 @@
         __ movl(Address(CpuRegister(RSP), destination.GetStackIndex()), Immediate(value));
       }
     } else if (constant->IsLongConstant()) {
-      // TODO: Remove "OrNull".
-      int64_t value = constant->AsLongConstantOrNull()->GetValue();
+      int64_t value = constant->AsLongConstant()->GetValue();
       if (destination.IsRegister()) {
         codegen_->Load64BitValue(destination.AsRegister<CpuRegister>(), value);
       } else {
@@ -6305,8 +6230,7 @@
         codegen_->Store64BitValueToStack(destination, value);
       }
     } else if (constant->IsFloatConstant()) {
-      // TODO: Remove "OrNull".
-      float fp_value = constant->AsFloatConstantOrNull()->GetValue();
+      float fp_value = constant->AsFloatConstant()->GetValue();
       if (destination.IsFpuRegister()) {
         XmmRegister dest = destination.AsFpuRegister<XmmRegister>();
         codegen_->Load32BitValue(dest, fp_value);
@@ -6317,8 +6241,7 @@
       }
     } else {
       DCHECK(constant->IsDoubleConstant()) << constant->DebugName();
-      // TODO: Remove "OrNull".
-      double fp_value =  constant->AsDoubleConstantOrNull()->GetValue();
+      double fp_value =  constant->AsDoubleConstant()->GetValue();
       int64_t value = bit_cast<int64_t, double>(fp_value);
       if (destination.IsFpuRegister()) {
         XmmRegister dest = destination.AsFpuRegister<XmmRegister>();
@@ -7529,8 +7452,7 @@
         __ xorl(first.AsRegister<CpuRegister>(), second.AsRegister<CpuRegister>());
       }
     } else if (second.IsConstant()) {
-      // TODO: Remove "OrNull".
-      Immediate imm(second.GetConstant()->AsIntConstantOrNull()->GetValue());
+      Immediate imm(second.GetConstant()->AsIntConstant()->GetValue());
       if (instruction->IsAnd()) {
         __ andl(first.AsRegister<CpuRegister>(), imm);
       } else if (instruction->IsOr()) {
@@ -7557,8 +7479,7 @@
     int64_t value = 0;
     if (second.IsConstant()) {
       second_is_constant = true;
-      // TODO: Remove "OrNull".
-      value = second.GetConstant()->AsLongConstantOrNull()->GetValue();
+      value = second.GetConstant()->AsLongConstant()->GetValue();
     }
     bool is_int32_value = IsInt<32>(value);
 
@@ -8103,8 +8024,7 @@
 void CodeGeneratorX86_64::GenerateLongCompare(Location lhs, Location rhs) {
   CpuRegister lhs_reg = lhs.AsRegister<CpuRegister>();
   if (rhs.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int64_t value = rhs.GetConstant()->AsLongConstantOrNull()->GetValue();
+    int64_t value = rhs.GetConstant()->AsLongConstant()->GetValue();
     Compare64BitValue(lhs_reg, value);
   } else if (rhs.IsDoubleStackSlot()) {
     __ cmpq(lhs_reg, Address(CpuRegister(RSP), rhs.GetStackIndex()));
@@ -8118,9 +8038,7 @@
                                           ScaleFactor scale,
                                           uint32_t data_offset) {
   return index.IsConstant()
-      ? Address(obj,
-                // TODO: Remove "OrNull".
-                (index.GetConstant()->AsIntConstantOrNull()->GetValue() << scale) + data_offset)
+      ? Address(obj, (index.GetConstant()->AsIntConstant()->GetValue() << scale) + data_offset)
       : Address(obj, index.AsRegister<CpuRegister>(), scale, data_offset);
 }
 
diff --git a/compiler/optimizing/code_sinking.cc b/compiler/optimizing/code_sinking.cc
index 8a30665..d759a16 100644
--- a/compiler/optimizing/code_sinking.cc
+++ b/compiler/optimizing/code_sinking.cc
@@ -53,8 +53,7 @@
     // actual last instruction.
     if (last->IsTryBoundary()) {
       // We have an exit try boundary. Fetch the previous instruction.
-      // TODO: Remove "OrNull".
-      DCHECK(!last->AsTryBoundaryOrNull()->IsEntry());
+      DCHECK(!last->AsTryBoundary()->IsEntry());
       if (last->GetPrevious() == nullptr) {
         DCHECK(exit_predecessor->IsSingleTryBoundary());
         exit_predecessor = exit_predecessor->GetSinglePredecessor();
@@ -81,8 +80,7 @@
 
   // Volatile stores cannot be moved.
   if (instruction->IsInstanceFieldSet()) {
-    // TODO: Remove "OrNull".
-    if (instruction->AsInstanceFieldSetOrNull()->IsVolatile()) {
+    if (instruction->AsInstanceFieldSet()->IsVolatile()) {
       return false;
     }
   }
@@ -95,8 +93,7 @@
   // Check it is safe to move ConstructorFence.
   // (Safe to move ConstructorFence for only protecting the new-instance but not for finals.)
   if (instruction->IsConstructorFence()) {
-    // TODO: Remove "OrNull".
-    HConstructorFence* ctor_fence = instruction->AsConstructorFenceOrNull();
+    HConstructorFence* ctor_fence = instruction->AsConstructorFence();
 
     // A fence with "0" inputs is dead and should've been removed in a prior pass.
     DCHECK_NE(0u, ctor_fence->InputCount());
@@ -218,8 +215,7 @@
       if (user->IsPhi()) {
         // Special case phis by taking the incoming block for regular ones,
         // or the dominator for catch phis.
-        // TODO: Remove "OrNull".
-        block = user->AsPhiOrNull()->IsCatchPhi()
+        block = user->AsPhi()->IsCatchPhi()
             ? block->GetDominator()
             : block->GetPredecessors()[use.GetIndex()];
       }
@@ -318,8 +314,7 @@
     DCHECK(insert_pos->IsControlFlow());
     // Avoid splitting HCondition from HIf to prevent unnecessary materialization.
     if (insert_pos->IsIf()) {
-      // TODO: Remove "OrNull".
-      HInstruction* if_input = insert_pos->AsIfOrNull()->InputAt(0);
+      HInstruction* if_input = insert_pos->AsIf()->InputAt(0);
       if (if_input == insert_pos->GetPrevious()) {
         insert_pos = if_input;
       }
@@ -386,9 +381,7 @@
       // If we sink to these basic blocks we would be sinking inside of the try so we would like
       // to check the catch block for post dominance.
       const bool ends_with_try_boundary_entry =
-          block->EndsWithTryBoundary() &&
-          // TODO: Remove "OrNull".
-          block->GetLastInstruction()->AsTryBoundaryOrNull()->IsEntry();
+          block->EndsWithTryBoundary() && block->GetLastInstruction()->AsTryBoundary()->IsEntry();
       ArrayRef<HBasicBlock* const> successors =
           ends_with_try_boundary_entry ? block->GetNormalSuccessors() :
                                          ArrayRef<HBasicBlock* const>(block->GetSuccessors());
@@ -578,8 +571,7 @@
         continue;
       }
 
-      // TODO: Remove "OrNull".
-      HReturn* ret = pred->GetLastInstruction()->AsReturnOrNull();
+      HReturn* ret = pred->GetLastInstruction()->AsReturn();
       if (new_phi == nullptr) {
         // Create the new_phi, if we haven't done so yet. We do it here since we need to know the
         // type to assign to it.
@@ -604,8 +596,7 @@
         continue;
       }
 
-      // TODO: Remove "OrNull".
-      HReturnVoid* ret = pred->GetLastInstruction()->AsReturnVoidOrNull();
+      HReturnVoid* ret = pred->GetLastInstruction()->AsReturnVoid();
       pred->ReplaceAndRemoveInstructionWith(ret,
                                             new (graph_->GetAllocator()) HGoto(ret->GetDexPc()));
       pred->ReplaceSuccessor(exit, new_block);
diff --git a/compiler/optimizing/common_arm.h b/compiler/optimizing/common_arm.h
index 53768ef..5f71cb9 100644
--- a/compiler/optimizing/common_arm.h
+++ b/compiler/optimizing/common_arm.h
@@ -155,14 +155,12 @@
 
 inline int32_t Int32ConstantFrom(HInstruction* instr) {
   if (instr->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    return instr->AsIntConstantOrNull()->GetValue();
+    return instr->AsIntConstant()->GetValue();
   } else if (instr->IsNullConstant()) {
     return 0;
   } else {
     DCHECK(instr->IsLongConstant()) << instr->DebugName();
-    // TODO: Remove "OrNull".
-    const int64_t ret = instr->AsLongConstantOrNull()->GetValue();
+    const int64_t ret = instr->AsLongConstant()->GetValue();
     DCHECK_GE(ret, std::numeric_limits<int32_t>::min());
     DCHECK_LE(ret, std::numeric_limits<int32_t>::max());
     return ret;
@@ -176,21 +174,18 @@
 inline int64_t Int64ConstantFrom(Location location) {
   HConstant* instr = location.GetConstant();
   if (instr->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    return instr->AsIntConstantOrNull()->GetValue();
+    return instr->AsIntConstant()->GetValue();
   } else if (instr->IsNullConstant()) {
     return 0;
   } else {
     DCHECK(instr->IsLongConstant()) << instr->DebugName();
-    // TODO: Remove "OrNull".
-    return instr->AsLongConstantOrNull()->GetValue();
+    return instr->AsLongConstant()->GetValue();
   }
 }
 
 inline uint64_t Uint64ConstantFrom(HInstruction* instr) {
   DCHECK(instr->IsConstant()) << instr->DebugName();
-  // TODO: Remove "OrNull".
-  return instr->AsConstantOrNull()->GetValueAsUint64();
+  return instr->AsConstant()->GetValueAsUint64();
 }
 
 inline vixl::aarch32::Operand OperandFrom(Location location, DataType::Type type) {
diff --git a/compiler/optimizing/common_arm64.h b/compiler/optimizing/common_arm64.h
index 4c3f6d2..e2ef8d5 100644
--- a/compiler/optimizing/common_arm64.h
+++ b/compiler/optimizing/common_arm64.h
@@ -260,11 +260,9 @@
     if (constant->IsLongConstant()) {
       return false;
     } else if (constant->IsFloatConstant()) {
-      // TODO: Remove "OrNull".
-      return vixl::aarch64::Assembler::IsImmFP32(constant->AsFloatConstantOrNull()->GetValue());
+      return vixl::aarch64::Assembler::IsImmFP32(constant->AsFloatConstant()->GetValue());
     } else if (constant->IsDoubleConstant()) {
-      // TODO: Remove "OrNull".
-      return vixl::aarch64::Assembler::IsImmFP64(constant->AsDoubleConstantOrNull()->GetValue());
+      return vixl::aarch64::Assembler::IsImmFP64(constant->AsDoubleConstant()->GetValue());
     }
     return IsUint<8>(value);
   }
@@ -314,9 +312,7 @@
 }
 
 inline Location ARM64EncodableConstantOrRegister(HInstruction* constant, HInstruction* instr) {
-  if (constant->IsConstant() &&
-      // TODO: Remove "OrNull".
-      Arm64CanEncodeConstantAsImmediate(constant->AsConstantOrNull(), instr)) {
+  if (constant->IsConstant() && Arm64CanEncodeConstantAsImmediate(constant->AsConstant(), instr)) {
     return Location::ConstantLocation(constant);
   }
 
diff --git a/compiler/optimizing/constant_folding.cc b/compiler/optimizing/constant_folding.cc
index c27d22c..2163c00 100644
--- a/compiler/optimizing/constant_folding.cc
+++ b/compiler/optimizing/constant_folding.cc
@@ -132,8 +132,7 @@
 void HConstantFoldingVisitor::VisitDivZeroCheck(HDivZeroCheck* inst) {
   // We can safely remove the check if the input is a non-null constant.
   HInstruction* check_input = inst->InputAt(0);
-  // TODO: Remove "OrNull".
-  if (check_input->IsConstant() && !check_input->AsConstantOrNull()->IsArithmeticZero()) {
+  if (check_input->IsConstant() && !check_input->AsConstant()->IsArithmeticZero()) {
     inst->ReplaceWith(check_input);
     inst->GetBlock()->RemoveInstruction(inst);
   }
@@ -195,8 +194,7 @@
   if (!if_input->IsCondition()) {
     return;
   }
-  // TODO: Remove "OrNull".
-  HCondition* condition = if_input->AsConditionOrNull();
+  HCondition* condition = if_input->AsCondition();
 
   // We want either `==` or `!=`, since we cannot make assumptions for other conditions e.g. `>`
   if (!condition->IsEqual() && !condition->IsNotEqual()) {
@@ -219,8 +217,7 @@
   // }
   // Similarly with variable != constant, except that we can make guarantees in the else case.
 
-  // TODO: Remove "OrNull".
-  HConstant* constant = left->IsConstant() ? left->AsConstantOrNull() : right->AsConstantOrNull();
+  HConstant* constant = left->IsConstant() ? left->AsConstant() : right->AsConstant();
   HInstruction* variable = left->IsConstant() ? right : left;
 
   // Don't deal with floats/doubles since they bring a lot of edge cases e.g.
@@ -241,18 +238,15 @@
     }
 
     // Update left and right to be the ones from the HCompare.
-    // TODO: Remove "OrNull".
-    left = variable->AsCompareOrNull()->GetLeft();
-    // TODO: Remove "OrNull".
-    right = variable->AsCompareOrNull()->GetRight();
+    left = variable->AsCompare()->GetLeft();
+    right = variable->AsCompare()->GetRight();
 
     // Re-check that one of them to be a constant and not the other.
     if (left->IsConstant() == right->IsConstant()) {
       return;
     }
 
-    // TODO: Remove "OrNull".
-    constant = left->IsConstant() ? left->AsConstantOrNull() : right->AsConstantOrNull();
+    constant = left->IsConstant() ? left->AsConstant() : right->AsConstant();
     variable = left->IsConstant() ? right : left;
 
     // Re-check floating point values.
@@ -274,14 +268,12 @@
   // we cannot make an assumption for the `else` branch.
   if (variable->GetType() == DataType::Type::kBool &&
       constant->IsIntConstant() &&
-      // TODO: Remove "OrNull".
-      (constant->AsIntConstantOrNull()->IsTrue() || constant->AsIntConstantOrNull()->IsFalse())) {
+      (constant->AsIntConstant()->IsTrue() || constant->AsIntConstant()->IsFalse())) {
     HBasicBlock* other_starting_block =
         condition->IsEqual() ? inst->IfFalseSuccessor() : inst->IfTrueSuccessor();
     DCHECK_NE(other_starting_block, starting_block);
 
-    // TODO: Remove "OrNull".
-    HConstant* other_constant = constant->AsIntConstantOrNull()->IsTrue() ?
+    HConstant* other_constant = constant->AsIntConstant()->IsTrue() ?
                                     GetGraph()->GetIntConstant(0) :
                                     GetGraph()->GetIntConstant(1);
     DCHECK_NE(other_constant, constant);
@@ -293,8 +285,7 @@
   HInstruction* input = inst->InputAt(0);
   if (input->IsLoadString()) {
     DCHECK(inst->IsStringLength());
-    // TODO: Remove "OrNull".
-    HLoadString* load_string = input->AsLoadStringOrNull();
+    HLoadString* load_string = input->AsLoadString();
     const DexFile& dex_file = load_string->GetDexFile();
     const dex::StringId& string_id = dex_file.GetStringId(load_string->GetStringIndex());
     inst->ReplaceWith(GetGraph()->GetIntConstant(dex_file.GetStringLength(string_id)));
@@ -314,8 +305,7 @@
 void InstructionWithAbsorbingInputSimplifier::VisitShift(HBinaryOperation* instruction) {
   DCHECK(instruction->IsShl() || instruction->IsShr() || instruction->IsUShr());
   HInstruction* left = instruction->GetLeft();
-  // TODO: Remove "OrNull".
-  if (left->IsConstant() && left->AsConstantOrNull()->IsArithmeticZero()) {
+  if (left->IsConstant() && left->AsConstant()->IsArithmeticZero()) {
     // Replace code looking like
     //    SHL dst, 0, shift_amount
     // with
@@ -375,8 +365,7 @@
     instruction->ReplaceWith(GetGraph()->GetConstant(DataType::Type::kBool, 0));
     instruction->GetBlock()->RemoveInstruction(instruction);
   } else if (instruction->GetLeft()->IsConstant() &&
-             // TODO: Remove "OrNull".
-             instruction->GetLeft()->AsConstantOrNull()->IsArithmeticZero()) {
+             instruction->GetLeft()->AsConstant()->IsArithmeticZero()) {
     // Replace code looking like
     //    ABOVE dst, 0, src  // unsigned 0 > src is always false
     // with
@@ -394,8 +383,7 @@
     instruction->ReplaceWith(GetGraph()->GetConstant(DataType::Type::kBool, 1));
     instruction->GetBlock()->RemoveInstruction(instruction);
   } else if (instruction->GetRight()->IsConstant() &&
-             // TODO: Remove "OrNull".
-             instruction->GetRight()->AsConstantOrNull()->IsArithmeticZero()) {
+             instruction->GetRight()->AsConstant()->IsArithmeticZero()) {
     // Replace code looking like
     //    ABOVE_OR_EQUAL dst, src, 0  // unsigned src >= 0 is always true
     // with
@@ -413,8 +401,7 @@
     instruction->ReplaceWith(GetGraph()->GetConstant(DataType::Type::kBool, 0));
     instruction->GetBlock()->RemoveInstruction(instruction);
   } else if (instruction->GetRight()->IsConstant() &&
-             // TODO: Remove "OrNull".
-             instruction->GetRight()->AsConstantOrNull()->IsArithmeticZero()) {
+             instruction->GetRight()->AsConstant()->IsArithmeticZero()) {
     // Replace code looking like
     //    BELOW dst, src, 0  // unsigned src < 0 is always false
     // with
@@ -432,8 +419,7 @@
     instruction->ReplaceWith(GetGraph()->GetConstant(DataType::Type::kBool, 1));
     instruction->GetBlock()->RemoveInstruction(instruction);
   } else if (instruction->GetLeft()->IsConstant() &&
-             // TODO: Remove "OrNull".
-             instruction->GetLeft()->AsConstantOrNull()->IsArithmeticZero()) {
+             instruction->GetLeft()->AsConstant()->IsArithmeticZero()) {
     // Replace code looking like
     //    BELOW_OR_EQUAL dst, 0, src  // unsigned 0 <= src is always true
     // with
@@ -515,8 +501,7 @@
     //    CONSTANT 0
     HInstruction* hnot = (left->IsNot() ? left : right);
     HInstruction* hother = (left->IsNot() ? right : left);
-    // TODO: Remove "OrNull".
-    HInstruction* src = hnot->AsNotOrNull()->GetInput();
+    HInstruction* src = hnot->AsNot()->GetInput();
 
     if (src == hother) {
       instruction->ReplaceWith(GetGraph()->GetConstant(type, 0));
@@ -529,10 +514,9 @@
   HConstant* input_cst = instruction->GetConstantRight();
   if (input_cst != nullptr) {
     HInstruction* input_value = instruction->GetLeastConstantLeft();
-    // TODO: Remove "OrNull".
     if (DataType::IsFloatingPointType(input_value->GetType()) &&
-        ((input_cst->IsFloatConstant() && input_cst->AsFloatConstantOrNull()->IsNaN()) ||
-         (input_cst->IsDoubleConstant() && input_cst->AsDoubleConstantOrNull()->IsNaN()))) {
+        ((input_cst->IsFloatConstant() && input_cst->AsFloatConstant()->IsNaN()) ||
+         (input_cst->IsDoubleConstant() && input_cst->AsDoubleConstant()->IsNaN()))) {
       // Replace code looking like
       //    CMP{G,L}-{FLOAT,DOUBLE} dst, src, NaN
       // with
@@ -590,8 +574,7 @@
   HBasicBlock* block = instruction->GetBlock();
 
   if (instruction->GetLeft()->IsConstant() &&
-      // TODO: Remove "OrNull".
-      instruction->GetLeft()->AsConstantOrNull()->IsArithmeticZero()) {
+      instruction->GetLeft()->AsConstant()->IsArithmeticZero()) {
     // Replace code looking like
     //    REM dst, 0, src
     // with
diff --git a/compiler/optimizing/constant_folding_test.cc b/compiler/optimizing/constant_folding_test.cc
index 4573dce..741fd3f 100644
--- a/compiler/optimizing/constant_folding_test.cc
+++ b/compiler/optimizing/constant_folding_test.cc
@@ -128,8 +128,7 @@
   auto check_after_cf = [](HGraph* graph) {
     HInstruction* inst = graph->GetBlocks()[1]->GetFirstInstruction()->InputAt(0);
     ASSERT_TRUE(inst->IsIntConstant());
-    // TODO: Remove "OrNull".
-    ASSERT_EQ(inst->AsIntConstantOrNull()->GetValue(), -1);
+    ASSERT_EQ(inst->AsIntConstant()->GetValue(), -1);
   };
 
   // Expected difference after dead code elimination.
@@ -190,8 +189,7 @@
   auto check_after_cf = [](HGraph* graph) {
     HInstruction* inst = graph->GetBlocks()[1]->GetFirstInstruction()->InputAt(0);
     ASSERT_TRUE(inst->IsLongConstant());
-    // TODO: Remove "OrNull".
-    ASSERT_EQ(inst->AsLongConstantOrNull()->GetValue(), INT64_C(-4294967296));
+    ASSERT_EQ(inst->AsLongConstant()->GetValue(), INT64_C(-4294967296));
   };
 
   // Expected difference after dead code elimination.
@@ -252,8 +250,7 @@
   auto check_after_cf = [](HGraph* graph) {
     HInstruction* inst = graph->GetBlocks()[1]->GetFirstInstruction()->InputAt(0);
     ASSERT_TRUE(inst->IsIntConstant());
-    // TODO: Remove "OrNull".
-    ASSERT_EQ(inst->AsIntConstantOrNull()->GetValue(), 3);
+    ASSERT_EQ(inst->AsIntConstant()->GetValue(), 3);
   };
 
   // Expected difference after dead code elimination.
@@ -332,16 +329,13 @@
   auto check_after_cf = [](HGraph* graph) {
     HInstruction* inst1 = graph->GetBlocks()[1]->GetFirstInstruction()->InputAt(0);
     ASSERT_TRUE(inst1->IsIntConstant());
-    // TODO: Remove "OrNull".
-    ASSERT_EQ(inst1->AsIntConstantOrNull()->GetValue(), 12);
+    ASSERT_EQ(inst1->AsIntConstant()->GetValue(), 12);
     HInstruction* inst2 = inst1->GetPrevious();
     ASSERT_TRUE(inst2->IsIntConstant());
-    // TODO: Remove "OrNull".
-    ASSERT_EQ(inst2->AsIntConstantOrNull()->GetValue(), 9);
+    ASSERT_EQ(inst2->AsIntConstant()->GetValue(), 9);
     HInstruction* inst3 = inst2->GetPrevious();
     ASSERT_TRUE(inst3->IsIntConstant());
-    // TODO: Remove "OrNull".
-    ASSERT_EQ(inst3->AsIntConstantOrNull()->GetValue(), 3);
+    ASSERT_EQ(inst3->AsIntConstant()->GetValue(), 3);
   };
 
   // Expected difference after dead code elimination.
@@ -406,8 +400,7 @@
   auto check_after_cf = [](HGraph* graph) {
     HInstruction* inst = graph->GetBlocks()[1]->GetFirstInstruction()->InputAt(0);
     ASSERT_TRUE(inst->IsIntConstant());
-    // TODO: Remove "OrNull".
-    ASSERT_EQ(inst->AsIntConstantOrNull()->GetValue(), 1);
+    ASSERT_EQ(inst->AsIntConstant()->GetValue(), 1);
   };
 
   // Expected difference after dead code elimination.
@@ -470,8 +463,7 @@
   auto check_after_cf = [](HGraph* graph) {
     HInstruction* inst = graph->GetBlocks()[1]->GetFirstInstruction()->InputAt(0);
     ASSERT_TRUE(inst->IsLongConstant());
-    // TODO: Remove "OrNull".
-    ASSERT_EQ(inst->AsLongConstantOrNull()->GetValue(), 3);
+    ASSERT_EQ(inst->AsLongConstant()->GetValue(), 3);
   };
 
   // Expected difference after dead code elimination.
@@ -535,8 +527,7 @@
   auto check_after_cf = [](HGraph* graph) {
     HInstruction* inst = graph->GetBlocks()[1]->GetFirstInstruction()->InputAt(0);
     ASSERT_TRUE(inst->IsLongConstant());
-    // TODO: Remove "OrNull".
-    ASSERT_EQ(inst->AsLongConstantOrNull()->GetValue(), 1);
+    ASSERT_EQ(inst->AsLongConstant()->GetValue(), 1);
   };
 
   // Expected difference after dead code elimination.
@@ -636,20 +627,16 @@
   auto check_after_cf = [](HGraph* graph) {
     HInstruction* inst1 = graph->GetBlocks()[4]->GetFirstInstruction()->InputAt(0);
     ASSERT_TRUE(inst1->IsIntConstant());
-    // TODO: Remove "OrNull".
-    ASSERT_EQ(inst1->AsIntConstantOrNull()->GetValue(), 20);
+    ASSERT_EQ(inst1->AsIntConstant()->GetValue(), 20);
     HInstruction* inst2 = inst1->GetPrevious();
     ASSERT_TRUE(inst2->IsIntConstant());
-    // TODO: Remove "OrNull".
-    ASSERT_EQ(inst2->AsIntConstantOrNull()->GetValue(), 12);
+    ASSERT_EQ(inst2->AsIntConstant()->GetValue(), 12);
     HInstruction* inst3 = inst2->GetPrevious();
     ASSERT_TRUE(inst3->IsIntConstant());
-    // TODO: Remove "OrNull".
-    ASSERT_EQ(inst3->AsIntConstantOrNull()->GetValue(), 7);
+    ASSERT_EQ(inst3->AsIntConstant()->GetValue(), 7);
     HInstruction* inst4 = inst3->GetPrevious();
     ASSERT_TRUE(inst4->IsIntConstant());
-    // TODO: Remove "OrNull".
-    ASSERT_EQ(inst4->AsIntConstantOrNull()->GetValue(), 3);
+    ASSERT_EQ(inst4->AsIntConstant()->GetValue(), 3);
   };
 
   // Expected difference after dead code elimination.
@@ -725,8 +712,7 @@
   auto check_after_cf = [](HGraph* graph) {
     HInstruction* inst = graph->GetBlocks()[1]->GetFirstInstruction()->InputAt(0);
     ASSERT_TRUE(inst->IsIntConstant());
-    // TODO: Remove "OrNull".
-    ASSERT_EQ(inst->AsIntConstantOrNull()->GetValue(), 1);
+    ASSERT_EQ(inst->AsIntConstant()->GetValue(), 1);
   };
 
   // Expected graph after dead code elimination.
diff --git a/compiler/optimizing/critical_native_abi_fixup_arm.cc b/compiler/optimizing/critical_native_abi_fixup_arm.cc
index 13c887e..77e1566 100644
--- a/compiler/optimizing/critical_native_abi_fixup_arm.cc
+++ b/compiler/optimizing/critical_native_abi_fixup_arm.cc
@@ -97,11 +97,9 @@
     for (HInstructionIterator it(block->GetInstructions()); !it.Done(); it.Advance()) {
       HInstruction* instruction = it.Current();
       if (instruction->IsInvokeStaticOrDirect() &&
-          // TODO: Remove "OrNull".
-          instruction->AsInvokeStaticOrDirectOrNull()->GetCodePtrLocation() ==
+          instruction->AsInvokeStaticOrDirect()->GetCodePtrLocation() ==
               CodePtrLocation::kCallCriticalNative) {
-        // TODO: Remove "OrNull".
-        FixUpArguments(instruction->AsInvokeStaticOrDirectOrNull());
+        FixUpArguments(instruction->AsInvokeStaticOrDirect());
       }
     }
   }
diff --git a/compiler/optimizing/dead_code_elimination.cc b/compiler/optimizing/dead_code_elimination.cc
index 5840651..cf49e39 100644
--- a/compiler/optimizing/dead_code_elimination.cc
+++ b/compiler/optimizing/dead_code_elimination.cc
@@ -47,29 +47,23 @@
     ArrayRef<HBasicBlock* const> live_successors(block->GetSuccessors());
     HInstruction* last_instruction = block->GetLastInstruction();
     if (last_instruction->IsIf()) {
-      // TODO: Remove "OrNull".
-      HIf* if_instruction = last_instruction->AsIfOrNull();
+      HIf* if_instruction = last_instruction->AsIf();
       HInstruction* condition = if_instruction->InputAt(0);
       if (condition->IsIntConstant()) {
-        // TODO: Remove "OrNull".
-        if (condition->AsIntConstantOrNull()->IsTrue()) {
+        if (condition->AsIntConstant()->IsTrue()) {
           live_successors = live_successors.SubArray(0u, 1u);
           DCHECK_EQ(live_successors[0], if_instruction->IfTrueSuccessor());
         } else {
-          // TODO: Remove "OrNull".
-          DCHECK(condition->AsIntConstantOrNull()->IsFalse())
-              << condition->AsIntConstantOrNull()->GetValue();
+          DCHECK(condition->AsIntConstant()->IsFalse()) << condition->AsIntConstant()->GetValue();
           live_successors = live_successors.SubArray(1u, 1u);
           DCHECK_EQ(live_successors[0], if_instruction->IfFalseSuccessor());
         }
       }
     } else if (last_instruction->IsPackedSwitch()) {
-      // TODO: Remove "OrNull".
-      HPackedSwitch* switch_instruction = last_instruction->AsPackedSwitchOrNull();
+      HPackedSwitch* switch_instruction = last_instruction->AsPackedSwitch();
       HInstruction* switch_input = switch_instruction->InputAt(0);
       if (switch_input->IsIntConstant()) {
-        // TODO: Remove "OrNull".
-        int32_t switch_value = switch_input->AsIntConstantOrNull()->GetValue();
+        int32_t switch_value = switch_input->AsIntConstant()->GetValue();
         int32_t start_value = switch_instruction->GetStartValue();
         // Note: Though the spec forbids packed-switch values to wrap around, we leave
         // that task to the verifier and use unsigned arithmetic with it's "modulo 2^32"
@@ -142,21 +136,16 @@
   }
 
   if (left->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    return condition->Evaluate(left->AsIntConstantOrNull(), right->AsIntConstantOrNull());
+    return condition->Evaluate(left->AsIntConstant(), right->AsIntConstant());
   } else if (left->IsNullConstant()) {
-    // TODO: Remove "OrNull".
-    return condition->Evaluate(left->AsNullConstantOrNull(), right->AsNullConstantOrNull());
+    return condition->Evaluate(left->AsNullConstant(), right->AsNullConstant());
   } else if (left->IsLongConstant()) {
-    // TODO: Remove "OrNull".
-    return condition->Evaluate(left->AsLongConstantOrNull(), right->AsLongConstantOrNull());
+    return condition->Evaluate(left->AsLongConstant(), right->AsLongConstant());
   } else if (left->IsFloatConstant()) {
-    // TODO: Remove "OrNull".
-    return condition->Evaluate(left->AsFloatConstantOrNull(), right->AsFloatConstantOrNull());
+    return condition->Evaluate(left->AsFloatConstant(), right->AsFloatConstant());
   } else {
     DCHECK(left->IsDoubleConstant());
-    // TODO: Remove "OrNull".
-    return condition->Evaluate(left->AsDoubleConstantOrNull(), right->AsDoubleConstantOrNull());
+    return condition->Evaluate(left->AsDoubleConstant(), right->AsDoubleConstant());
   }
 }
 
@@ -165,8 +154,7 @@
   if (!block->EndsWithIf()) {
     return false;
   }
-  // TODO: Remove "OrNull".
-  HIf* ifs = block->GetLastInstruction()->AsIfOrNull();
+  HIf* ifs = block->GetLastInstruction()->AsIf();
   // Find either:
   //   if obj == null
   //     throws
@@ -279,8 +267,7 @@
     // throw, the first one will throw and the second one will never be reached.
     HInstruction* throwing_invoke = nullptr;
     for (HInstructionIterator it(block->GetInstructions()); !it.Done(); it.Advance()) {
-      // TODO: Remove "OrNull".
-      if (it.Current()->IsInvoke() && it.Current()->AsInvokeOrNull()->AlwaysThrows()) {
+      if (it.Current()->IsInvoke() && it.Current()->AsInvoke()->AlwaysThrows()) {
         throwing_invoke = it.Current();
         break;
       }
@@ -375,15 +362,13 @@
       bool has_only_phi_condition_and_if =
           !has_only_phi_and_if &&
           first->IsCondition() &&
-          // TODO: Remove "OrNull".
-          HasInput(first->AsConditionOrNull(), block->GetFirstPhi()) &&
+          HasInput(first->AsCondition(), block->GetFirstPhi()) &&
           (first->GetNext() == last) &&
           (last->InputAt(0) == first) &&
           first->HasOnlyOneNonEnvironmentUse();
 
       if (has_only_phi_and_if || has_only_phi_condition_and_if) {
-        // TODO: Remove "OrNull".
-        HPhi* phi = block->GetFirstPhi()->AsPhiOrNull();
+        HPhi* phi = block->GetFirstPhi()->AsPhi();
         bool phi_input_is_left = (first->InputAt(0) == phi);
 
         // Walk over all inputs of the phis and update the control flow of
@@ -399,11 +384,9 @@
           } else {
             DCHECK(has_only_phi_condition_and_if);
             if (phi_input_is_left) {
-              // TODO: Remove "OrNull".
-              value_to_check = Evaluate(first->AsConditionOrNull(), input, first->InputAt(1));
+              value_to_check = Evaluate(first->AsCondition(), input, first->InputAt(1));
             } else {
-              // TODO: Remove "OrNull".
-              value_to_check = Evaluate(first->AsConditionOrNull(), first->InputAt(0), input);
+              value_to_check = Evaluate(first->AsCondition(), first->InputAt(0), input);
             }
           }
           if (value_to_check == nullptr) {
@@ -412,16 +395,12 @@
           } else {
             HBasicBlock* predecessor_to_update = block->GetPredecessors()[i];
             HBasicBlock* successor_to_update = nullptr;
-            // TODO: Remove "OrNull".
-            if (value_to_check->AsIntConstantOrNull()->IsTrue()) {
-              // TODO: Remove "OrNull".
-              successor_to_update = last->AsIfOrNull()->IfTrueSuccessor();
+            if (value_to_check->AsIntConstant()->IsTrue()) {
+              successor_to_update = last->AsIf()->IfTrueSuccessor();
             } else {
-              // TODO: Remove "OrNull".
-              DCHECK(value_to_check->AsIntConstantOrNull()->IsFalse())
-                  << value_to_check->AsIntConstantOrNull()->GetValue();
-              // TODO: Remove "OrNull".
-              successor_to_update = last->AsIfOrNull()->IfFalseSuccessor();
+              DCHECK(value_to_check->AsIntConstant()->IsFalse())
+                  << value_to_check->AsIntConstant()->GetValue();
+              successor_to_update = last->AsIf()->IfFalseSuccessor();
             }
             predecessor_to_update->ReplaceSuccessor(block, successor_to_update);
             phi->RemoveInputAt(i);
@@ -442,8 +421,7 @@
           if (has_only_phi_condition_and_if) {
             // Evaluate here (and not wait for a constant folding pass) to open
             // more opportunities for DCE.
-            // TODO: Remove "OrNull".
-            HInstruction* result = first->AsConditionOrNull()->TryStaticEvaluation();
+            HInstruction* result = first->AsCondition()->TryStaticEvaluation();
             if (result != nullptr) {
               first->ReplaceWith(result);
               block->RemoveInstruction(first);
@@ -476,8 +454,7 @@
 
 void HDeadCodeElimination::MaybeAddPhi(HBasicBlock* block) {
   DCHECK(block->GetLastInstruction()->IsIf());
-  // TODO: Remove "OrNull".
-  HIf* if_instruction = block->GetLastInstruction()->AsIfOrNull();
+  HIf* if_instruction = block->GetLastInstruction()->AsIf();
   if (if_instruction->InputAt(0)->IsConstant()) {
     // Constant values are handled in RemoveDeadBlocks.
     return;
@@ -500,8 +477,7 @@
   }
 
   HInstruction* input = if_instruction->InputAt(0);
-  // TODO: Remove "OrNull".
-  HInstruction* dominator_input = dominator->GetLastInstruction()->AsIfOrNull()->InputAt(0);
+  HInstruction* dominator_input = dominator->GetLastInstruction()->AsIf()->InputAt(0);
   const bool same_input = dominator_input == input;
   if (!same_input) {
     // Try to see if the dominator has the opposite input (e.g. if(cond) and if(!cond)). If that's
@@ -510,10 +486,8 @@
       return;
     }
 
-    // TODO: Remove "OrNull".
-    HCondition* block_cond = input->AsConditionOrNull();
-    // TODO: Remove "OrNull".
-    HCondition* dominator_cond = dominator_input->AsConditionOrNull();
+    HCondition* block_cond = input->AsCondition();
+    HCondition* dominator_cond = dominator_input->AsCondition();
 
     if (block_cond->GetLeft() != dominator_cond->GetLeft() ||
         block_cond->GetRight() != dominator_cond->GetRight() ||
@@ -536,12 +510,10 @@
 
   for (size_t index = 0; index < pred_size; index++) {
     HBasicBlock* pred = block->GetPredecessors()[index];
-    // TODO: Remove "OrNull".
     const bool dominated_by_true =
-        dominator->GetLastInstruction()->AsIfOrNull()->IfTrueSuccessor()->Dominates(pred);
-    // TODO: Remove "OrNull".
+        dominator->GetLastInstruction()->AsIf()->IfTrueSuccessor()->Dominates(pred);
     const bool dominated_by_false =
-        dominator->GetLastInstruction()->AsIfOrNull()->IfFalseSuccessor()->Dominates(pred);
+        dominator->GetLastInstruction()->AsIf()->IfFalseSuccessor()->Dominates(pred);
     if (dominated_by_true == dominated_by_false) {
       // In this case, we can't know if we are coming from the true branch, or the false branch. It
       // happens in cases like:
@@ -672,14 +644,12 @@
                                      /* out */ bool* any_block_in_loop) {
   // Update all try entries.
   DCHECK(try_entry->EndsWithTryBoundary());
-  // TODO: Remove "OrNull".
-  DCHECK(try_entry->GetLastInstruction()->AsTryBoundaryOrNull()->IsEntry());
+  DCHECK(try_entry->GetLastInstruction()->AsTryBoundary()->IsEntry());
   DisconnectHandlersAndUpdateTryBoundary(try_entry, any_block_in_loop);
 
   for (HBasicBlock* other_try_entry : try_belonging_info.coalesced_try_entries) {
     DCHECK(other_try_entry->EndsWithTryBoundary());
-    // TODO: Remove "OrNull".
-    DCHECK(other_try_entry->GetLastInstruction()->AsTryBoundaryOrNull()->IsEntry());
+    DCHECK(other_try_entry->GetLastInstruction()->AsTryBoundary()->IsEntry());
     DisconnectHandlersAndUpdateTryBoundary(other_try_entry, any_block_in_loop);
   }
 
@@ -693,8 +663,7 @@
 
     if (block->EndsWithTryBoundary()) {
       // Try exits.
-      // TODO: Remove "OrNull".
-      DCHECK(!block->GetLastInstruction()->AsTryBoundaryOrNull()->IsEntry());
+      DCHECK(!block->GetLastInstruction()->AsTryBoundary()->IsEntry());
       DisconnectHandlersAndUpdateTryBoundary(block, any_block_in_loop);
 
       if (block->GetSingleSuccessor()->IsExitBlock()) {
@@ -743,13 +712,10 @@
   // Deduplicate the tries which have different try entries but they are really the same try.
   for (auto it = tries.begin(); it != tries.end(); it++) {
     DCHECK(it->first->EndsWithTryBoundary());
-    // TODO: Remove "OrNull".
-    HTryBoundary* try_boundary = it->first->GetLastInstruction()->AsTryBoundaryOrNull();
+    HTryBoundary* try_boundary = it->first->GetLastInstruction()->AsTryBoundary();
     for (auto other_it = next(it); other_it != tries.end(); /*other_it++ in the loop*/) {
       DCHECK(other_it->first->EndsWithTryBoundary());
-      // TODO: Remove "OrNull".
-      HTryBoundary* other_try_boundary =
-          other_it->first->GetLastInstruction()->AsTryBoundaryOrNull();
+      HTryBoundary* other_try_boundary = other_it->first->GetLastInstruction()->AsTryBoundary();
       if (try_boundary->HasSameExceptionHandlersAs(*other_try_boundary)) {
         // Merge the entries as they are really the same one.
         // Block merging.
@@ -889,8 +855,7 @@
         has_simd = true;
       } else if (instruction->IsBoundsCheck()) {
         has_bounds_checks = true;
-        // TODO: Remove "OrNull".
-      } else if (instruction->IsInvoke() && instruction->AsInvokeOrNull()->AlwaysThrows()) {
+      } else if (instruction->IsInvoke() && instruction->AsInvoke()->AlwaysThrows()) {
         has_always_throwing_invokes = true;
       }
     }
diff --git a/compiler/optimizing/escape.cc b/compiler/optimizing/escape.cc
index 6fffe22..cebe94f 100644
--- a/compiler/optimizing/escape.cc
+++ b/compiler/optimizing/escape.cc
@@ -24,8 +24,7 @@
   // References not allocated in the method are intrinsically escaped.
   // Finalizable references are always escaping since they end up in FinalizerQueues.
   if ((!reference->IsNewInstance() && !reference->IsNewArray()) ||
-      // TODO: Remove "OrNull".
-      (reference->IsNewInstance() && reference->AsNewInstanceOrNull()->IsFinalizable())) {
+      (reference->IsNewInstance() && reference->AsNewInstance()->IsFinalizable())) {
     if (!escape_visitor(reference)) {
       return;
     }
@@ -106,8 +105,7 @@
   *is_singleton_and_not_returned = true;
   *is_singleton_and_not_deopt_visible = true;
 
-  // TODO: Remove "OrNull".
-  if (reference->IsNewInstance() && reference->AsNewInstanceOrNull()->IsFinalizable()) {
+  if (reference->IsNewInstance() && reference->AsNewInstance()->IsFinalizable()) {
     // Finalizable reference is treated as being returned in the end.
     *is_singleton_and_not_returned = false;
   }
diff --git a/compiler/optimizing/graph_checker.cc b/compiler/optimizing/graph_checker.cc
index e694273..596049f 100644
--- a/compiler/optimizing/graph_checker.cc
+++ b/compiler/optimizing/graph_checker.cc
@@ -53,8 +53,7 @@
     return false;
   }
 
-  // TODO: Remove "OrNull".
-  HTryBoundary* boundary = block->GetLastInstruction()->AsTryBoundaryOrNull();
+  HTryBoundary* boundary = block->GetLastInstruction()->AsTryBoundary();
   return block->GetPredecessors().size() == 1u &&
          boundary->GetNormalFlowSuccessor()->IsExitBlock() &&
          !boundary->IsEntry();
@@ -248,8 +247,7 @@
       AddError(StringPrintf("Block %d doesn't have a Nop as its first instruction.",
                             current_block_->GetBlockId()));
     } else {
-      // TODO: Remove "OrNull".
-      HNop* nop = block->GetFirstInstruction()->AsNopOrNull();
+      HNop* nop = block->GetFirstInstruction()->AsNop();
       if (!nop->NeedsEnvironment()) {
         AddError(
             StringPrintf("%s:%d is a Nop and the first instruction of block %d, but it doesn't "
@@ -660,8 +658,7 @@
     for (HBasicBlock* catch_block : entry.GetExceptionHandlers()) {
       const HEnvironment* environment = catch_block->GetFirstInstruction()->GetEnvironment();
       for (HInstructionIterator phi_it(catch_block->GetPhis()); !phi_it.Done(); phi_it.Advance()) {
-        // TODO: Remove "OrNull".
-        HPhi* catch_phi = phi_it.Current()->AsPhiOrNull();
+        HPhi* catch_phi = phi_it.Current()->AsPhi();
         if (environment->GetInstructionAt(catch_phi->GetRegNumber()) == nullptr) {
           AddError(StringPrintf("Instruction %s:%d throws into catch block %d "
                                 "with catch phi %d for vreg %d but its "
@@ -750,9 +747,8 @@
                           check->InputAt(2)->DebugName(),
                           check->InputAt(2)->GetId()));
   } else if (check_value) {
-    // TODO: Remove "OrNull".
     uint32_t actual_value =
-        static_cast<uint32_t>(check->InputAt(input_pos)->AsIntConstantOrNull()->GetValue());
+        static_cast<uint32_t>(check->InputAt(input_pos)->AsIntConstant()->GetValue());
     if (actual_value != expected_value) {
       AddError(StringPrintf("%s:%d (bitstring) has %s 0x%x, not 0x%x as expected.",
                             check->DebugName(),
@@ -948,8 +944,7 @@
 static bool IsConstantEquivalent(const HInstruction* insn1,
                                  const HInstruction* insn2,
                                  BitVector* visited) {
-  // TODO: Remove "OrNull".
-  if (insn1->IsPhi() && insn1->AsPhiOrNull()->IsVRegEquivalentOf(insn2)) {
+  if (insn1->IsPhi() && insn1->AsPhi()->IsVRegEquivalentOf(insn2)) {
     HConstInputsRef insn1_inputs = insn1->GetInputs();
     HConstInputsRef insn2_inputs = insn2->GetInputs();
     if (insn1_inputs.size() != insn2_inputs.size()) {
@@ -969,9 +964,7 @@
     }
     return true;
   } else if (IsSameSizeConstant(insn1, insn2)) {
-    // TODO: Remove "OrNull".
-    return insn1->AsConstantOrNull()->GetValueAsUint64() ==
-           insn2->AsConstantOrNull()->GetValueAsUint64();
+    return insn1->AsConstant()->GetValueAsUint64() == insn2->AsConstant()->GetValueAsUint64();
   } else {
     return false;
   }
@@ -1065,8 +1058,7 @@
   // phis which can be constructed artifically.
   if (phi->IsCatchPhi()) {
     HInstruction* next_phi = phi->GetNext();
-    // TODO: Remove "OrNull".
-    if (next_phi != nullptr && phi->GetRegNumber() > next_phi->AsPhiOrNull()->GetRegNumber()) {
+    if (next_phi != nullptr && phi->GetRegNumber() > next_phi->AsPhi()->GetRegNumber()) {
       AddError(StringPrintf("Catch phis %d and %d in block %d are not sorted by their "
                             "vreg numbers.",
                             phi->GetId(),
@@ -1082,8 +1074,7 @@
     for (HInstructionIterator phi_it(phi->GetBlock()->GetPhis());
          !phi_it.Done();
          phi_it.Advance()) {
-      // TODO: Remove "OrNull".
-      HPhi* other_phi = phi_it.Current()->AsPhiOrNull();
+      HPhi* other_phi = phi_it.Current()->AsPhi();
       if (phi != other_phi && phi->GetRegNumber() == other_phi->GetRegNumber()) {
         if (phi->GetType() == other_phi->GetType()) {
           std::stringstream type_str;
@@ -1126,8 +1117,7 @@
 void GraphChecker::HandleBooleanInput(HInstruction* instruction, size_t input_index) {
   HInstruction* input = instruction->InputAt(input_index);
   if (input->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t value = input->AsIntConstantOrNull()->GetValue();
+    int32_t value = input->AsIntConstant()->GetValue();
     if (value != 0 && value != 1) {
       AddError(StringPrintf(
           "%s instruction %d has a non-Boolean constant input %d whose value is: %d.",
diff --git a/compiler/optimizing/graph_test.cc b/compiler/optimizing/graph_test.cc
index f391bcb..b5d7127 100644
--- a/compiler/optimizing/graph_test.cc
+++ b/compiler/optimizing/graph_test.cc
@@ -92,20 +92,16 @@
   if_block->AddSuccessor(return_block);
   return_block->AddSuccessor(exit_block);
 
-  // TODO: Remove "OrNull".
-  ASSERT_EQ(if_block->GetLastInstruction()->AsIfOrNull()->IfTrueSuccessor(), if_true);
-  // TODO: Remove "OrNull".
-  ASSERT_EQ(if_block->GetLastInstruction()->AsIfOrNull()->IfFalseSuccessor(), return_block);
+  ASSERT_EQ(if_block->GetLastInstruction()->AsIf()->IfTrueSuccessor(), if_true);
+  ASSERT_EQ(if_block->GetLastInstruction()->AsIf()->IfFalseSuccessor(), return_block);
 
   graph->SimplifyCFG();
 
   // Ensure we still have the same if true block.
-  // TODO: Remove "OrNull".
-  ASSERT_EQ(if_block->GetLastInstruction()->AsIfOrNull()->IfTrueSuccessor(), if_true);
+  ASSERT_EQ(if_block->GetLastInstruction()->AsIf()->IfTrueSuccessor(), if_true);
 
   // Ensure the critical edge has been removed.
-  // TODO: Remove "OrNull".
-  HBasicBlock* false_block = if_block->GetLastInstruction()->AsIfOrNull()->IfFalseSuccessor();
+  HBasicBlock* false_block = if_block->GetLastInstruction()->AsIf()->IfFalseSuccessor();
   ASSERT_NE(false_block, return_block);
 
   // Ensure the new block branches to the join block.
@@ -128,20 +124,16 @@
   if_block->AddSuccessor(if_false);
   return_block->AddSuccessor(exit_block);
 
-  // TODO: Remove "OrNull".
-  ASSERT_EQ(if_block->GetLastInstruction()->AsIfOrNull()->IfTrueSuccessor(), return_block);
-  // TODO: Remove "OrNull".
-  ASSERT_EQ(if_block->GetLastInstruction()->AsIfOrNull()->IfFalseSuccessor(), if_false);
+  ASSERT_EQ(if_block->GetLastInstruction()->AsIf()->IfTrueSuccessor(), return_block);
+  ASSERT_EQ(if_block->GetLastInstruction()->AsIf()->IfFalseSuccessor(), if_false);
 
   graph->SimplifyCFG();
 
   // Ensure we still have the same if true block.
-  // TODO: Remove "OrNull".
-  ASSERT_EQ(if_block->GetLastInstruction()->AsIfOrNull()->IfFalseSuccessor(), if_false);
+  ASSERT_EQ(if_block->GetLastInstruction()->AsIf()->IfFalseSuccessor(), if_false);
 
   // Ensure the critical edge has been removed.
-  // TODO: Remove "OrNull".
-  HBasicBlock* true_block = if_block->GetLastInstruction()->AsIfOrNull()->IfTrueSuccessor();
+  HBasicBlock* true_block = if_block->GetLastInstruction()->AsIf()->IfTrueSuccessor();
   ASSERT_NE(true_block, return_block);
 
   // Ensure the new block branches to the join block.
@@ -162,16 +154,13 @@
   if_block->AddSuccessor(return_block);
   return_block->AddSuccessor(exit_block);
 
-  // TODO: Remove "OrNull".
-  ASSERT_EQ(if_block->GetLastInstruction()->AsIfOrNull()->IfTrueSuccessor(), if_block);
-  // TODO: Remove "OrNull".
-  ASSERT_EQ(if_block->GetLastInstruction()->AsIfOrNull()->IfFalseSuccessor(), return_block);
+  ASSERT_EQ(if_block->GetLastInstruction()->AsIf()->IfTrueSuccessor(), if_block);
+  ASSERT_EQ(if_block->GetLastInstruction()->AsIf()->IfFalseSuccessor(), return_block);
 
   graph->BuildDominatorTree();
 
   // Ensure we still have the same if false block.
-  // TODO: Remove "OrNull".
-  ASSERT_EQ(if_block->GetLastInstruction()->AsIfOrNull()->IfFalseSuccessor(), return_block);
+  ASSERT_EQ(if_block->GetLastInstruction()->AsIf()->IfFalseSuccessor(), return_block);
 
   // Ensure there is only one back edge.
   ASSERT_EQ(if_block->GetPredecessors().size(), 2u);
@@ -180,8 +169,7 @@
 
   // Ensure the new block is the back edge.
   ASSERT_EQ(if_block->GetPredecessors()[1],
-            // TODO: Remove "OrNull".
-            if_block->GetLastInstruction()->AsIfOrNull()->IfTrueSuccessor());
+            if_block->GetLastInstruction()->AsIf()->IfTrueSuccessor());
 }
 
 // Test that the successors of an if block stay consistent after a SimplifyCFG.
@@ -198,16 +186,13 @@
   if_block->AddSuccessor(if_block);
   return_block->AddSuccessor(exit_block);
 
-  // TODO: Remove "OrNull".
-  ASSERT_EQ(if_block->GetLastInstruction()->AsIfOrNull()->IfTrueSuccessor(), return_block);
-  // TODO: Remove "OrNull".
-  ASSERT_EQ(if_block->GetLastInstruction()->AsIfOrNull()->IfFalseSuccessor(), if_block);
+  ASSERT_EQ(if_block->GetLastInstruction()->AsIf()->IfTrueSuccessor(), return_block);
+  ASSERT_EQ(if_block->GetLastInstruction()->AsIf()->IfFalseSuccessor(), if_block);
 
   graph->BuildDominatorTree();
 
   // Ensure we still have the same if true block.
-  // TODO: Remove "OrNull".
-  ASSERT_EQ(if_block->GetLastInstruction()->AsIfOrNull()->IfTrueSuccessor(), return_block);
+  ASSERT_EQ(if_block->GetLastInstruction()->AsIf()->IfTrueSuccessor(), return_block);
 
   // Ensure there is only one back edge.
   ASSERT_EQ(if_block->GetPredecessors().size(), 2u);
@@ -216,8 +201,7 @@
 
   // Ensure the new block is the back edge.
   ASSERT_EQ(if_block->GetPredecessors()[1],
-            // TODO: Remove "OrNull".
-            if_block->GetLastInstruction()->AsIfOrNull()->IfFalseSuccessor());
+            if_block->GetLastInstruction()->AsIf()->IfFalseSuccessor());
 }
 
 // Test that the successors of an if block stay consistent after a SimplifyCFG.
@@ -238,15 +222,12 @@
   if_block->AddSuccessor(return_block);
 
 
-  // TODO: Remove "OrNull".
-  ASSERT_EQ(if_block->GetLastInstruction()->AsIfOrNull()->IfTrueSuccessor(), loop_block);
-  // TODO: Remove "OrNull".
-  ASSERT_EQ(if_block->GetLastInstruction()->AsIfOrNull()->IfFalseSuccessor(), return_block);
+  ASSERT_EQ(if_block->GetLastInstruction()->AsIf()->IfTrueSuccessor(), loop_block);
+  ASSERT_EQ(if_block->GetLastInstruction()->AsIf()->IfFalseSuccessor(), return_block);
 
   graph->BuildDominatorTree();
 
-  // TODO: Remove "OrNull".
-  HIf* if_instr = if_block->GetLastInstruction()->AsIfOrNull();
+  HIf* if_instr = if_block->GetLastInstruction()->AsIf();
   // Ensure we still have the same if false block.
   ASSERT_EQ(if_instr->IfFalseSuccessor(), return_block);
 
@@ -276,15 +257,12 @@
   if_block->AddSuccessor(return_block);
   if_block->AddSuccessor(loop_block);
 
-  // TODO: Remove "OrNull".
-  ASSERT_EQ(if_block->GetLastInstruction()->AsIfOrNull()->IfTrueSuccessor(), return_block);
-  // TODO: Remove "OrNull".
-  ASSERT_EQ(if_block->GetLastInstruction()->AsIfOrNull()->IfFalseSuccessor(), loop_block);
+  ASSERT_EQ(if_block->GetLastInstruction()->AsIf()->IfTrueSuccessor(), return_block);
+  ASSERT_EQ(if_block->GetLastInstruction()->AsIf()->IfFalseSuccessor(), loop_block);
 
   graph->BuildDominatorTree();
 
-  // TODO: Remove "OrNull".
-  HIf* if_instr = if_block->GetLastInstruction()->AsIfOrNull();
+  HIf* if_instr = if_block->GetLastInstruction()->AsIf();
   // Ensure we still have the same if true block.
   ASSERT_EQ(if_instr->IfTrueSuccessor(), return_block);
 
diff --git a/compiler/optimizing/graph_visualizer.cc b/compiler/optimizing/graph_visualizer.cc
index a264968..73bdd1e 100644
--- a/compiler/optimizing/graph_visualizer.cc
+++ b/compiler/optimizing/graph_visualizer.cc
@@ -323,17 +323,13 @@
       stream << "#";
       HConstant* constant = location.GetConstant();
       if (constant->IsIntConstant()) {
-        // TODO: Remove "OrNull".
-        stream << constant->AsIntConstantOrNull()->GetValue();
+        stream << constant->AsIntConstant()->GetValue();
       } else if (constant->IsLongConstant()) {
-        // TODO: Remove "OrNull".
-        stream << constant->AsLongConstantOrNull()->GetValue();
+        stream << constant->AsLongConstant()->GetValue();
       } else if (constant->IsFloatConstant()) {
-        // TODO: Remove "OrNull".
-        stream << constant->AsFloatConstantOrNull()->GetValue();
+        stream << constant->AsFloatConstant()->GetValue();
       } else if (constant->IsDoubleConstant()) {
-        // TODO: Remove "OrNull".
-        stream << constant->AsDoubleConstantOrNull()->GetValue();
+        stream << constant->AsDoubleConstant()->GetValue();
       } else if (constant->IsNullConstant()) {
         stream << "null";
       }
@@ -629,8 +625,7 @@
 
   void VisitVecDotProd(HVecDotProd* instruction) override {
     VisitVecOperation(instruction);
-    // TODO: Remove "OrNull".
-    DataType::Type arg_type = instruction->InputAt(1)->AsVecOperationOrNull()->GetPackedType();
+    DataType::Type arg_type = instruction->InputAt(1)->AsVecOperation()->GetPackedType();
     StartAttributeStream("type") << (instruction->IsZeroExtending() ?
                                     DataType::ToUnsigned(arg_type) :
                                     DataType::ToSigned(arg_type));
@@ -752,14 +747,13 @@
         && (instruction->GetType() == DataType::Type::kReference ||
             instruction->IsInstanceOf() ||
             instruction->IsCheckCast())) {
-      // TODO: Remove "OrNull".
       ReferenceTypeInfo info = (instruction->GetType() == DataType::Type::kReference)
           ? instruction->IsLoadClass()
-              ? instruction->AsLoadClassOrNull()->GetLoadedClassRTI()
+              ? instruction->AsLoadClass()->GetLoadedClassRTI()
               : instruction->GetReferenceTypeInfo()
           : instruction->IsInstanceOf()
-              ? instruction->AsInstanceOfOrNull()->GetTargetClassRTI()
-              : instruction->AsCheckCastOrNull()->GetTargetClassRTI();
+              ? instruction->AsInstanceOf()->GetTargetClassRTI()
+              : instruction->AsCheckCast()->GetTargetClassRTI();
       ScopedObjectAccess soa(Thread::Current());
       if (info.IsValid()) {
         StartAttributeStream("klass")
diff --git a/compiler/optimizing/gvn.cc b/compiler/optimizing/gvn.cc
index cccb381..a6ca057 100644
--- a/compiler/optimizing/gvn.cc
+++ b/compiler/optimizing/gvn.cc
@@ -498,12 +498,10 @@
     // Deoptimize is a special case since even though we don't want to move it we can still remove
     // it for GVN.
     if (current->CanBeMoved() || current->IsBoundType() || current->IsDeoptimize()) {
-      // TODO: Remove "OrNull".
-      if (current->IsBinaryOperation() && current->AsBinaryOperationOrNull()->IsCommutative()) {
+      if (current->IsBinaryOperation() && current->AsBinaryOperation()->IsCommutative()) {
         // For commutative ops, (x op y) will be treated the same as (y op x)
         // after fixed ordering.
-        // TODO: Remove "OrNull".
-        current->AsBinaryOperationOrNull()->OrderInputs();
+        current->AsBinaryOperation()->OrderInputs();
       }
       HInstruction* existing = set->Lookup(current);
       if (existing != nullptr) {
diff --git a/compiler/optimizing/induction_var_analysis.cc b/compiler/optimizing/induction_var_analysis.cc
index e54d12b..be6c268 100644
--- a/compiler/optimizing/induction_var_analysis.cc
+++ b/compiler/optimizing/induction_var_analysis.cc
@@ -89,14 +89,12 @@
   if (!control->IsIf()) {
     return false;
   }
-  // TODO: Remove "OrNull".
-  HIf* ifs = control->AsIfOrNull();
+  HIf* ifs = control->AsIf();
   HInstruction* if_expr = ifs->InputAt(0);
   if (if_expr->IsCondition()) {
-    // TODO: Remove "OrNull".
     IfCondition other_cmp = ifs->IfTrueSuccessor() == entry
-        ? if_expr->AsConditionOrNull()->GetCondition()
-        : if_expr->AsConditionOrNull()->GetOppositeCondition();
+        ? if_expr->AsCondition()->GetCondition()
+        : if_expr->AsCondition()->GetOppositeCondition();
     if (if_expr->InputAt(0) == a && if_expr->InputAt(1) == b) {
       return cmp == other_cmp;
     } else if (if_expr->InputAt(1) == a && if_expr->InputAt(0) == b) {
@@ -437,10 +435,9 @@
   } else if (instruction->IsSelect()) {
     info = TransferPhi(loop, instruction, /*input_index*/ 0, /*adjust_input_size*/ 1);
   } else if (instruction->IsTypeConversion()) {
-    // TODO: Remove "OrNull".
     info = TransferConversion(LookupInfo(loop, instruction->InputAt(0)),
-                              instruction->AsTypeConversionOrNull()->GetInputType(),
-                              instruction->AsTypeConversionOrNull()->GetResultType());
+                              instruction->AsTypeConversion()->GetInputType(),
+                              instruction->AsTypeConversion()->GetResultType());
   } else if (instruction->IsBoundsCheck()) {
     info = LookupInfo(loop, instruction->InputAt(0));  // Pass-through.
   }
@@ -476,8 +473,7 @@
   // Store interesting cycle in each loop phi.
   for (size_t i = 0; i < size; i++) {
     if (scc[i]->IsLoopHeaderPhi()) {
-      // TODO: Remove "OrNull".
-      AssignCycle(scc[i]->AsPhiOrNull(), ArrayRef<HInstruction* const>(scc));
+      AssignCycle(scc[i]->AsPhi(), ArrayRef<HInstruction* const>(scc));
     }
   }
 
@@ -552,8 +548,7 @@
       // Select acts like Phi.
       update = SolvePhi(instruction, /*input_index=*/ 0, /*adjust_input_size=*/ 1, cycle);
     } else if (instruction->IsTypeConversion()) {
-      // TODO: Remove "OrNull".
-      update = SolveConversion(loop, phi, instruction->AsTypeConversionOrNull(), cycle, &type);
+      update = SolveConversion(loop, phi, instruction->AsTypeConversion(), cycle, &type);
     }
     if (update == nullptr) {
       return;
@@ -1003,8 +998,7 @@
 void HInductionVarAnalysis::VisitControl(const HLoopInformation* loop) {
   HInstruction* control = loop->GetHeader()->GetLastInstruction();
   if (control->IsIf()) {
-    // TODO: Remove "OrNull".
-    HIf* ifs = control->AsIfOrNull();
+    HIf* ifs = control->AsIf();
     HBasicBlock* if_true = ifs->IfTrueSuccessor();
     HBasicBlock* if_false = ifs->IfFalseSuccessor();
     HInstruction* if_expr = ifs->InputAt(0);
@@ -1012,8 +1006,7 @@
     // loop-header: ....
     //              if (condition) goto X
     if (if_expr->IsCondition()) {
-      // TODO: Remove "OrNull".
-      HCondition* condition = if_expr->AsConditionOrNull();
+      HCondition* condition = if_expr->AsCondition();
       const HBasicBlock* context = condition->GetBlock();
       InductionInfo* a = LookupInfo(loop, condition->InputAt(0));
       InductionInfo* b = LookupInfo(loop, condition->InputAt(1));
@@ -1259,8 +1252,7 @@
     return false;
   }
   // Simple terminating i != U condition, used nowhere else.
-  // TODO: Remove "OrNull".
-  HIf* ifs = loop->GetHeader()->GetLastInstruction()->AsIfOrNull();
+  HIf* ifs = loop->GetHeader()->GetLastInstruction()->AsIf();
   HInstruction* cond = ifs->InputAt(0);
   if (ifs->GetPrevious() != cond || !cond->HasOnlyOneNonEnvironmentUse()) {
     return false;
@@ -1523,11 +1515,9 @@
 std::string HInductionVarAnalysis::FetchToString(HInstruction* fetch) {
   DCHECK(fetch != nullptr);
   if (fetch->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    return std::to_string(fetch->AsIntConstantOrNull()->GetValue());
+    return std::to_string(fetch->AsIntConstant()->GetValue());
   } else if (fetch->IsLongConstant()) {
-    // TODO: Remove "OrNull".
-    return std::to_string(fetch->AsLongConstantOrNull()->GetValue());
+    return std::to_string(fetch->AsLongConstant()->GetValue());
   }
   return std::to_string(fetch->GetId()) + ":" + fetch->DebugName();
 }
@@ -1619,8 +1609,7 @@
       // If the input is not a loop header phi, we only have 1 (current_phi).
       int current_value = 1;
       if (current_phi->InputAt(index)->IsLoopHeaderPhi()) {
-        // TODO: Remove "OrNull".
-        HPhi* loop_header_phi = current_phi->InputAt(index)->AsPhiOrNull();
+        HPhi* loop_header_phi = current_phi->InputAt(index)->AsPhi();
         auto it = cached_values.find(loop_header_phi);
         if (it != cached_values.end()) {
           current_value += it->second;
@@ -1661,8 +1650,7 @@
 
     for (HInstructionIterator it(block->GetPhis()); !it.Done(); it.Advance()) {
       DCHECK(it.Current()->IsLoopHeaderPhi());
-      // TODO: Remove "OrNull".
-      HPhi* phi = it.Current()->AsPhiOrNull();
+      HPhi* phi = it.Current()->AsPhi();
       CalculateLoopHeaderPhisInARow(phi, cached_values, local_allocator);
       DCHECK(cached_values.find(phi) != cached_values.end())
           << " we should have a value for Phi " << phi->GetId()
diff --git a/compiler/optimizing/induction_var_range.cc b/compiler/optimizing/induction_var_range.cc
index 107a2c3..9b78699 100644
--- a/compiler/optimizing/induction_var_range.cc
+++ b/compiler/optimizing/induction_var_range.cc
@@ -171,9 +171,8 @@
   // one edge leaving the loop. The loop header is the only block that's both inside
   // the loop and not in the loop body.
   DCHECK(GetLoopControl(loop)->IsIf());
-  // TODO: Remove "OrNull".
-  DCHECK_NE(loop->Contains(*GetLoopControl(loop)->AsIfOrNull()->IfTrueSuccessor()),
-            loop->Contains(*GetLoopControl(loop)->AsIfOrNull()->IfFalseSuccessor()));
+  DCHECK_NE(loop->Contains(*GetLoopControl(loop)->AsIf()->IfTrueSuccessor()),
+            loop->Contains(*GetLoopControl(loop)->AsIf()->IfFalseSuccessor()));
   if (loop->Contains(*context)) {
     // Use the full trip count if determining the maximum and context is not in the loop body.
     DCHECK_NE(context == loop->GetHeader(), IsContextInBody(context, loop));
@@ -183,10 +182,8 @@
     // as long as the `context` is dominated by the loop control exit block.
     // If there are additional exit edges, the value is unknown on those paths.
     HInstruction* loop_control = GetLoopControl(loop);
-    // TODO: Remove "OrNull".
-    HBasicBlock* then_block = loop_control->AsIfOrNull()->IfTrueSuccessor();
-    // TODO: Remove "OrNull".
-    HBasicBlock* else_block = loop_control->AsIfOrNull()->IfFalseSuccessor();
+    HBasicBlock* then_block = loop_control->AsIf()->IfTrueSuccessor();
+    HBasicBlock* else_block = loop_control->AsIf()->IfFalseSuccessor();
     HBasicBlock* loop_exit_block = loop->Contains(*then_block) ? else_block : then_block;
     return loop_exit_block->Dominates(context);
   }
@@ -738,15 +735,13 @@
       return is_min ? Value(0) : Value(std::numeric_limits<int32_t>::max());
     } else if (instruction->InputAt(0)->IsNewArray()) {
       return GetFetch(
-          // TODO: Remove "OrNull".
-          context, loop, instruction->InputAt(0)->AsNewArrayOrNull()->GetLength(), trip, is_min);
+          context, loop, instruction->InputAt(0)->AsNewArray()->GetLength(), trip, is_min);
     }
   } else if (instruction->IsTypeConversion()) {
     // Since analysis is 32-bit (or narrower), chase beyond widening along the path.
     // For example, this discovers the length in: for (long i = 0; i < a.length; i++);
-    // TODO: Remove "OrNull".
-    if (instruction->AsTypeConversionOrNull()->GetInputType() == DataType::Type::kInt32 &&
-        instruction->AsTypeConversionOrNull()->GetResultType() == DataType::Type::kInt64) {
+    if (instruction->AsTypeConversion()->GetInputType() == DataType::Type::kInt32 &&
+        instruction->AsTypeConversion()->GetResultType() == DataType::Type::kInt64) {
       return GetFetch(context, loop, instruction->InputAt(0), trip, is_min);
     }
   }
diff --git a/compiler/optimizing/induction_var_range.h b/compiler/optimizing/induction_var_range.h
index 356a04a..3e1212b 100644
--- a/compiler/optimizing/induction_var_range.h
+++ b/compiler/optimizing/induction_var_range.h
@@ -139,8 +139,7 @@
   void ReVisit(const HLoopInformation* loop) {
     induction_analysis_->induction_.erase(loop);
     for (HInstructionIterator it(loop->GetHeader()->GetPhis()); !it.Done(); it.Advance()) {
-      // TODO: Remove "OrNull".
-      induction_analysis_->cycles_.erase(it.Current()->AsPhiOrNull());
+      induction_analysis_->cycles_.erase(it.Current()->AsPhi());
     }
     induction_analysis_->VisitLoop(loop);
   }
diff --git a/compiler/optimizing/induction_var_range_test.cc b/compiler/optimizing/induction_var_range_test.cc
index 9c84a75..d879897 100644
--- a/compiler/optimizing/induction_var_range_test.cc
+++ b/compiler/optimizing/induction_var_range_test.cc
@@ -50,8 +50,7 @@
 
   void ExpectInt(int32_t value, HInstruction* i) {
     ASSERT_TRUE(i->IsIntConstant());
-    // TODO: Remove "OrNull".
-    EXPECT_EQ(value, i->AsIntConstantOrNull()->GetValue());
+    EXPECT_EQ(value, i->AsIntConstant()->GetValue());
   }
 
   //
diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc
index 2185fc0..443392b 100644
--- a/compiler/optimizing/inliner.cc
+++ b/compiler/optimizing/inliner.cc
@@ -467,8 +467,7 @@
   ArtMethod* resolved_method = invoke_instruction->GetResolvedMethod();
   if (resolved_method == nullptr) {
     DCHECK(invoke_instruction->IsInvokeStaticOrDirect());
-    // TODO: Remove "OrNull".
-    DCHECK(invoke_instruction->AsInvokeStaticOrDirectOrNull()->IsStringInit());
+    DCHECK(invoke_instruction->AsInvokeStaticOrDirect()->IsStringInit());
     LOG_FAIL_NO_STAT() << "Not inlining a String.<init> method";
     return false;
   }
@@ -1147,10 +1146,9 @@
   PointerSize pointer_size = class_linker->GetImagePointerSize();
 
   ArtMethod* actual_method = nullptr;
-  // TODO: Remove "OrNull".
   size_t method_index = invoke_instruction->IsInvokeVirtual()
-      ? invoke_instruction->AsInvokeVirtualOrNull()->GetVTableIndex()
-      : invoke_instruction->AsInvokeInterfaceOrNull()->GetImtIndex();
+      ? invoke_instruction->AsInvokeVirtual()->GetVTableIndex()
+      : invoke_instruction->AsInvokeInterface()->GetImtIndex();
 
   // Check whether we are actually calling the same method among
   // the different types seen.
@@ -1466,8 +1464,7 @@
   }
 
   if (invoke_instruction->IsInvokeStaticOrDirect() &&
-      // TODO: Remove "OrNull".
-      invoke_instruction->AsInvokeStaticOrDirectOrNull()->IsStaticWithImplicitClinitCheck()) {
+      invoke_instruction->AsInvokeStaticOrDirect()->IsStaticWithImplicitClinitCheck()) {
     // Case of a static method that cannot be inlined because it implicitly
     // requires an initialization check of its declaring class.
     LOG_FAIL(stats_, MethodCompilationStat::kNotInlinedDexCacheClinitCheck)
@@ -1853,21 +1850,15 @@
       if (argument->IsNullConstant()) {
         current->ReplaceWith(callee_graph->GetNullConstant());
       } else if (argument->IsIntConstant()) {
-        // TODO: Remove "OrNull".
-        current->ReplaceWith(
-            callee_graph->GetIntConstant(argument->AsIntConstantOrNull()->GetValue()));
+        current->ReplaceWith(callee_graph->GetIntConstant(argument->AsIntConstant()->GetValue()));
       } else if (argument->IsLongConstant()) {
-        // TODO: Remove "OrNull".
-        current->ReplaceWith(
-            callee_graph->GetLongConstant(argument->AsLongConstantOrNull()->GetValue()));
+        current->ReplaceWith(callee_graph->GetLongConstant(argument->AsLongConstant()->GetValue()));
       } else if (argument->IsFloatConstant()) {
-        // TODO: Remove "OrNull".
         current->ReplaceWith(
-            callee_graph->GetFloatConstant(argument->AsFloatConstantOrNull()->GetValue()));
+            callee_graph->GetFloatConstant(argument->AsFloatConstant()->GetValue()));
       } else if (argument->IsDoubleConstant()) {
-        // TODO: Remove "OrNull".
         current->ReplaceWith(
-            callee_graph->GetDoubleConstant(argument->AsDoubleConstantOrNull()->GetValue()));
+            callee_graph->GetDoubleConstant(argument->AsDoubleConstant()->GetValue()));
       } else if (argument->GetType() == DataType::Type::kReference) {
         if (!resolved_method->IsStatic() && parameter_index == 0 && receiver_type.IsValid()) {
           run_rtp = true;
@@ -1875,8 +1866,7 @@
         } else {
           current->SetReferenceTypeInfoIfValid(argument->GetReferenceTypeInfo());
         }
-        // TODO: Remove "OrNull".
-        current->AsParameterValueOrNull()->SetCanBeNull(argument->CanBeNull());
+        current->AsParameterValue()->SetCanBeNull(argument->CanBeNull());
       }
       ++parameter_index;
     }
@@ -2337,8 +2327,7 @@
                                     return_replacement)) {
         return true;
       } else if (return_replacement->IsInstanceFieldGet()) {
-        // TODO: Remove "OrNull".
-        HInstanceFieldGet* field_get = return_replacement->AsInstanceFieldGetOrNull();
+        HInstanceFieldGet* field_get = return_replacement->AsInstanceFieldGet();
         if (field_get->GetFieldInfo().GetField() ==
                 GetClassRoot<mirror::Object>()->GetInstanceField(0)) {
           return true;
diff --git a/compiler/optimizing/instruction_builder.cc b/compiler/optimizing/instruction_builder.cc
index f461be9..2576b02 100644
--- a/compiler/optimizing/instruction_builder.cc
+++ b/compiler/optimizing/instruction_builder.cc
@@ -268,14 +268,12 @@
       if (local_value == nullptr) {
         // This is the first instruction throwing into `catch_block` where
         // `vreg` is undefined. Delete the catch phi.
-        // TODO: Remove "OrNull".
-        catch_block->RemovePhi(handler_value->AsPhiOrNull());
+        catch_block->RemovePhi(handler_value->AsPhi());
         (*handler_locals)[vreg] = nullptr;
       } else {
         // Vreg has been defined at all instructions throwing into `catch_block`
         // encountered so far. Record the local value in the catch phi.
-        // TODO: Remove "OrNull".
-        handler_value->AsPhiOrNull()->AddInput(local_value);
+        handler_value->AsPhi()->AddInput(local_value);
       }
     }
   }
@@ -323,8 +321,7 @@
   for (size_t i = loop_headers_.size(); i > 0; --i) {
     HBasicBlock* block = loop_headers_[i - 1];
     for (HInstructionIterator it(block->GetPhis()); !it.Done(); it.Advance()) {
-      // TODO: Remove "OrNull".
-      HPhi* phi = it.Current()->AsPhiOrNull();
+      HPhi* phi = it.Current()->AsPhi();
       size_t vreg = phi->GetRegNumber();
       for (HBasicBlock* predecessor : block->GetPredecessors()) {
         HInstruction* value = ValueOfLocalAt(predecessor, vreg);
@@ -1470,8 +1467,7 @@
     //
     // Do not emit an HConstructorFence here since it can inhibit some String new-instance
     // optimizations (to pass checker tests that rely on those optimizations).
-    // TODO: Remove "OrNull".
-    HNewInstance* new_inst = allocation->AsNewInstanceOrNull();
+    HNewInstance* new_inst = allocation->AsNewInstance();
     HLoadClass* load_class = new_inst->GetLoadClass();
 
     Thread* self = Thread::Current();
@@ -1840,20 +1836,15 @@
 
   if (invoke->IsInvokeStaticOrDirect() &&
       HInvokeStaticOrDirect::NeedsCurrentMethodInput(
-          // TODO: Remove "OrNull".
-          invoke->AsInvokeStaticOrDirectOrNull()->GetDispatchInfo())) {
-    // TODO: Remove "OrNull".
-    DCHECK_EQ(argument_index, invoke->AsInvokeStaticOrDirectOrNull()->GetCurrentMethodIndex());
+          invoke->AsInvokeStaticOrDirect()->GetDispatchInfo())) {
+    DCHECK_EQ(argument_index, invoke->AsInvokeStaticOrDirect()->GetCurrentMethodIndex());
     DCHECK(invoke->InputAt(argument_index) == nullptr);
     invoke->SetRawInputAt(argument_index, graph_->GetCurrentMethod());
   }
 
   if (invoke->IsInvokeInterface() &&
-      // TODO: Remove "OrNull".
-      (invoke->AsInvokeInterfaceOrNull()->GetHiddenArgumentLoadKind() ==
-           MethodLoadKind::kRecursive)) {
-    // TODO: Remove "OrNull".
-    invoke->SetRawInputAt(invoke->AsInvokeInterfaceOrNull()->GetNumberOfArguments() - 1,
+      (invoke->AsInvokeInterface()->GetHiddenArgumentLoadKind() == MethodLoadKind::kRecursive)) {
+    invoke->SetRawInputAt(invoke->AsInvokeInterface()->GetNumberOfArguments() - 1,
                           graph_->GetCurrentMethod());
   }
 
@@ -1865,8 +1856,7 @@
                                        const char* shorty,
                                        bool is_unresolved) {
   DCHECK_IMPLIES(invoke->IsInvokeStaticOrDirect(),
-                 // TODO: Remove "OrNull".
-                 !invoke->AsInvokeStaticOrDirectOrNull()->IsStringInit());
+                 !invoke->AsInvokeStaticOrDirect()->IsStringInit());
 
   ReceiverArg receiver_arg = (invoke->GetInvokeType() == InvokeType::kStatic)
       ? ReceiverArg::kNone
@@ -1924,8 +1914,7 @@
     case Intrinsics::kDoubleIsNaN: {
       // IsNaN(x) is the same as x != x.
       instruction = new (allocator_) HNotEqual(/*first=*/ nullptr, /*second=*/ nullptr, dex_pc);
-      // TODO: Remove "OrNull".
-      instruction->AsConditionOrNull()->SetBias(ComparisonBias::kLtBias);
+      instruction->AsCondition()->SetBias(ComparisonBias::kLtBias);
       break;
     }
     case Intrinsics::kStringCharAt:
@@ -2072,8 +2061,7 @@
                                            const InstructionOperands& operands,
                                            const char* shorty) {
   DCHECK(invoke->IsInvokeStaticOrDirect());
-  // TODO: Remove "OrNull".
-  DCHECK(invoke->AsInvokeStaticOrDirectOrNull()->IsStringInit());
+  DCHECK(invoke->AsInvokeStaticOrDirect()->IsStringInit());
 
   if (!SetupInvokeArguments(invoke, operands, shorty, ReceiverArg::kIgnored)) {
     return false;
@@ -2089,8 +2077,7 @@
   // Replacing the NewInstance might render it redundant. Keep a list of these
   // to be visited once it is clear whether it has remaining uses.
   if (arg_this->IsNewInstance()) {
-    // TODO: Remove "OrNull".
-    ssa_builder_->AddUninitializedString(arg_this->AsNewInstanceOrNull());
+    ssa_builder_->AddUninitializedString(arg_this->AsNewInstance());
   } else {
     DCHECK(arg_this->IsPhi());
     // We can get a phi as input of a String.<init> if there is a loop between the
@@ -2379,10 +2366,8 @@
   }
 
   if (!second_is_constant ||
-      // TODO: Remove "OrNull".
-      (type == DataType::Type::kInt32 && second->AsIntConstantOrNull()->GetValue() == 0) ||
-      // TODO: Remove "OrNull".
-      (type == DataType::Type::kInt64 && second->AsLongConstantOrNull()->GetValue() == 0)) {
+      (type == DataType::Type::kInt32 && second->AsIntConstant()->GetValue() == 0) ||
+      (type == DataType::Type::kInt64 && second->AsLongConstant()->GetValue() == 0)) {
     second = new (allocator_) HDivZeroCheck(second, dex_pc);
     AppendInstruction(second);
   }
@@ -2878,8 +2863,7 @@
       uint32_t reg_number = instruction.VRegB();
       HInstruction* value = (*current_locals_)[reg_number];
       if (value->IsIntConstant()) {
-        // TODO: Remove "OrNull".
-        DCHECK_EQ(value->AsIntConstantOrNull()->GetValue(), 0);
+        DCHECK_EQ(value->AsIntConstant()->GetValue(), 0);
       } else if (value->IsPhi()) {
         DCHECK(value->GetType() == DataType::Type::kInt32 ||
                value->GetType() == DataType::Type::kReference);
diff --git a/compiler/optimizing/instruction_simplifier.cc b/compiler/optimizing/instruction_simplifier.cc
index 43129d1..0d2c252 100644
--- a/compiler/optimizing/instruction_simplifier.cc
+++ b/compiler/optimizing/instruction_simplifier.cc
@@ -192,10 +192,8 @@
 bool InstructionSimplifierVisitor::TryMoveNegOnInputsAfterBinop(HBinaryOperation* binop) {
   DCHECK(binop->IsAdd() || binop->IsSub());
   DCHECK(binop->GetLeft()->IsNeg() && binop->GetRight()->IsNeg());
-  // TODO: Remove "OrNull".
-  HNeg* left_neg = binop->GetLeft()->AsNegOrNull();
-  // TODO: Remove "OrNull".
-  HNeg* right_neg = binop->GetRight()->AsNegOrNull();
+  HNeg* left_neg = binop->GetLeft()->AsNeg();
+  HNeg* right_neg = binop->GetRight()->AsNeg();
   if (!left_neg->HasOnlyOneNonEnvironmentUse() ||
       !right_neg->HasOnlyOneNonEnvironmentUse()) {
     return false;
@@ -315,8 +313,7 @@
   // whether all uses are on different control-flow paths (using dominance and
   // reverse-dominance information) and only perform the merge when they are.
   HInstruction* accumulator = nullptr;
-  // TODO: Remove "OrNull".
-  HVecBinaryOperation* vec_binop = binop->AsVecBinaryOperationOrNull();
+  HVecBinaryOperation* vec_binop = binop->AsVecBinaryOperation();
   HInstruction* binop_left = vec_binop->GetLeft();
   HInstruction* binop_right = vec_binop->GetRight();
   // This is always true since the `HVecMul` has only one use (which is checked above).
@@ -374,8 +371,7 @@
       : kMaxIntShiftDistance;
 
   if (shift_amount->IsConstant()) {
-    // TODO: Remove "OrNull".
-    int64_t cst = Int64FromConstant(shift_amount->AsConstantOrNull());
+    int64_t cst = Int64FromConstant(shift_amount->AsConstant());
     int64_t masked_cst = cst & implicit_mask;
     if (masked_cst == 0) {
       // Replace code looking like
@@ -416,8 +412,7 @@
       shift_amount->IsAdd() ||
       shift_amount->IsSub()) {
     int64_t required_result = shift_amount->IsAnd() ? implicit_mask : 0;
-    // TODO: Remove "OrNull".
-    HBinaryOperation* bin_op = shift_amount->AsBinaryOperationOrNull();
+    HBinaryOperation* bin_op = shift_amount->AsBinaryOperation();
     HConstant* mask = bin_op->GetConstantRight();
     if (mask != nullptr && (Int64FromConstant(mask) & implicit_mask) == required_result) {
       instruction->ReplaceInput(bin_op->GetLeastConstantLeft(), 1);
@@ -429,8 +424,7 @@
     DataType::Type source_type = shift_amount->InputAt(0)->GetType();
     // Non-integral and 64-bit source types require an explicit type conversion.
     if (DataType::IsIntegralType(source_type) && !DataType::Is64BitType(source_type)) {
-      // TODO: Remove "OrNull".
-      instruction->ReplaceInput(shift_amount->AsTypeConversionOrNull()->GetInput(), 1);
+      instruction->ReplaceInput(shift_amount->AsTypeConversion()->GetInput(), 1);
       RecordSimplification();
       return;
     }
@@ -440,8 +434,7 @@
 static bool IsSubRegBitsMinusOther(HSub* sub, size_t reg_bits, HInstruction* other) {
   return (sub->GetRight() == other &&
           sub->GetLeft()->IsConstant() &&
-          // TODO: Remove "OrNull".
-          (Int64FromConstant(sub->GetLeft()->AsConstantOrNull()) & (reg_bits - 1)) == 0);
+          (Int64FromConstant(sub->GetLeft()->AsConstant()) & (reg_bits - 1)) == 0);
 }
 
 bool InstructionSimplifierVisitor::ReplaceRotateWithRor(HBinaryOperation* op,
@@ -474,10 +467,8 @@
   HInstruction* right = op->GetRight();
   // If we have an UShr and a Shl (in either order).
   if ((left->IsUShr() && right->IsShl()) || (left->IsShl() && right->IsUShr())) {
-    // TODO: Remove "OrNull".
-    HUShr* ushr = left->IsUShr() ? left->AsUShrOrNull() : right->AsUShrOrNull();
-    // TODO: Remove "OrNull".
-    HShl* shl = left->IsShl() ? left->AsShlOrNull() : right->AsShlOrNull();
+    HUShr* ushr = left->IsUShr() ? left->AsUShr() : right->AsUShr();
+    HShl* shl = left->IsShl() ? left->AsShl() : right->AsShl();
     DCHECK(DataType::IsIntOrLongType(ushr->GetType()));
     if (ushr->GetType() == shl->GetType() &&
         ushr->GetLeft() == shl->GetLeft()) {
@@ -512,10 +503,8 @@
                                                                        HShl* shl) {
   DCHECK(op->IsAdd() || op->IsXor() || op->IsOr());
   size_t reg_bits = DataType::Size(ushr->GetType()) * kBitsPerByte;
-  // TODO: Remove "OrNull".
-  size_t rdist = Int64FromConstant(ushr->GetRight()->AsConstantOrNull());
-  // TODO: Remove "OrNull".
-  size_t ldist = Int64FromConstant(shl->GetRight()->AsConstantOrNull());
+  size_t rdist = Int64FromConstant(ushr->GetRight()->AsConstant());
+  size_t ldist = Int64FromConstant(shl->GetRight()->AsConstant());
   if (((ldist + rdist) & (reg_bits - 1)) == 0) {
     ReplaceRotateWithRor(op, ushr, shl);
     return true;
@@ -545,8 +534,7 @@
   DCHECK(op->IsAdd() || op->IsXor() || op->IsOr());
   DCHECK(ushr->GetRight()->IsNeg() || shl->GetRight()->IsNeg());
   bool neg_is_left = shl->GetRight()->IsNeg();
-  // TODO: Remove "OrNull".
-  HNeg* neg = neg_is_left ? shl->GetRight()->AsNegOrNull() : ushr->GetRight()->AsNegOrNull();
+  HNeg* neg = neg_is_left ? shl->GetRight()->AsNeg() : ushr->GetRight()->AsNeg();
   // And the shift distance being negated is the distance being shifted the other way.
   if (neg->InputAt(0) == (neg_is_left ? ushr->GetRight() : shl->GetRight())) {
     ReplaceRotateWithRor(op, ushr, shl);
@@ -578,12 +566,8 @@
   size_t reg_bits = DataType::Size(ushr->GetType()) * kBitsPerByte;
   HInstruction* shl_shift = shl->GetRight();
   HInstruction* ushr_shift = ushr->GetRight();
-  if ((shl_shift->IsSub() &&
-       // TODO: Remove "OrNull".
-       IsSubRegBitsMinusOther(shl_shift->AsSubOrNull(), reg_bits, ushr_shift)) ||
-      (ushr_shift->IsSub() &&
-       // TODO: Remove "OrNull".
-       IsSubRegBitsMinusOther(ushr_shift->AsSubOrNull(), reg_bits, shl_shift))) {
+  if ((shl_shift->IsSub() && IsSubRegBitsMinusOther(shl_shift->AsSub(), reg_bits, ushr_shift)) ||
+      (ushr_shift->IsSub() && IsSubRegBitsMinusOther(ushr_shift->AsSub(), reg_bits, shl_shift))) {
     return ReplaceRotateWithRor(op, ushr, shl);
   }
   return false;
@@ -805,14 +789,12 @@
       HBasicBlock* block = equal->GetBlock();
       // We are comparing the boolean to a constant which is of type int and can
       // be any constant.
-      // TODO: Remove "OrNull".
-      if (input_const->AsIntConstantOrNull()->IsTrue()) {
+      if (input_const->AsIntConstant()->IsTrue()) {
         // Replace (bool_value == true) with bool_value
         equal->ReplaceWith(input_value);
         block->RemoveInstruction(equal);
         RecordSimplification();
-        // TODO: Remove "OrNull".
-      } else if (input_const->AsIntConstantOrNull()->IsFalse()) {
+      } else if (input_const->AsIntConstant()->IsFalse()) {
         // Replace (bool_value == false) with !bool_value
         equal->ReplaceWith(GetGraph()->InsertOppositeCondition(input_value, equal));
         block->RemoveInstruction(equal);
@@ -839,14 +821,12 @@
       HBasicBlock* block = not_equal->GetBlock();
       // We are comparing the boolean to a constant which is of type int and can
       // be any constant.
-      // TODO: Remove "OrNull".
-      if (input_const->AsIntConstantOrNull()->IsTrue()) {
+      if (input_const->AsIntConstant()->IsTrue()) {
         // Replace (bool_value != true) with !bool_value
         not_equal->ReplaceWith(GetGraph()->InsertOppositeCondition(input_value, not_equal));
         block->RemoveInstruction(not_equal);
         RecordSimplification();
-        // TODO: Remove "OrNull".
-      } else if (input_const->AsIntConstantOrNull()->IsFalse()) {
+      } else if (input_const->AsIntConstant()->IsFalse()) {
         // Replace (bool_value != false) with bool_value
         not_equal->ReplaceWith(input_value);
         block->RemoveInstruction(not_equal);
@@ -871,12 +851,10 @@
 
   if (input->IsIntConstant()) {
     // Replace !(true/false) with false/true.
-    // TODO: Remove "OrNull".
-    if (input->AsIntConstantOrNull()->IsTrue()) {
+    if (input->AsIntConstant()->IsTrue()) {
       replace_with = GetGraph()->GetIntConstant(0);
     } else {
-      // TODO: Remove "OrNull".
-      DCHECK(input->AsIntConstantOrNull()->IsFalse()) << input->AsIntConstantOrNull()->GetValue();
+      DCHECK(input->AsIntConstant()->IsFalse()) << input->AsIntConstant()->GetValue();
       replace_with = GetGraph()->GetIntConstant(1);
     }
   } else if (input->IsBooleanNot()) {
@@ -887,8 +865,7 @@
              // NaNs forces the compares to be done as written by the user.
              !DataType::IsFloatingPointType(input->InputAt(0)->GetType())) {
     // Replace condition with its opposite.
-    // TODO: Remove "OrNull".
-    replace_with = GetGraph()->InsertOppositeCondition(input->AsConditionOrNull(), bool_not);
+    replace_with = GetGraph()->InsertOppositeCondition(input->AsCondition(), bool_not);
   }
 
   if (replace_with != nullptr) {
@@ -956,10 +933,8 @@
   if (IsInt64AndGet(b, /*out*/ &value) &&
       (((cmp == kCondLT || cmp == kCondLE) && c->IsMax()) ||
        ((cmp == kCondGT || cmp == kCondGE) && c->IsMin()))) {
-    // TODO: Remove "OrNull".
-    HConstant* other = c->AsBinaryOperationOrNull()->GetConstantRight();
-    // TODO: Remove "OrNull".
-    if (other != nullptr && a == c->AsBinaryOperationOrNull()->GetLeastConstantLeft()) {
+    HConstant* other = c->AsBinaryOperation()->GetConstantRight();
+    if (other != nullptr && a == c->AsBinaryOperation()->GetLeastConstantLeft()) {
       int64_t other_value = Int64FromConstant(other);
       bool is_max = (cmp == kCondLT || cmp == kCondLE);
       // Allow the max for a <  100 ? max(a, -100) : ..
@@ -1053,32 +1028,24 @@
     // Replace (cond ? x : x) with (x).
     replace_with = true_value;
   } else if (condition->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    if (condition->AsIntConstantOrNull()->IsTrue()) {
+    if (condition->AsIntConstant()->IsTrue()) {
       // Replace (true ? x : y) with (x).
       replace_with = true_value;
     } else {
       // Replace (false ? x : y) with (y).
-      // TODO: Remove "OrNull".
-      DCHECK(condition->AsIntConstantOrNull()->IsFalse())
-          << condition->AsIntConstantOrNull()->GetValue();
+      DCHECK(condition->AsIntConstant()->IsFalse()) << condition->AsIntConstant()->GetValue();
       replace_with = false_value;
     }
   } else if (true_value->IsIntConstant() && false_value->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    if (true_value->AsIntConstantOrNull()->IsTrue() &&
-        false_value->AsIntConstantOrNull()->IsFalse()) {
+    if (true_value->AsIntConstant()->IsTrue() && false_value->AsIntConstant()->IsFalse()) {
       // Replace (cond ? true : false) with (cond).
       replace_with = condition;
-      // TODO: Remove "OrNull".
-    } else if (true_value->AsIntConstantOrNull()->IsFalse() &&
-        false_value->AsIntConstantOrNull()->IsTrue()) {
+    } else if (true_value->AsIntConstant()->IsFalse() && false_value->AsIntConstant()->IsTrue()) {
       // Replace (cond ? false : true) with (!cond).
       replace_with = GetGraph()->InsertOppositeCondition(condition, select);
     }
   } else if (condition->IsCondition()) {
-    // TODO: Remove "OrNull".
-    IfCondition cmp = condition->AsConditionOrNull()->GetCondition();
+    IfCondition cmp = condition->AsCondition()->GetCondition();
     HInstruction* a = condition->InputAt(0);
     HInstruction* b = condition->InputAt(1);
     DataType::Type t_type = true_value->GetType();
@@ -1159,8 +1126,7 @@
   // If the array is a NewArray with constant size, replace the array length
   // with the constant instruction. This helps the bounds check elimination phase.
   if (input->IsNewArray()) {
-    // TODO: Remove "OrNull".
-    input = input->AsNewArrayOrNull()->GetLength();
+    input = input->AsNewArray()->GetLength();
     if (input->IsIntConstant()) {
       instruction->ReplaceWith(input);
     }
@@ -1178,8 +1144,7 @@
   }
 
   if (value->IsArrayGet()) {
-    // TODO: Remove "OrNull".
-    if (value->AsArrayGetOrNull()->GetArray() == instruction->GetArray()) {
+    if (value->AsArrayGet()->GetArray() == instruction->GetArray()) {
       // If the code is just swapping elements in the array, no need for a type check.
       instruction->ClearTypeCheck();
       return;
@@ -1255,21 +1220,16 @@
 
 static inline bool TryReplaceFieldOrArrayGetType(HInstruction* maybe_get, DataType::Type new_type) {
   if (maybe_get->IsInstanceFieldGet()) {
-    // TODO: Remove "OrNull".
-    maybe_get->AsInstanceFieldGetOrNull()->SetType(new_type);
+    maybe_get->AsInstanceFieldGet()->SetType(new_type);
     return true;
   } else if (maybe_get->IsPredicatedInstanceFieldGet()) {
-    // TODO: Remove "OrNull".
-    maybe_get->AsPredicatedInstanceFieldGetOrNull()->SetType(new_type);
+    maybe_get->AsPredicatedInstanceFieldGet()->SetType(new_type);
     return true;
   } else if (maybe_get->IsStaticFieldGet()) {
-    // TODO: Remove "OrNull".
-    maybe_get->AsStaticFieldGetOrNull()->SetType(new_type);
+    maybe_get->AsStaticFieldGet()->SetType(new_type);
     return true;
-    // TODO: Remove "OrNull".
-  } else if (maybe_get->IsArrayGet() && !maybe_get->AsArrayGetOrNull()->IsStringCharAt()) {
-    // TODO: Remove "OrNull".
-    maybe_get->AsArrayGetOrNull()->SetType(new_type);
+  } else if (maybe_get->IsArrayGet() && !maybe_get->AsArrayGet()->IsStringCharAt()) {
+    maybe_get->AsArrayGet()->SetType(new_type);
     return true;
   } else {
     return false;
@@ -1304,27 +1264,20 @@
   for (const HUseListNode<HInstruction*>& use : type_conversion->GetUses()) {
     HInstruction* instruction = use.GetUser();
     if (instruction->IsInstanceFieldSet() &&
-        // TODO: Remove "OrNull".
-        instruction->AsInstanceFieldSetOrNull()->GetFieldType() == result_type) {
-      // TODO: Remove "OrNull".
-      DCHECK_EQ(instruction->AsInstanceFieldSetOrNull()->GetValue(), type_conversion);
+        instruction->AsInstanceFieldSet()->GetFieldType() == result_type) {
+      DCHECK_EQ(instruction->AsInstanceFieldSet()->GetValue(), type_conversion);
       continue;
     }
     if (instruction->IsStaticFieldSet() &&
-        // TODO: Remove "OrNull".
-        instruction->AsStaticFieldSetOrNull()->GetFieldType() == result_type) {
-      // TODO: Remove "OrNull".
-      DCHECK_EQ(instruction->AsStaticFieldSetOrNull()->GetValue(), type_conversion);
+        instruction->AsStaticFieldSet()->GetFieldType() == result_type) {
+      DCHECK_EQ(instruction->AsStaticFieldSet()->GetValue(), type_conversion);
       continue;
     }
     if (instruction->IsArraySet() &&
-        // TODO: Remove "OrNull".
-        instruction->AsArraySetOrNull()->GetComponentType() == result_type &&
+        instruction->AsArraySet()->GetComponentType() == result_type &&
         // not index use.
-        // TODO: Remove "OrNull".
-        instruction->AsArraySetOrNull()->GetIndex() != type_conversion) {
-      // TODO: Remove "OrNull".
-      DCHECK_EQ(instruction->AsArraySetOrNull()->GetValue(), type_conversion);
+        instruction->AsArraySet()->GetIndex() != type_conversion) {
+      DCHECK_EQ(instruction->AsArraySet()->GetValue(), type_conversion);
       continue;
     }
     // The use is not as a store value, or the field/element type is not the
@@ -1347,8 +1300,7 @@
   }
 
   if (input->IsTypeConversion()) {
-    // TODO: Remove "OrNull".
-    HTypeConversion* input_conversion = input->AsTypeConversionOrNull();
+    HTypeConversion* input_conversion = input->AsTypeConversion();
     HInstruction* original_input = input_conversion->GetInput();
     DataType::Type original_type = original_input->GetType();
 
@@ -1390,14 +1342,12 @@
             // Optimization only applies to lossy Type Conversions.
             !IsTypeConversionLossless(input_type, result_type)) {
     DCHECK(DataType::IsIntegralType(input_type));
-    // TODO: Remove "OrNull".
-    HShr* shr_op = input->AsShrOrNull();
+    HShr* shr_op = input->AsShr();
     HConstant* shr_right = shr_op->GetConstantRight();
     HInstruction* shr_left = shr_op->GetLeastConstantLeft();
     if (shr_right != nullptr && shr_left->IsAnd()) {
       // Optimization needs AND -> SHR -> TypeConversion pattern.
-      // TODO: Remove "OrNull".
-      HAnd* and_op = shr_left->AsAndOrNull();
+      HAnd* and_op = shr_left->AsAnd();
       HConstant* and_right = and_op->GetConstantRight();
       HInstruction* and_left = and_op->GetLeastConstantLeft();
       if (and_right != nullptr &&
@@ -1420,8 +1370,7 @@
     }
   } else if (input->IsAnd() && DataType::IsIntegralType(result_type)) {
     DCHECK(DataType::IsIntegralType(input_type));
-    // TODO: Remove "OrNull".
-    HAnd* input_and = input->AsAndOrNull();
+    HAnd* input_and = input->AsAnd();
     HConstant* constant = input_and->GetConstantRight();
     if (constant != nullptr) {
       int64_t value = Int64FromConstant(constant);
@@ -1507,8 +1456,7 @@
     }
   }
 
-  // TODO: Remove first "OrNull", keep the second.
-  HNeg* neg = left_is_neg ? left->AsNegOrNull() : right->AsNegOrNull();
+  HNeg* neg = left_is_neg ? left->AsNeg() : right->AsNegOrNull();
   if (left_is_neg != right_is_neg && neg->HasOnlyOneNonEnvironmentUse()) {
     // Replace code looking like
     //    NEG tmp, b
@@ -1619,9 +1567,7 @@
     // precisely clears the shifted-in sign bits.
     if ((input_other->IsUShr() || input_other->IsShr()) && input_other->InputAt(1)->IsConstant()) {
       size_t reg_bits = (instruction->GetResultType() == DataType::Type::kInt64) ? 64 : 32;
-      // TODO: Remove "OrNull".
-      size_t shift =
-          Int64FromConstant(input_other->InputAt(1)->AsConstantOrNull()) & (reg_bits - 1);
+      size_t shift = Int64FromConstant(input_other->InputAt(1)->AsConstant()) & (reg_bits - 1);
       size_t num_tail_bits_set = CTZ(value + 1);
       if ((num_tail_bits_set >= reg_bits - shift) && input_other->IsUShr()) {
         // This AND clears only bits known to be clear, for example "(x >>> 24) & 0xff".
@@ -1729,8 +1675,7 @@
   HInstruction* input_one = condition->InputAt(0);
   HInstruction* input_two = condition->InputAt(1);
   HLoadClass* load_class = input_one->IsLoadClass()
-      // TODO: Remove "OrNull".
-      ? input_one->AsLoadClassOrNull()
+      ? input_one->AsLoadClass()
       : input_two->AsLoadClassOrNull();
   if (load_class == nullptr) {
     return false;
@@ -1810,8 +1755,7 @@
   // We can only replace an HCondition which compares a Compare to 0.
   // Both 'dx' and 'jack' generate a compare to 0 when compiling a
   // condition with a long, float or double comparison as input.
-  // TODO: Remove "OrNull".
-  if (!left->IsCompare() || !right->IsConstant() || right->AsIntConstantOrNull()->GetValue() != 0) {
+  if (!left->IsCompare() || !right->IsConstant() || right->AsIntConstant()->GetValue() != 0) {
     // Conversion is not possible.
     return;
   }
@@ -1838,8 +1782,7 @@
   left->RemoveEnvironmentUsers();
 
   // We have decided to fold the HCompare into the HCondition. Transfer the information.
-  // TODO: Remove "OrNull".
-  condition->SetBias(left->AsCompareOrNull()->GetBias());
+  condition->SetBias(left->AsCompare()->GetBias());
 
   // Replace the operands of the HCondition.
   condition->ReplaceInput(left->InputAt(0), 0);
@@ -1897,15 +1840,13 @@
     //    MUL dst, src, 1 / constant
     HConstant* reciprocal = nullptr;
     if (type == DataType::Type::kFloat64) {
-      // TODO: Remove "OrNull".
-      double value = input_cst->AsDoubleConstantOrNull()->GetValue();
+      double value = input_cst->AsDoubleConstant()->GetValue();
       if (CanDivideByReciprocalMultiplyDouble(bit_cast<int64_t, double>(value))) {
         reciprocal = GetGraph()->GetDoubleConstant(1.0 / value);
       }
     } else {
       DCHECK_EQ(type, DataType::Type::kFloat32);
-      // TODO: Remove "OrNull".
-      float value = input_cst->AsFloatConstantOrNull()->GetValue();
+      float value = input_cst->AsFloatConstant()->GetValue();
       if (CanDivideByReciprocalMultiplyFloat(bit_cast<int32_t, float>(value))) {
         reciprocal = GetGraph()->GetFloatConstant(1.0f / value);
       }
@@ -1932,8 +1873,7 @@
         user->IsDiv() &&
         user->InputAt(0) == dividend &&
         user->InputAt(1) == divisor) {
-      // TODO: Remove "OrNull".
-      return user->AsDivOrNull();
+      return user->AsDiv();
     }
   }
   return nullptr;
@@ -2023,10 +1963,9 @@
     return;
   }
 
-  // TODO: Remove "OrNull".
   if (DataType::IsFloatingPointType(type) &&
-      ((input_cst->IsFloatConstant() && input_cst->AsFloatConstantOrNull()->GetValue() == 2.0f) ||
-       (input_cst->IsDoubleConstant() && input_cst->AsDoubleConstantOrNull()->GetValue() == 2.0))) {
+      ((input_cst->IsFloatConstant() && input_cst->AsFloatConstant()->GetValue() == 2.0f) ||
+       (input_cst->IsDoubleConstant() && input_cst->AsDoubleConstant()->GetValue() == 2.0))) {
     // Replace code looking like
     //    FP_MUL dst, src, 2.0
     // with
@@ -2107,8 +2046,7 @@
     //    NEG dst, tmp
     // with
     //    src
-    // TODO: Remove "OrNull".
-    HNeg* previous_neg = input->AsNegOrNull();
+    HNeg* previous_neg = input->AsNeg();
     instruction->ReplaceWith(previous_neg->GetInput());
     instruction->GetBlock()->RemoveInstruction(instruction);
     // We perform the optimization even if the input negation has environment
@@ -2134,8 +2072,7 @@
     // to be extended if we are not sure the initial 'SUB' instruction can be
     // removed.
     // We do not perform optimization for fp because we could lose the sign of zero.
-    // TODO: Remove "OrNull".
-    HSub* sub = input->AsSubOrNull();
+    HSub* sub = input->AsSub();
     HSub* new_sub = new (GetGraph()->GetAllocator()) HSub(
         instruction->GetType(), sub->GetRight(), sub->GetLeft());
     instruction->GetBlock()->ReplaceAndRemoveInstructionWith(instruction, new_sub);
@@ -2157,8 +2094,7 @@
     // We perform the optimization even if the input negation has environment
     // uses since it allows removing the current instruction. But we only delete
     // the input negation only if it is does not have any uses left.
-    // TODO: Remove "OrNull".
-    HNot* previous_not = input->AsNotOrNull();
+    HNot* previous_not = input->AsNot();
     instruction->ReplaceWith(previous_not->GetInput());
     instruction->GetBlock()->RemoveInstruction(instruction);
     if (!previous_not->HasUses()) {
@@ -2245,8 +2181,7 @@
   HInstruction* left = instruction->GetLeft();
   HInstruction* right = instruction->GetRight();
   if (left->IsConstant()) {
-    // TODO: Remove "OrNull".
-    if (Int64FromConstant(left->AsConstantOrNull()) == 0) {
+    if (Int64FromConstant(left->AsConstant()) == 0) {
       // Replace code looking like
       //    SUB dst, 0, src
       // with
@@ -2273,8 +2208,7 @@
     //    SUB dst, a, tmp
     // with
     //    ADD dst, a, b
-    // TODO: Remove "OrNull".
-    HAdd* add = new(GetGraph()->GetAllocator()) HAdd(type, left, right->AsNegOrNull()->GetInput());
+    HAdd* add = new(GetGraph()->GetAllocator()) HAdd(type, left, right->AsNeg()->GetInput());
     instruction->GetBlock()->ReplaceAndRemoveInstructionWith(instruction, add);
     RecordSimplification();
     right->GetBlock()->RemoveInstruction(right);
@@ -2290,8 +2224,7 @@
     //    NEG dst, tmp
     // The second version is not intrinsically better, but enables more
     // transformations.
-    // TODO: Remove "OrNull".
-    HAdd* add = new(GetGraph()->GetAllocator()) HAdd(type, left->AsNegOrNull()->GetInput(), right);
+    HAdd* add = new(GetGraph()->GetAllocator()) HAdd(type, left->AsNeg()->GetInput(), right);
     instruction->GetBlock()->InsertInstructionBefore(add, instruction);
     HNeg* neg = new (GetGraph()->GetAllocator()) HNeg(instruction->GetType(), add);
     instruction->GetBlock()->InsertInstructionBefore(neg, instruction);
@@ -2431,8 +2364,7 @@
   }
 
   if (potential_array->IsNewArray()) {
-    // TODO: Remove "OrNull".
-    return potential_array->AsNewArrayOrNull()->GetLength() == potential_length;
+    return potential_array->AsNewArray()->GetLength() == potential_length;
   }
 
   return false;
@@ -2499,8 +2431,7 @@
         (source_component_type == destination_component_type)) {
       ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
       PointerSize image_size = class_linker->GetImagePointerSize();
-      // TODO: Remove "OrNull".
-      HInvokeStaticOrDirect* invoke = instruction->AsInvokeStaticOrDirectOrNull();
+      HInvokeStaticOrDirect* invoke = instruction->AsInvokeStaticOrDirect();
       ObjPtr<mirror::Class> system = invoke->GetResolvedMethod()->GetDeclaringClass();
       ArtMethod* method = nullptr;
       switch (source_component_type) {
@@ -2616,8 +2547,7 @@
   DCHECK(invoke->GetIntrinsic() == Intrinsics::kStringIndexOf ||
          invoke->GetIntrinsic() == Intrinsics::kStringIndexOfAfter);
   if (invoke->InputAt(0)->IsLoadString()) {
-    // TODO: Remove "OrNull".
-    HLoadString* load_string = invoke->InputAt(0)->AsLoadStringOrNull();
+    HLoadString* load_string = invoke->InputAt(0)->AsLoadString();
     const DexFile& dex_file = load_string->GetDexFile();
     uint32_t utf16_length;
     const char* data =
@@ -2673,13 +2603,11 @@
 static bool NoEscapeForStringBufferReference(HInstruction* reference, HInstruction* user) {
   if (user->IsInvokeStaticOrDirect()) {
     // Any constructor on StringBuffer is okay.
-    // TODO: Remove "OrNull".
-    return user->AsInvokeStaticOrDirectOrNull()->GetResolvedMethod() != nullptr &&
-           user->AsInvokeStaticOrDirectOrNull()->GetResolvedMethod()->IsConstructor() &&
+    return user->AsInvokeStaticOrDirect()->GetResolvedMethod() != nullptr &&
+           user->AsInvokeStaticOrDirect()->GetResolvedMethod()->IsConstructor() &&
            user->InputAt(0) == reference;
   } else if (user->IsInvokeVirtual()) {
-    // TODO: Remove "OrNull".
-    switch (user->AsInvokeVirtualOrNull()->GetIntrinsic()) {
+    switch (user->AsInvokeVirtual()->GetIntrinsic()) {
       case Intrinsics::kStringBufferLength:
       case Intrinsics::kStringBufferToString:
         DCHECK_EQ(user->InputAt(0), reference);
@@ -2750,8 +2678,7 @@
     }
     // Then we should see the arguments.
     if (user->IsInvokeVirtual()) {
-      // TODO: Remove "OrNull".
-      HInvokeVirtual* as_invoke_virtual = user->AsInvokeVirtualOrNull();
+      HInvokeVirtual* as_invoke_virtual = user->AsInvokeVirtual();
       DCHECK(!seen_constructor);
       DCHECK(!seen_constructor_fence);
       StringBuilderAppend::Argument arg;
@@ -2787,8 +2714,7 @@
           has_fp_args = true;
           break;
         case Intrinsics::kStringBuilderAppendCharSequence: {
-          // TODO: Remove "OrNull".
-          ReferenceTypeInfo rti = user->AsInvokeVirtualOrNull()->InputAt(1)->GetReferenceTypeInfo();
+          ReferenceTypeInfo rti = user->AsInvokeVirtual()->InputAt(1)->GetReferenceTypeInfo();
           if (!rti.IsValid()) {
             return false;
           }
@@ -2820,12 +2746,9 @@
       args[num_args] = as_invoke_virtual->InputAt(1u);
       ++num_args;
     } else if (user->IsInvokeStaticOrDirect() &&
-               // TODO: Remove "OrNull".
-               user->AsInvokeStaticOrDirectOrNull()->GetResolvedMethod() != nullptr &&
-               // TODO: Remove "OrNull".
-               user->AsInvokeStaticOrDirectOrNull()->GetResolvedMethod()->IsConstructor() &&
-               // TODO: Remove "OrNull".
-               user->AsInvokeStaticOrDirectOrNull()->GetNumberOfArguments() == 1u) {
+               user->AsInvokeStaticOrDirect()->GetResolvedMethod() != nullptr &&
+               user->AsInvokeStaticOrDirect()->GetResolvedMethod()->IsConstructor() &&
+               user->AsInvokeStaticOrDirect()->GetNumberOfArguments() == 1u) {
       // After arguments, we should see the constructor.
       // We accept only the constructor with no extra arguments.
       DCHECK(!seen_constructor);
@@ -2964,8 +2887,7 @@
   if (!var_handle_instruction->IsStaticFieldGet()) {
     return false;
   }
-  // TODO: Remove "OrNull".
-  ArtField* field = var_handle_instruction->AsStaticFieldGetOrNull()->GetFieldInfo().GetField();
+  ArtField* field = var_handle_instruction->AsStaticFieldGet()->GetFieldInfo().GetField();
   DCHECK(field->IsStatic());
   if (!field->IsFinal()) {
     return false;
@@ -2988,11 +2910,9 @@
       is_in_boot_image = compiler_options.IsImageClass(descriptor);
     }
     CHECK_EQ(is_in_boot_image,
-             // TODO: Remove "OrNull".
-             load_class->IsLoadClass() && load_class->AsLoadClassOrNull()->IsInBootImage());
+             load_class->IsLoadClass() && load_class->AsLoadClass()->IsInBootImage());
   }
-  // TODO: Remove "OrNull".
-  if (!load_class->IsLoadClass() || !load_class->AsLoadClassOrNull()->IsInBootImage()) {
+  if (!load_class->IsLoadClass() || !load_class->AsLoadClass()->IsInBootImage()) {
     return false;
   }
 
@@ -3188,8 +3108,7 @@
 void InstructionSimplifierVisitor::VisitDeoptimize(HDeoptimize* deoptimize) {
   HInstruction* cond = deoptimize->InputAt(0);
   if (cond->IsConstant()) {
-    // TODO: Remove "OrNull".
-    if (cond->AsIntConstantOrNull()->IsFalse()) {
+    if (cond->AsIntConstant()->IsFalse()) {
       // Never deopt: instruction can be removed.
       if (deoptimize->GuardsAnInput()) {
         deoptimize->ReplaceWith(deoptimize->GuardedInput());
@@ -3222,15 +3141,11 @@
   HBinaryOperation* y;
 
   if (instruction->GetKind() == left->GetKind() && right->IsConstant()) {
-    // TODO: Remove "OrNull".
-    const2 = right->AsConstantOrNull();
-    // TODO: Remove "OrNull".
-    y = left->AsBinaryOperationOrNull();
+    const2 = right->AsConstant();
+    y = left->AsBinaryOperation();
   } else if (left->IsConstant() && instruction->GetKind() == right->GetKind()) {
-    // TODO: Remove "OrNull".
-    const2 = left->AsConstantOrNull();
-    // TODO: Remove "OrNull".
-    y = right->AsBinaryOperationOrNull();
+    const2 = left->AsConstant();
+    y = right->AsBinaryOperation();
   } else {
     // The node does not match the pattern.
     return false;
@@ -3261,8 +3176,7 @@
 }
 
 static HBinaryOperation* AsAddOrSub(HInstruction* binop) {
-  // TODO: Remove "OrNull".
-  return (binop->IsAdd() || binop->IsSub()) ? binop->AsBinaryOperationOrNull() : nullptr;
+  return (binop->IsAdd() || binop->IsSub()) ? binop->AsBinaryOperation() : nullptr;
 }
 
 // Helper function that performs addition statically, considering the result type.
@@ -3301,15 +3215,13 @@
   HInstruction* left = instruction->GetLeft();
   HInstruction* right = instruction->GetRight();
   // Variable names as described above.
-  // TODO: Remove first "OrNull", keep the second.
-  HConstant* const2 = right->IsConstant() ? right->AsConstantOrNull() : left->AsConstantOrNull();
+  HConstant* const2 = right->IsConstant() ? right->AsConstant() : left->AsConstantOrNull();
   if (const2 == nullptr) {
     return false;
   }
 
   HBinaryOperation* y = (AsAddOrSub(left) != nullptr)
-      // TODO: Remove "OrNull".
-      ? left->AsBinaryOperationOrNull()
+      ? left->AsBinaryOperation()
       : AsAddOrSub(right);
   // If y has more than one use, we do not perform the optimization because
   // it might increase code size (e.g. if the new constant is no longer
@@ -3319,9 +3231,7 @@
   }
 
   left = y->GetLeft();
-  // TODO: Remove first "OrNull", keep the second.
-  HConstant* const1 =
-      left->IsConstant() ? left->AsConstantOrNull() : y->GetRight()->AsConstantOrNull();
+  HConstant* const1 = left->IsConstant() ? left->AsConstant() : y->GetRight()->AsConstantOrNull();
   if (const1 == nullptr) {
     return false;
   }
diff --git a/compiler/optimizing/instruction_simplifier_arm.cc b/compiler/optimizing/instruction_simplifier_arm.cc
index 1aeb638..05a518d 100644
--- a/compiler/optimizing/instruction_simplifier_arm.cc
+++ b/compiler/optimizing/instruction_simplifier_arm.cc
@@ -105,8 +105,7 @@
     return false;
   }
 
-  // TODO: Remove "OrNull".
-  bool is_commutative = use->AsBinaryOperationOrNull()->IsCommutative();
+  bool is_commutative = use->AsBinaryOperation()->IsCommutative();
   HInstruction* other_input;
   if (bitfield_op == right) {
     other_input = left;
diff --git a/compiler/optimizing/instruction_simplifier_arm64.cc b/compiler/optimizing/instruction_simplifier_arm64.cc
index a4e558b..671900b 100644
--- a/compiler/optimizing/instruction_simplifier_arm64.cc
+++ b/compiler/optimizing/instruction_simplifier_arm64.cc
@@ -107,8 +107,7 @@
     right = use->InputAt(1);
   } else {
     DCHECK(use->IsNeg());
-    // TODO: Remove "OrNull".
-    right = use->AsNegOrNull()->InputAt(0);
+    right = use->AsNeg()->InputAt(0);
     left = GetGraph()->GetConstant(right->GetType(), 0);
   }
   DCHECK(left == bitfield_op || right == bitfield_op);
@@ -120,8 +119,7 @@
     return false;
   }
 
-  // TODO: Remove "OrNull".
-  bool is_commutative = use->IsBinaryOperation() && use->AsBinaryOperationOrNull()->IsCommutative();
+  bool is_commutative = use->IsBinaryOperation() && use->AsBinaryOperation()->IsCommutative();
   HInstruction* other_input;
   if (bitfield_op == right) {
     other_input = left;
diff --git a/compiler/optimizing/instruction_simplifier_shared.cc b/compiler/optimizing/instruction_simplifier_shared.cc
index 3357e53..34daae2 100644
--- a/compiler/optimizing/instruction_simplifier_shared.cc
+++ b/compiler/optimizing/instruction_simplifier_shared.cc
@@ -52,8 +52,7 @@
   } else {
     DCHECK(input_binop->IsSub());
     if (input_binop->GetRight()->IsConstant() &&
-        // TODO: Remove "OrNull".
-        input_binop->GetRight()->AsConstantOrNull()->IsMinusOne()) {
+        input_binop->GetRight()->AsConstant()->IsMinusOne()) {
       // Interpret
       //    a * (b - (-1))
       // as
@@ -61,8 +60,7 @@
       input_b = input_binop->GetLeft();
       op_kind = HInstruction::kAdd;
     } else if (input_binop->GetLeft()->IsConstant() &&
-               // TODO: Remove "OrNull".
-               input_binop->GetLeft()->AsConstantOrNull()->IsOne()) {
+               input_binop->GetLeft()->AsConstant()->IsOne()) {
       // Interpret
       //    a * (1 - b)
       // as
@@ -124,8 +122,7 @@
       // whether all uses are on different control-flow paths (using dominance and
       // reverse-dominance information) and only perform the merge when they are.
       HInstruction* accumulator = nullptr;
-      // TODO: Remove "OrNull".
-      HBinaryOperation* binop = use->AsBinaryOperationOrNull();
+      HBinaryOperation* binop = use->AsBinaryOperation();
       HInstruction* binop_left = binop->GetLeft();
       HInstruction* binop_right = binop->GetRight();
       // Be careful after GVN. This should not happen since the `HMul` has only
@@ -178,13 +175,11 @@
   HInstruction* left = mul->GetLeft();
   HInstruction* right = mul->GetRight();
   if ((right->IsAdd() || right->IsSub()) &&
-      // TODO: Remove "OrNull".
-      TrySimpleMultiplyAccumulatePatterns(mul, right->AsBinaryOperationOrNull(), left)) {
+      TrySimpleMultiplyAccumulatePatterns(mul, right->AsBinaryOperation(), left)) {
     return true;
   }
   if ((left->IsAdd() || left->IsSub()) &&
-      // TODO: Remove "OrNull".
-      TrySimpleMultiplyAccumulatePatterns(mul, left->AsBinaryOperationOrNull(), right)) {
+      TrySimpleMultiplyAccumulatePatterns(mul, left->AsBinaryOperation(), right)) {
     return true;
   }
   return false;
@@ -219,8 +214,7 @@
       //    AND dst, src, tmp   (respectively ORR, EOR)
       // with
       //    BIC dst, src, mask  (respectively ORN, EON)
-      // TODO: Remove "OrNull".
-      HInstruction* src = hnot->AsNotOrNull()->GetInput();
+      HInstruction* src = hnot->AsNot()->GetInput();
 
       HBitwiseNegatedRight* neg_op = new (hnot->GetBlock()->GetGraph()->GetAllocator())
           HBitwiseNegatedRight(op->GetType(), op->GetKind(), hother, src, op->GetDexPc());
@@ -240,15 +234,13 @@
                                   HInstruction* index,
                                   size_t data_offset) {
   if (index->IsConstant() ||
-      // TODO: Remove "OrNull".
-      (index->IsBoundsCheck() && index->AsBoundsCheckOrNull()->GetIndex()->IsConstant())) {
+      (index->IsBoundsCheck() && index->AsBoundsCheck()->GetIndex()->IsConstant())) {
     // When the index is a constant all the addressing can be fitted in the
     // memory access instruction, so do not split the access.
     return false;
   }
   if (access->IsArraySet() &&
-      // TODO: Remove "OrNull".
-      access->AsArraySetOrNull()->GetValue()->GetType() == DataType::Type::kReference) {
+      access->AsArraySet()->GetValue()->GetType() == DataType::Type::kReference) {
     // The access may require a runtime call or the original array pointer.
     return false;
   }
@@ -308,8 +300,7 @@
   for (const HUseListNode<HInstruction*>& use : index->GetUses()) {
     HInstruction* user = use.GetUser();
     if (user->IsVecMemoryOperation() && user != access) {
-      // TODO: Remove "OrNull".
-      HVecMemoryOperation* another_access = user->AsVecMemoryOperationOrNull();
+      HVecMemoryOperation* another_access = user->AsVecMemoryOperation();
       DataType::Type another_packed_type = another_access->GetPackedType();
       uint32_t another_data_offset = mirror::Array::DataOffset(
           DataType::Size(another_packed_type)).Uint32Value();
@@ -319,13 +310,9 @@
         break;
       }
     } else if (user->IsIntermediateAddressIndex()) {
-      // TODO: Remove "OrNull".
-      HIntermediateAddressIndex* another_access = user->AsIntermediateAddressIndexOrNull();
-      // TODO: Remove "OrNull".
-      uint32_t another_data_offset = another_access->GetOffset()->AsIntConstantOrNull()->GetValue();
-      // TODO: Remove "OrNull".
-      size_t another_component_shift =
-          another_access->GetShift()->AsIntConstantOrNull()->GetValue();
+      HIntermediateAddressIndex* another_access = user->AsIntermediateAddressIndex();
+      uint32_t another_data_offset = another_access->GetOffset()->AsIntConstant()->GetValue();
+      size_t another_component_shift = another_access->GetShift()->AsIntConstant()->GetValue();
       if (another_data_offset == data_offset && another_component_shift == component_shift) {
         is_extracting_beneficial = true;
         break;
diff --git a/compiler/optimizing/instruction_simplifier_shared.h b/compiler/optimizing/instruction_simplifier_shared.h
index fe9d429..01489f8 100644
--- a/compiler/optimizing/instruction_simplifier_shared.h
+++ b/compiler/optimizing/instruction_simplifier_shared.h
@@ -26,18 +26,16 @@
 
 inline bool CanFitInShifterOperand(HInstruction* instruction) {
   if (instruction->IsTypeConversion()) {
-    // TODO: Remove "OrNull".
-    HTypeConversion* conversion = instruction->AsTypeConversionOrNull();
+    HTypeConversion* conversion = instruction->AsTypeConversion();
     DataType::Type result_type = conversion->GetResultType();
     DataType::Type input_type = conversion->GetInputType();
     // We don't expect to see the same type as input and result.
     return DataType::IsIntegralType(result_type) && DataType::IsIntegralType(input_type) &&
         (result_type != input_type);
   } else {
-    // TODO: Remove "OrNull".
-    return (instruction->IsShl() && instruction->AsShlOrNull()->InputAt(1)->IsIntConstant()) ||
-        (instruction->IsShr() && instruction->AsShrOrNull()->InputAt(1)->IsIntConstant()) ||
-        (instruction->IsUShr() && instruction->AsUShrOrNull()->InputAt(1)->IsIntConstant());
+    return (instruction->IsShl() && instruction->AsShl()->InputAt(1)->IsIntConstant()) ||
+        (instruction->IsShr() && instruction->AsShr()->InputAt(1)->IsIntConstant()) ||
+        (instruction->IsUShr() && instruction->AsUShr()->InputAt(1)->IsIntConstant());
   }
 }
 
@@ -56,8 +54,7 @@
 //   t3 = Sub(*, t2)
 inline bool IsSubRightSubLeftShl(HSub *sub) {
   HInstruction* right = sub->GetRight();
-  // TODO: Remove "OrNull".
-  return right->IsSub() && right->AsSubOrNull()->GetLeft()->IsShl();
+  return right->IsSub() && right->AsSub()->GetLeft()->IsShl();
 }
 
 }  // namespace helpers
diff --git a/compiler/optimizing/instruction_simplifier_x86_shared.cc b/compiler/optimizing/instruction_simplifier_x86_shared.cc
index 39ae39e..74c5ca2 100644
--- a/compiler/optimizing/instruction_simplifier_x86_shared.cc
+++ b/compiler/optimizing/instruction_simplifier_x86_shared.cc
@@ -37,8 +37,7 @@
   if (left->IsNot() ^ right->IsNot()) {
     bool left_is_not = left->IsNot();
     HInstruction* other_ins = (left_is_not ? right : left);
-    // TODO: Remove "OrNull".
-    HNot* not_ins = (left_is_not ? left : right)->AsNotOrNull();
+    HNot* not_ins = (left_is_not ? left : right)->AsNot();
     // Only do the simplification if instruction has only one use
     // and thus can be safely removed.
     if (not_ins->HasOnlyOneNonEnvironmentUse()) {
@@ -124,14 +123,12 @@
 
 bool AreLeastSetBitInputs(HInstruction* to_test, HInstruction* other) {
   if (to_test->IsAdd()) {
-    // TODO: Remove "OrNull".
-    HAdd* add = to_test->AsAddOrNull();
+    HAdd* add = to_test->AsAdd();
     HConstant* cst = add->GetConstantRight();
     return cst != nullptr && cst->IsMinusOne() && other == add->GetLeastConstantLeft();
   }
   if (to_test->IsSub()) {
-    // TODO: Remove "OrNull".
-    HSub* sub = to_test->AsSubOrNull();
+    HSub* sub = to_test->AsSub();
     HConstant* cst = sub->GetConstantRight();
     return cst != nullptr && cst->IsOne() && other == sub->GetLeastConstantLeft();
   }
diff --git a/compiler/optimizing/intrinsics.cc b/compiler/optimizing/intrinsics.cc
index f832d9c..774deec 100644
--- a/compiler/optimizing/intrinsics.cc
+++ b/compiler/optimizing/intrinsics.cc
@@ -151,8 +151,7 @@
   // for AOT. This should cover both the testing config (non-PIC boot image) and codegens that
   // reject PC-relative load kinds and fall back to the runtime call.
   if (compiler_options.IsAotCompiler() &&
-      // TODO: Remove "OrNull".
-      !invoke->AsInvokeStaticOrDirectOrNull()->HasPcRelativeMethodLoadKind()) {
+      !invoke->AsInvokeStaticOrDirect()->HasPcRelativeMethodLoadKind()) {
     return false;
   }
   if (!compiler_options.IsBootImage() &&
@@ -210,8 +209,7 @@
       }
     }
     if (input->IsIntConstant()) {
-      // TODO: Remove "OrNull".
-      int32_t value = input->AsIntConstantOrNull()->GetValue();
+      int32_t value = input->AsIntConstant()->GetValue();
       if (static_cast<uint32_t>(value) - static_cast<uint32_t>(low) <
           static_cast<uint32_t>(high - low + 1)) {
         // No call, we shall use direct pointer to the Integer object.
@@ -236,8 +234,7 @@
       DCHECK(compiler_options.IsAotCompiler());
       DCHECK(CheckIntegerCache(self, runtime->GetClassLinker(), boot_image_live_objects, cache));
       if (input->IsIntConstant()) {
-        // TODO: Remove "OrNull".
-        int32_t value = input->AsIntConstantOrNull()->GetValue();
+        int32_t value = input->AsIntConstant()->GetValue();
         // Retrieve the `value` from the lowest cached Integer.
         ObjPtr<mirror::Object> low_integer =
             IntrinsicObjects::GetIntegerValueOfObject(boot_image_live_objects, 0u);
@@ -311,8 +308,7 @@
     info.length = dchecked_integral_cast<uint32_t>(high - info.low + 1);
 
     if (invoke->InputAt(0)->IsIntConstant()) {
-      // TODO: Remove "OrNull".
-      int32_t input_value = invoke->InputAt(0)->AsIntConstantOrNull()->GetValue();
+      int32_t input_value = invoke->InputAt(0)->AsIntConstant()->GetValue();
       uint32_t index = static_cast<uint32_t>(input_value) - static_cast<uint32_t>(info.low);
       if (index < static_cast<uint32_t>(info.length)) {
         info.value_boot_image_reference = IntrinsicObjects::EncodePatch(
@@ -347,8 +343,7 @@
         IntrinsicObjects::GetIntegerValueOfCache(boot_image_live_objects)->GetLength());
 
     if (invoke->InputAt(0)->IsIntConstant()) {
-      // TODO: Remove "OrNull".
-      int32_t input_value = invoke->InputAt(0)->AsIntConstantOrNull()->GetValue();
+      int32_t input_value = invoke->InputAt(0)->AsIntConstant()->GetValue();
       uint32_t index = static_cast<uint32_t>(input_value) - static_cast<uint32_t>(info.low);
       if (index < static_cast<uint32_t>(info.length)) {
         ObjPtr<mirror::Object> integer =
diff --git a/compiler/optimizing/intrinsics.h b/compiler/optimizing/intrinsics.h
index 017c3d1..893cd04 100644
--- a/compiler/optimizing/intrinsics.h
+++ b/compiler/optimizing/intrinsics.h
@@ -71,8 +71,7 @@
                             CodeGenerator* codegen,
                             InvokeDexCallingConventionVisitor* calling_convention_visitor) {
     if (kIsDebugBuild && invoke->IsInvokeStaticOrDirect()) {
-      // TODO: Remove "OrNull".
-      HInvokeStaticOrDirect* invoke_static_or_direct = invoke->AsInvokeStaticOrDirectOrNull();
+      HInvokeStaticOrDirect* invoke_static_or_direct = invoke->AsInvokeStaticOrDirect();
       // Explicit clinit checks triggered by static invokes must have been
       // pruned by art::PrepareForRegisterAllocation.
       DCHECK(!invoke_static_or_direct->IsStaticWithExplicitClinitCheck());
diff --git a/compiler/optimizing/intrinsics_arm64.cc b/compiler/optimizing/intrinsics_arm64.cc
index 01138ff..c6df9e2 100644
--- a/compiler/optimizing/intrinsics_arm64.cc
+++ b/compiler/optimizing/intrinsics_arm64.cc
@@ -103,8 +103,7 @@
         << "Unexpected instruction in read barrier arraycopy slow path: "
         << instruction_->DebugName();
     DCHECK(instruction_->GetLocations()->Intrinsified());
-    // TODO: Remove "OrNull".
-    DCHECK_EQ(instruction_->AsInvokeOrNull()->GetIntrinsic(), Intrinsics::kSystemArrayCopy);
+    DCHECK_EQ(instruction_->AsInvoke()->GetIntrinsic(), Intrinsics::kSystemArrayCopy);
 
     const int32_t element_size = DataType::Size(DataType::Type::kReference);
 
@@ -1898,8 +1897,7 @@
 
 static const char* GetConstString(HInstruction* candidate, uint32_t* utf16_length) {
   if (candidate->IsLoadString()) {
-    // TODO: Remove "OrNull".
-    HLoadString* load_string = candidate->AsLoadStringOrNull();
+    HLoadString* load_string = candidate->AsLoadString();
     const DexFile& dex_file = load_string->GetDexFile();
     return dex_file.StringDataAndUtf16LengthByIdx(load_string->GetStringIndex(), utf16_length);
   }
@@ -2109,8 +2107,7 @@
   SlowPathCodeARM64* slow_path = nullptr;
   HInstruction* code_point = invoke->InputAt(1);
   if (code_point->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    if (static_cast<uint32_t>(code_point->AsIntConstantOrNull()->GetValue()) > 0xFFFFU) {
+    if (static_cast<uint32_t>(code_point->AsIntConstant()->GetValue()) > 0xFFFFU) {
       // Always needs the slow-path. We could directly dispatch to it, but this case should be
       // rare, so for simplicity just put the full slow-path down and branch unconditionally.
       slow_path = new (codegen->GetScopedAllocator()) IntrinsicSlowPathARM64(invoke);
@@ -2641,8 +2638,7 @@
                                          bool length_is_input_length = false) {
   const int32_t length_offset = mirror::Array::LengthOffset().Int32Value();
   if (pos.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t pos_const = pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t pos_const = pos.GetConstant()->AsIntConstant()->GetValue();
     if (pos_const == 0) {
       if (!length_is_input_length) {
         // Check that length(input) >= length.
@@ -2698,8 +2694,7 @@
   const uint32_t data_offset = mirror::Array::DataOffset(element_size).Uint32Value();
 
   if (src_pos.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t constant = src_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t constant = src_pos.GetConstant()->AsIntConstant()->GetValue();
     __ Add(src_base, src, element_size * constant + data_offset);
   } else {
     __ Add(src_base, src, data_offset);
@@ -2707,8 +2702,7 @@
   }
 
   if (dst_pos.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t constant = dst_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t constant = dst_pos.GetConstant()->AsIntConstant()->GetValue();
     __ Add(dst_base, dst, element_size * constant + data_offset);
   } else {
     __ Add(dst_base, dst, data_offset);
@@ -2717,8 +2711,7 @@
 
   if (src_end.IsValid()) {
     if (copy_length.IsConstant()) {
-      // TODO: Remove "OrNull".
-      int32_t constant = copy_length.GetConstant()->AsIntConstantOrNull()->GetValue();
+      int32_t constant = copy_length.GetConstant()->AsIntConstant()->GetValue();
       __ Add(src_end, src_base, element_size * constant);
     } else {
       __ Add(src_end, src_base, Operand(XRegisterFrom(copy_length), LSL, element_size_shift));
@@ -2759,11 +2752,8 @@
     __ B(slow_path->GetEntryLabel(), hi);
   } else {
     // We have already checked in the LocationsBuilder for the constant case.
-    // TODO: Remove "OrNull".
-    DCHECK_GE(length.GetConstant()->AsIntConstantOrNull()->GetValue(), 0);
-    // TODO: Remove "OrNull".
-    DCHECK_LE(length.GetConstant()->AsIntConstantOrNull()->GetValue(),
-              kSystemArrayCopyCharThreshold);
+    DCHECK_GE(length.GetConstant()->AsIntConstant()->GetValue(), 0);
+    DCHECK_LE(length.GetConstant()->AsIntConstant()->GetValue(), kSystemArrayCopyCharThreshold);
   }
 
   Register src_curr_addr = WRegisterFrom(locations->GetTemp(0));
@@ -2867,8 +2857,7 @@
   };
 
   if (length.IsConstant()) {
-    // TODO: Remove "OrNull".
-    const int32_t constant_length = length.GetConstant()->AsIntConstantOrNull()->GetValue();
+    const int32_t constant_length = length.GetConstant()->AsIntConstant()->GetValue();
     if (constant_length >= unroll_threshold) {
       __ Mov(length_tmp, constant_length - chars_per_block);
       emitHeadLoop();
@@ -3009,11 +2998,9 @@
   // If source and destination are the same, we go to slow path if we need to do
   // forward copying.
   if (src_pos.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t src_pos_constant = src_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t src_pos_constant = src_pos.GetConstant()->AsIntConstant()->GetValue();
     if (dest_pos.IsConstant()) {
-      // TODO: Remove "OrNull".
-      int32_t dest_pos_constant = dest_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+      int32_t dest_pos_constant = dest_pos.GetConstant()->AsIntConstant()->GetValue();
       if (optimizations.GetDestinationIsSource()) {
         // Checked when building locations.
         DCHECK_GE(src_pos_constant, dest_pos_constant);
@@ -3023,8 +3010,7 @@
       }
       // Checked when building locations.
       DCHECK(!optimizations.GetDestinationIsSource() ||
-             // TODO: Remove "OrNull".
-             (src_pos_constant >= dest_pos.GetConstant()->AsIntConstantOrNull()->GetValue()));
+             (src_pos_constant >= dest_pos.GetConstant()->AsIntConstant()->GetValue()));
     } else {
       if (!optimizations.GetDestinationIsSource()) {
         __ Cmp(src, dest);
@@ -3297,8 +3283,7 @@
       __ Cbnz(temp2, intrinsic_slow_path->GetEntryLabel());
     }
 
-    // TODO: Remove "OrNull".
-    if (length.IsConstant() && length.GetConstant()->AsIntConstantOrNull()->GetValue() == 0) {
+    if (length.IsConstant() && length.GetConstant()->AsIntConstant()->GetValue() == 0) {
       // Null constant length: not need to emit the loop code at all.
     } else {
       Register src_curr_addr = temp1.X();
@@ -3505,8 +3490,7 @@
     CheckEntrypointTypes<kQuickAllocObjectWithChecks, void*, mirror::Class*>();
   };
   if (invoke->InputAt(0)->IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t value = invoke->InputAt(0)->AsIntConstantOrNull()->GetValue();
+    int32_t value = invoke->InputAt(0)->AsIntConstant()->GetValue();
     if (static_cast<uint32_t>(value - info.low) < info.length) {
       // Just embed the j.l.Integer in the code.
       DCHECK_NE(info.value_boot_image_reference, IntegerValueOfInfo::kInvalidReference);
@@ -3881,8 +3865,7 @@
   Register array = XRegisterFrom(locations->InAt(1));
   Location offset = locations->InAt(2);
   if (offset.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t offset_value = offset.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t offset_value = offset.GetConstant()->AsIntConstant()->GetValue();
     __ Add(ptr, array, array_data_offset + offset_value);
   } else {
     __ Add(ptr, array, array_data_offset);
@@ -4379,8 +4362,7 @@
 
  private:
   HInvoke* GetInvoke() const {
-    // TODO: Remove "OrNull".
-    return GetInstruction()->AsInvokeOrNull();
+    return GetInstruction()->AsInvoke();
   }
 
   mirror::VarHandle::AccessModeTemplate GetAccessModeTemplate() const {
diff --git a/compiler/optimizing/intrinsics_arm_vixl.cc b/compiler/optimizing/intrinsics_arm_vixl.cc
index c99e912..ab742bb 100644
--- a/compiler/optimizing/intrinsics_arm_vixl.cc
+++ b/compiler/optimizing/intrinsics_arm_vixl.cc
@@ -133,8 +133,7 @@
         << "Unexpected instruction in read barrier arraycopy slow path: "
         << instruction_->DebugName();
     DCHECK(instruction_->GetLocations()->Intrinsified());
-    // TODO: Remove "OrNull".
-    DCHECK_EQ(instruction_->AsInvokeOrNull()->GetIntrinsic(), Intrinsics::kSystemArrayCopy);
+    DCHECK_EQ(instruction_->AsInvoke()->GetIntrinsic(), Intrinsics::kSystemArrayCopy);
 
     DataType::Type type = DataType::Type::kReference;
     const int32_t element_size = DataType::Size(type);
@@ -883,8 +882,7 @@
 
 static const char* GetConstString(HInstruction* candidate, uint32_t* utf16_length) {
   if (candidate->IsLoadString()) {
-    // TODO: Remove "OrNull".
-    HLoadString* load_string = candidate->AsLoadStringOrNull();
+    HLoadString* load_string = candidate->AsLoadString();
     const DexFile& dex_file = load_string->GetDexFile();
     return dex_file.StringDataAndUtf16LengthByIdx(load_string->GetStringIndex(), utf16_length);
   }
@@ -2460,8 +2458,7 @@
     CheckEntrypointTypes<kQuickAllocObjectWithChecks, void*, mirror::Class*>();
   };
   if (invoke->InputAt(0)->IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t value = invoke->InputAt(0)->AsIntConstantOrNull()->GetValue();
+    int32_t value = invoke->InputAt(0)->AsIntConstant()->GetValue();
     if (static_cast<uint32_t>(value - info.low) < info.length) {
       // Just embed the j.l.Integer in the code.
       DCHECK_NE(info.value_boot_image_reference, IntegerValueOfInfo::kInvalidReference);
@@ -3996,8 +3993,7 @@
 
  private:
   HInvoke* GetInvoke() const {
-    // TODO: Remove "OrNull".
-    return GetInstruction()->AsInvokeOrNull();
+    return GetInstruction()->AsInvoke();
   }
 
   mirror::VarHandle::AccessModeTemplate GetAccessModeTemplate() const {
diff --git a/compiler/optimizing/intrinsics_utils.h b/compiler/optimizing/intrinsics_utils.h
index 5422275..13cabda 100644
--- a/compiler/optimizing/intrinsics_utils.h
+++ b/compiler/optimizing/intrinsics_utils.h
@@ -63,19 +63,16 @@
     Location method_loc = MoveArguments(codegen);
 
     if (invoke_->IsInvokeStaticOrDirect()) {
-      // TODO: Remove "OrNull".
-      HInvokeStaticOrDirect* invoke_static_or_direct = invoke_->AsInvokeStaticOrDirectOrNull();
+      HInvokeStaticOrDirect* invoke_static_or_direct = invoke_->AsInvokeStaticOrDirect();
       DCHECK_NE(invoke_static_or_direct->GetMethodLoadKind(), MethodLoadKind::kRecursive);
       DCHECK_NE(invoke_static_or_direct->GetCodePtrLocation(),
                 CodePtrLocation::kCallCriticalNative);
       codegen->GenerateStaticOrDirectCall(invoke_static_or_direct, method_loc, this);
     } else if (invoke_->IsInvokeVirtual()) {
-      // TODO: Remove "OrNull".
-      codegen->GenerateVirtualCall(invoke_->AsInvokeVirtualOrNull(), method_loc, this);
+      codegen->GenerateVirtualCall(invoke_->AsInvokeVirtual(), method_loc, this);
     } else {
       DCHECK(invoke_->IsInvokePolymorphic());
-      // TODO: Remove "OrNull".
-      codegen->GenerateInvokePolymorphicCall(invoke_->AsInvokePolymorphicOrNull(), this);
+      codegen->GenerateInvokePolymorphicCall(invoke_->AsInvokePolymorphic(), this);
     }
 
     // Copy the result back to the expected output.
@@ -116,8 +113,7 @@
 static inline DataType::Type GetDataTypeFromShorty(HInvoke* invoke, uint32_t index) {
   DCHECK(invoke->IsInvokePolymorphic());
   const DexFile* dex_file = invoke->GetMethodReference().dex_file;
-  // TODO: Remove "OrNull".
-  const char* shorty = dex_file->GetShorty(invoke->AsInvokePolymorphicOrNull()->GetProtoIndex());
+  const char* shorty = dex_file->GetShorty(invoke->AsInvokePolymorphic()->GetProtoIndex());
   DCHECK_LT(index, strlen(shorty));
 
   return DataType::FromShorty(shorty[index]);
@@ -210,12 +206,10 @@
     var_handle_instruction = var_handle_instruction->InputAt(0);
   }
   DCHECK(var_handle_instruction->IsStaticFieldGet());
-  // TODO: Remove "OrNull".
-  ArtField* field = var_handle_instruction->AsStaticFieldGetOrNull()->GetFieldInfo().GetField();
+  ArtField* field = var_handle_instruction->AsStaticFieldGet()->GetFieldInfo().GetField();
   DCHECK(field->IsStatic());
   DCHECK(field->IsFinal());
-  // TODO: Remove "OrNull".
-  DCHECK(var_handle_instruction->InputAt(0)->AsLoadClassOrNull()->IsInBootImage());
+  DCHECK(var_handle_instruction->InputAt(0)->AsLoadClass()->IsInBootImage());
   ObjPtr<mirror::Object> var_handle = field->GetObject(field->GetDeclaringClass());
   DCHECK(var_handle->GetClass() ==
          (GetExpectedVarHandleCoordinatesCount(invoke) == 0u
diff --git a/compiler/optimizing/intrinsics_x86.cc b/compiler/optimizing/intrinsics_x86.cc
index 8baa2a2..c163379 100644
--- a/compiler/optimizing/intrinsics_x86.cc
+++ b/compiler/optimizing/intrinsics_x86.cc
@@ -87,8 +87,7 @@
         << "Unexpected instruction in read barrier arraycopy slow path: "
         << instruction_->DebugName();
     DCHECK(instruction_->GetLocations()->Intrinsified());
-    // TODO: Remove "OrNull".
-    DCHECK_EQ(instruction_->AsInvokeOrNull()->GetIntrinsic(), Intrinsics::kSystemArrayCopy);
+    DCHECK_EQ(instruction_->AsInvoke()->GetIntrinsic(), Intrinsics::kSystemArrayCopy);
 
     int32_t element_size = DataType::Size(DataType::Type::kReference);
     uint32_t offset = mirror::Array::DataOffset(element_size).Uint32Value();
@@ -120,8 +119,7 @@
     __ Bind(&loop);
     // value = src_array[i + src_pos]
     if (src_pos.IsConstant()) {
-      // TODO: Remove "OrNull".
-      int32_t constant = src_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+      int32_t constant = src_pos.GetConstant()->AsIntConstant()->GetValue();
       int32_t adjusted_offset = offset + constant * element_size;
       __ movl(temp2, Address(src, temp1, ScaleFactor::TIMES_4, adjusted_offset));
     } else {
@@ -144,8 +142,7 @@
     __ MaybePoisonHeapReference(temp2);
     // dest_array[i + dest_pos] = value
     if (dest_pos.IsConstant()) {
-      // TODO: Remove "OrNull".
-      int32_t constant = dest_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+      int32_t constant = dest_pos.GetConstant()->AsIntConstant()->GetValue();
       int32_t adjusted_offset = offset + constant * element_size;
       __ movl(Address(dest, temp1, ScaleFactor::TIMES_4, adjusted_offset), temp2);
     } else {
@@ -396,9 +393,7 @@
     return;
   }
 
-  // TODO: Remove "OrNull".
-  HInvokeStaticOrDirect* static_or_direct = invoke->AsInvokeStaticOrDirectOrNull();
-  DCHECK(static_or_direct != nullptr);
+  HInvokeStaticOrDirect* static_or_direct = invoke->AsInvokeStaticOrDirect();
   LocationSummary* locations =
       new (allocator_) LocationSummary(invoke, LocationSummary::kNoCall, kIntrinsified);
   locations->SetInAt(0, Location::RequiresFpuRegister());
@@ -433,9 +428,8 @@
   __ subss(t2, t1);
   if (locations->GetInputCount() == 2 && locations->InAt(1).IsValid()) {
     // Direct constant area available.
-    // TODO: Remove "OrNull".
     HX86ComputeBaseMethodAddress* method_address =
-        invoke->InputAt(1)->AsX86ComputeBaseMethodAddressOrNull();
+        invoke->InputAt(1)->AsX86ComputeBaseMethodAddress();
     Register constant_area = locations->InAt(1).AsRegister<Register>();
     __ comiss(t2, codegen_->LiteralInt32Address(bit_cast<int32_t, float>(0.5f),
                                                 method_address,
@@ -528,8 +522,7 @@
 
   if (invoke->InputAt(0)->IsConstant()) {
     // Evaluate this at compile time.
-    // TODO: Remove "OrNull".
-    int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstantOrNull());
+    int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstant());
     if (value == 0) {
       if (is_long) {
         __ xorl(out_loc.AsRegisterPairLow<Register>(), out_loc.AsRegisterPairLow<Register>());
@@ -839,15 +832,13 @@
   const uint32_t length_offset = mirror::Array::LengthOffset().Uint32Value();
 
   if (pos.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t pos_const = pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t pos_const = pos.GetConstant()->AsIntConstant()->GetValue();
     if (pos_const == 0) {
       if (!length_is_input_length) {
         // Check that length(input) >= length.
         if (length.IsConstant()) {
           __ cmpl(Address(input, length_offset),
-                  // TODO: Remove "OrNull".
-                  Immediate(length.GetConstant()->AsIntConstantOrNull()->GetValue()));
+                  Immediate(length.GetConstant()->AsIntConstant()->GetValue()));
         } else {
           __ cmpl(Address(input, length_offset), length.AsRegister<Register>());
         }
@@ -861,8 +852,7 @@
 
       // Check that (length(input) - pos) >= length.
       if (length.IsConstant()) {
-        // TODO: Remove "OrNull".
-        __ cmpl(temp, Immediate(length.GetConstant()->AsIntConstantOrNull()->GetValue()));
+        __ cmpl(temp, Immediate(length.GetConstant()->AsIntConstant()->GetValue()));
       } else {
         __ cmpl(temp, length.AsRegister<Register>());
       }
@@ -887,8 +877,7 @@
     __ movl(temp, Address(input, length_offset));
     __ subl(temp, pos_reg);
     if (length.IsConstant()) {
-      // TODO: Remove "OrNull".
-      __ cmpl(temp, Immediate(length.GetConstant()->AsIntConstantOrNull()->GetValue()));
+      __ cmpl(temp, Immediate(length.GetConstant()->AsIntConstant()->GetValue()));
     } else {
       __ cmpl(temp, length.AsRegister<Register>());
     }
@@ -939,8 +928,7 @@
 
   // We need the count in ECX.
   if (length.IsConstant()) {
-    // TODO: Remove "OrNull".
-    __ movl(count, Immediate(length.GetConstant()->AsIntConstantOrNull()->GetValue()));
+    __ movl(count, Immediate(length.GetConstant()->AsIntConstant()->GetValue()));
   } else {
     __ movl(count, length.AsRegister<Register>());
   }
@@ -958,15 +946,13 @@
   const uint32_t data_offset = mirror::Array::DataOffset(data_size).Uint32Value();
 
   if (src_pos.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t src_pos_const = src_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t src_pos_const = src_pos.GetConstant()->AsIntConstant()->GetValue();
     __ leal(src_base, Address(src, data_size * src_pos_const + data_offset));
   } else {
     __ leal(src_base, Address(src, src_pos.AsRegister<Register>(), scale_factor, data_offset));
   }
   if (dest_pos.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t dest_pos_const = dest_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t dest_pos_const = dest_pos.GetConstant()->AsIntConstant()->GetValue();
     __ leal(dest_base, Address(dest, data_size * dest_pos_const + data_offset));
   } else {
     __ leal(dest_base, Address(dest, dest_pos.AsRegister<Register>(), scale_factor, data_offset));
@@ -1217,8 +1203,7 @@
   SlowPathCode* slow_path = nullptr;
   HInstruction* code_point = invoke->InputAt(1);
   if (code_point->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    if (static_cast<uint32_t>(code_point->AsIntConstantOrNull()->GetValue()) >
+    if (static_cast<uint32_t>(code_point->AsIntConstant()->GetValue()) >
         std::numeric_limits<uint16_t>::max()) {
       // Always needs the slow-path. We could directly dispatch to it, but this case should be
       // rare, so for simplicity just put the full slow-path down and branch unconditionally.
@@ -1458,9 +1443,8 @@
   // public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin);
   Register obj = locations->InAt(0).AsRegister<Register>();
   Location srcBegin = locations->InAt(1);
-  // TODO: Remove "OrNull".
   int srcBegin_value =
-      srcBegin.IsConstant() ? srcBegin.GetConstant()->AsIntConstantOrNull()->GetValue() : 0;
+      srcBegin.IsConstant() ? srcBegin.GetConstant()->AsIntConstant()->GetValue() : 0;
   Register srcEnd = locations->InAt(2).AsRegister<Register>();
   Register dst = locations->InAt(3).AsRegister<Register>();
   Register dstBegin = locations->InAt(4).AsRegister<Register>();
@@ -1613,8 +1597,7 @@
     case DataType::Type::kInt8:
       if (value_loc.IsConstant()) {
         __ movb(Address(address, 0),
-                // TODO: Remove "OrNull".
-                Immediate(value_loc.GetConstant()->AsIntConstantOrNull()->GetValue()));
+                Immediate(value_loc.GetConstant()->AsIntConstant()->GetValue()));
       } else {
         __ movb(Address(address, 0), value_loc.AsRegister<ByteRegister>());
       }
@@ -1622,8 +1605,7 @@
     case DataType::Type::kInt16:
       if (value_loc.IsConstant()) {
         __ movw(Address(address, 0),
-                // TODO: Remove "OrNull".
-                Immediate(value_loc.GetConstant()->AsIntConstantOrNull()->GetValue()));
+                Immediate(value_loc.GetConstant()->AsIntConstant()->GetValue()));
       } else {
         __ movw(Address(address, 0), value_loc.AsRegister<Register>());
       }
@@ -1631,16 +1613,14 @@
     case DataType::Type::kInt32:
       if (value_loc.IsConstant()) {
         __ movl(Address(address, 0),
-                // TODO: Remove "OrNull".
-                Immediate(value_loc.GetConstant()->AsIntConstantOrNull()->GetValue()));
+                Immediate(value_loc.GetConstant()->AsIntConstant()->GetValue()));
       } else {
         __ movl(Address(address, 0), value_loc.AsRegister<Register>());
       }
       break;
     case DataType::Type::kInt64:
       if (value_loc.IsConstant()) {
-        // TODO: Remove "OrNull".
-        int64_t value = value_loc.GetConstant()->AsLongConstantOrNull()->GetValue();
+        int64_t value = value_loc.GetConstant()->AsLongConstant()->GetValue();
         __ movl(Address(address, 0), Immediate(Low32Bits(value)));
         __ movl(Address(address, 4), Immediate(High32Bits(value)));
       } else {
@@ -2570,8 +2550,7 @@
 
   if (invoke->InputAt(0)->IsConstant()) {
     // Evaluate this at compile time.
-    // TODO: Remove "OrNull".
-    int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstantOrNull());
+    int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstant());
     int32_t result = is_long
         ? POPCOUNT(static_cast<uint64_t>(value))
         : POPCOUNT(static_cast<uint32_t>(value));
@@ -2638,8 +2617,7 @@
 
   if (invoke->InputAt(0)->IsConstant()) {
     // Evaluate this at compile time.
-    // TODO: Remove "OrNull".
-    int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstantOrNull());
+    int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstant());
     if (value == 0) {
       value = is_long ? 64 : 32;
     } else {
@@ -2743,8 +2721,7 @@
 
   if (invoke->InputAt(0)->IsConstant()) {
     // Evaluate this at compile time.
-    // TODO: Remove "OrNull".
-    int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstantOrNull());
+    int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstant());
     if (value == 0) {
       value = is_long ? 64 : 32;
     } else {
@@ -2834,8 +2811,7 @@
   const uint32_t data_offset = mirror::Array::DataOffset(element_size).Uint32Value();
 
   if (pos.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t constant = pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t constant = pos.GetConstant()->AsIntConstant()->GetValue();
     __ leal(base, Address(array, element_size * constant + data_offset));
   } else {
     __ leal(base, Address(array, pos.AsRegister<Register>(), scale_factor, data_offset));
@@ -2856,8 +2832,7 @@
   const ScaleFactor scale_factor = static_cast<ScaleFactor>(DataType::SizeShift(type));
 
   if (copy_length.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t constant = copy_length.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t constant = copy_length.GetConstant()->AsIntConstant()->GetValue();
     __ leal(end, Address(base, element_size * constant));
   } else {
     __ leal(end, Address(base, copy_length.AsRegister<Register>(), scale_factor, 0));
@@ -2931,11 +2906,9 @@
   // If source and destination are the same, we go to slow path if we need to do
   // forward copying.
   if (src_pos.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t src_pos_constant = src_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t src_pos_constant = src_pos.GetConstant()->AsIntConstant()->GetValue();
     if (dest_pos.IsConstant()) {
-      // TODO: Remove "OrNull".
-      int32_t dest_pos_constant = dest_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+      int32_t dest_pos_constant = dest_pos.GetConstant()->AsIntConstant()->GetValue();
       if (optimizations.GetDestinationIsSource()) {
         // Checked when building locations.
         DCHECK_GE(src_pos_constant, dest_pos_constant);
@@ -2957,8 +2930,7 @@
       __ j(kNotEqual, &conditions_on_positions_validated);
     }
     if (dest_pos.IsConstant()) {
-      // TODO: Remove "OrNull".
-      int32_t dest_pos_constant = dest_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+      int32_t dest_pos_constant = dest_pos.GetConstant()->AsIntConstant()->GetValue();
       __ cmpl(src_pos.AsRegister<Register>(), Immediate(dest_pos_constant));
       __ j(kLess, intrinsic_slow_path->GetEntryLabel());
     } else {
@@ -3294,8 +3266,7 @@
 static void RequestBaseMethodAddressInRegister(HInvoke* invoke) {
   LocationSummary* locations = invoke->GetLocations();
   if (locations != nullptr) {
-    // TODO: Remove "OrNull".
-    HInvokeStaticOrDirect* invoke_static_or_direct = invoke->AsInvokeStaticOrDirectOrNull();
+    HInvokeStaticOrDirect* invoke_static_or_direct = invoke->AsInvokeStaticOrDirect();
     // Note: The base method address is not present yet when this is called from the
     // PCRelativeHandlerVisitor via IsCallFreeIntrinsic() to determine whether to insert it.
     if (invoke_static_or_direct->HasSpecialInput()) {
@@ -3328,20 +3299,17 @@
   Register out = locations->Out().AsRegister<Register>();
   auto allocate_instance = [&]() {
     DCHECK_EQ(out, InvokeRuntimeCallingConvention().GetRegisterAt(0));
-    // TODO: Remove "OrNull".
-    codegen_->LoadIntrinsicDeclaringClass(out, invoke->AsInvokeStaticOrDirectOrNull());
+    codegen_->LoadIntrinsicDeclaringClass(out, invoke->AsInvokeStaticOrDirect());
     codegen_->InvokeRuntime(kQuickAllocObjectInitialized, invoke, invoke->GetDexPc());
     CheckEntrypointTypes<kQuickAllocObjectWithChecks, void*, mirror::Class*>();
   };
   if (invoke->InputAt(0)->IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t value = invoke->InputAt(0)->AsIntConstantOrNull()->GetValue();
+    int32_t value = invoke->InputAt(0)->AsIntConstant()->GetValue();
     if (static_cast<uint32_t>(value - info.low) < info.length) {
       // Just embed the j.l.Integer in the code.
       DCHECK_NE(info.value_boot_image_reference, IntegerValueOfInfo::kInvalidReference);
       codegen_->LoadBootImageAddress(
-          // TODO: Remove "OrNull".
-          out, info.value_boot_image_reference, invoke->AsInvokeStaticOrDirectOrNull());
+          out, info.value_boot_image_reference, invoke->AsInvokeStaticOrDirect());
     } else {
       DCHECK(locations->CanCall());
       // Allocate and initialize a new j.l.Integer.
@@ -3364,11 +3332,9 @@
                   "Check heap reference size.");
     if (codegen_->GetCompilerOptions().IsBootImage()) {
       DCHECK_EQ(invoke->InputCount(), invoke->GetNumberOfArguments() + 1u);
-      // TODO: Remove "OrNull".
-      size_t method_address_index = invoke->AsInvokeStaticOrDirectOrNull()->GetSpecialInputIndex();
-      // TODO: Remove "OrNull".
+      size_t method_address_index = invoke->AsInvokeStaticOrDirect()->GetSpecialInputIndex();
       HX86ComputeBaseMethodAddress* method_address =
-          invoke->InputAt(method_address_index)->AsX86ComputeBaseMethodAddressOrNull();
+          invoke->InputAt(method_address_index)->AsX86ComputeBaseMethodAddress();
       DCHECK(method_address != nullptr);
       Register method_address_reg =
           invoke->GetLocations()->InAt(method_address_index).AsRegister<Register>();
@@ -3380,9 +3346,8 @@
       // adjust the offset accordingly.
       uint32_t mid_array_boot_image_offset =
               info.array_data_boot_image_reference - info.low * kElementSize;
-      // TODO: Remove "OrNull".
       codegen_->LoadBootImageAddress(
-          out, mid_array_boot_image_offset, invoke->AsInvokeStaticOrDirectOrNull());
+          out, mid_array_boot_image_offset, invoke->AsInvokeStaticOrDirect());
       DCHECK_NE(out, in);
       __ movl(out, Address(out, in, TIMES_4, 0));
     }
@@ -3421,8 +3386,7 @@
 
   // Load the java.lang.ref.Reference class, use the output register as a temporary.
   codegen_->LoadIntrinsicDeclaringClass(out.AsRegister<Register>(),
-                                        // TODO: Remove "OrNull".
-                                        invoke->AsInvokeStaticOrDirectOrNull());
+                                        invoke->AsInvokeStaticOrDirect());
 
   // Check static fields java.lang.ref.Reference.{disableIntrinsic,slowPathEnabled} together.
   MemberOffset disable_intrinsic_offset = IntrinsicVisitor::GetReferenceDisableIntrinsicOffset();
diff --git a/compiler/optimizing/intrinsics_x86_64.cc b/compiler/optimizing/intrinsics_x86_64.cc
index 3a441f3..e18ef8e 100644
--- a/compiler/optimizing/intrinsics_x86_64.cc
+++ b/compiler/optimizing/intrinsics_x86_64.cc
@@ -83,8 +83,7 @@
         << "Unexpected instruction in read barrier arraycopy slow path: "
         << instruction_->DebugName();
     DCHECK(instruction_->GetLocations()->Intrinsified());
-    // TODO: Remove "OrNull".
-    DCHECK_EQ(instruction_->AsInvokeOrNull()->GetIntrinsic(), Intrinsics::kSystemArrayCopy);
+    DCHECK_EQ(instruction_->AsInvoke()->GetIntrinsic(), Intrinsics::kSystemArrayCopy);
 
     int32_t element_size = DataType::Size(DataType::Type::kReference);
 
@@ -664,15 +663,13 @@
   const uint32_t length_offset = mirror::Array::LengthOffset().Uint32Value();
 
   if (pos.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t pos_const = pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t pos_const = pos.GetConstant()->AsIntConstant()->GetValue();
     if (pos_const == 0) {
       if (!length_is_input_length) {
         // Check that length(input) >= length.
         if (length.IsConstant()) {
           __ cmpl(Address(input, length_offset),
-                  // TODO: Remove "OrNull".
-                  Immediate(length.GetConstant()->AsIntConstantOrNull()->GetValue()));
+                  Immediate(length.GetConstant()->AsIntConstant()->GetValue()));
         } else {
           __ cmpl(Address(input, length_offset), length.AsRegister<CpuRegister>());
         }
@@ -686,8 +683,7 @@
 
       // Check that (length(input) - pos) >= length.
       if (length.IsConstant()) {
-        // TODO: Remove "OrNull".
-        __ cmpl(temp, Immediate(length.GetConstant()->AsIntConstantOrNull()->GetValue()));
+        __ cmpl(temp, Immediate(length.GetConstant()->AsIntConstant()->GetValue()));
       } else {
         __ cmpl(temp, length.AsRegister<CpuRegister>());
       }
@@ -712,8 +708,7 @@
     __ movl(temp, Address(input, length_offset));
     __ subl(temp, pos_reg);
     if (length.IsConstant()) {
-      // TODO: Remove "OrNull".
-      __ cmpl(temp, Immediate(length.GetConstant()->AsIntConstantOrNull()->GetValue()));
+      __ cmpl(temp, Immediate(length.GetConstant()->AsIntConstant()->GetValue()));
     } else {
       __ cmpl(temp, length.AsRegister<CpuRegister>());
     }
@@ -770,8 +765,7 @@
 
   // We need the count in RCX.
   if (length.IsConstant()) {
-    // TODO: Remove "OrNull".
-    __ movl(count, Immediate(length.GetConstant()->AsIntConstantOrNull()->GetValue()));
+    __ movl(count, Immediate(length.GetConstant()->AsIntConstant()->GetValue()));
   } else {
     __ movl(count, length.AsRegister<CpuRegister>());
   }
@@ -783,15 +777,13 @@
   const uint32_t data_offset = mirror::Array::DataOffset(data_size).Uint32Value();
 
   if (src_pos.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t src_pos_const = src_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t src_pos_const = src_pos.GetConstant()->AsIntConstant()->GetValue();
     __ leal(src_base, Address(src, data_size * src_pos_const + data_offset));
   } else {
     __ leal(src_base, Address(src, src_pos.AsRegister<CpuRegister>(), scale_factor, data_offset));
   }
   if (dest_pos.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t dest_pos_const = dest_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t dest_pos_const = dest_pos.GetConstant()->AsIntConstant()->GetValue();
     __ leal(dest_base, Address(dest, data_size * dest_pos_const + data_offset));
   } else {
     __ leal(dest_base,
@@ -871,24 +863,21 @@
   const uint32_t data_offset = mirror::Array::DataOffset(element_size).Uint32Value();
 
   if (src_pos.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t constant = src_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t constant = src_pos.GetConstant()->AsIntConstant()->GetValue();
     __ leal(src_base, Address(src, element_size * constant + data_offset));
   } else {
     __ leal(src_base, Address(src, src_pos.AsRegister<CpuRegister>(), scale_factor, data_offset));
   }
 
   if (dst_pos.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t constant = dst_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t constant = dst_pos.GetConstant()->AsIntConstant()->GetValue();
     __ leal(dst_base, Address(dst, element_size * constant + data_offset));
   } else {
     __ leal(dst_base, Address(dst, dst_pos.AsRegister<CpuRegister>(), scale_factor, data_offset));
   }
 
   if (copy_length.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t constant = copy_length.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t constant = copy_length.GetConstant()->AsIntConstant()->GetValue();
     __ leal(src_end, Address(src_base, element_size * constant));
   } else {
     __ leal(src_end, Address(src_base, copy_length.AsRegister<CpuRegister>(), scale_factor, 0));
@@ -932,11 +921,9 @@
   // If source and destination are the same, we go to slow path if we need to do
   // forward copying.
   if (src_pos.IsConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t src_pos_constant = src_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+    int32_t src_pos_constant = src_pos.GetConstant()->AsIntConstant()->GetValue();
     if (dest_pos.IsConstant()) {
-      // TODO: Remove "OrNull".
-      int32_t dest_pos_constant = dest_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+      int32_t dest_pos_constant = dest_pos.GetConstant()->AsIntConstant()->GetValue();
       if (optimizations.GetDestinationIsSource()) {
         // Checked when building locations.
         DCHECK_GE(src_pos_constant, dest_pos_constant);
@@ -958,8 +945,7 @@
       __ j(kNotEqual, &conditions_on_positions_validated);
     }
     if (dest_pos.IsConstant()) {
-      // TODO: Remove "OrNull".
-      int32_t dest_pos_constant = dest_pos.GetConstant()->AsIntConstantOrNull()->GetValue();
+      int32_t dest_pos_constant = dest_pos.GetConstant()->AsIntConstant()->GetValue();
       __ cmpl(src_pos.AsRegister<CpuRegister>(), Immediate(dest_pos_constant));
       __ j(kLess, intrinsic_slow_path->GetEntryLabel());
     } else {
@@ -1437,8 +1423,7 @@
   SlowPathCode* slow_path = nullptr;
   HInstruction* code_point = invoke->InputAt(1);
   if (code_point->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    if (static_cast<uint32_t>(code_point->AsIntConstantOrNull()->GetValue()) >
+    if (static_cast<uint32_t>(code_point->AsIntConstant()->GetValue()) >
         std::numeric_limits<uint16_t>::max()) {
       // Always needs the slow-path. We could directly dispatch to it, but this case should be
       // rare, so for simplicity just put the full slow-path down and branch unconditionally.
@@ -1669,9 +1654,8 @@
   // public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin);
   CpuRegister obj = locations->InAt(0).AsRegister<CpuRegister>();
   Location srcBegin = locations->InAt(1);
-  // TODO: Remove "OrNull".
   int srcBegin_value =
-      srcBegin.IsConstant() ? srcBegin.GetConstant()->AsIntConstantOrNull()->GetValue() : 0;
+      srcBegin.IsConstant() ? srcBegin.GetConstant()->AsIntConstant()->GetValue() : 0;
   CpuRegister srcEnd = locations->InAt(2).AsRegister<CpuRegister>();
   CpuRegister dst = locations->InAt(3).AsRegister<CpuRegister>();
   CpuRegister dstBegin = locations->InAt(4).AsRegister<CpuRegister>();
@@ -1827,8 +1811,7 @@
       break;
     case DataType::Type::kInt64:
       if (value.IsConstant()) {
-        // TODO: Remove "OrNull".
-        int64_t v = value.GetConstant()->AsLongConstantOrNull()->GetValue();
+        int64_t v = value.GetConstant()->AsLongConstant()->GetValue();
         DCHECK(IsInt<32>(v));
         int32_t v_32 = v;
         __ movq(Address(address, 0), Immediate(v_32));
@@ -2755,8 +2738,7 @@
 
   if (invoke->InputAt(0)->IsConstant()) {
     // Evaluate this at compile time.
-    // TODO: Remove "OrNull".
-    int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstantOrNull());
+    int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstant());
     int32_t result = is_long
         ? POPCOUNT(static_cast<uint64_t>(value))
         : POPCOUNT(static_cast<uint32_t>(value));
@@ -2814,8 +2796,7 @@
 
   if (invoke->InputAt(0)->IsConstant()) {
     // Evaluate this at compile time.
-    // TODO: Remove "OrNull".
-    int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstantOrNull());
+    int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstant());
     if (value == 0) {
       __ xorl(out, out);  // Clears upper bits too.
       return;
@@ -2948,8 +2929,7 @@
   int zero_value_result = is_long ? 64 : 32;
   if (invoke->InputAt(0)->IsConstant()) {
     // Evaluate this at compile time.
-    // TODO: Remove "OrNull".
-    int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstantOrNull());
+    int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstant());
     if (value == 0) {
       value = zero_value_result;
     } else {
@@ -3022,8 +3002,7 @@
   int zero_value_result = is_long ? 64 : 32;
   if (invoke->InputAt(0)->IsConstant()) {
     // Evaluate this at compile time.
-    // TODO: Remove "OrNull".
-    int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstantOrNull());
+    int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstant());
     if (value == 0) {
       value = zero_value_result;
     } else {
@@ -3098,8 +3077,7 @@
     CheckEntrypointTypes<kQuickAllocObjectWithChecks, void*, mirror::Class*>();
   };
   if (invoke->InputAt(0)->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t value = invoke->InputAt(0)->AsIntConstantOrNull()->GetValue();
+    int32_t value = invoke->InputAt(0)->AsIntConstant()->GetValue();
     if (static_cast<uint32_t>(value - info.low) < info.length) {
       // Just embed the j.l.Integer in the code.
       DCHECK_NE(info.value_boot_image_reference, IntegerValueOfInfo::kInvalidReference);
@@ -3405,8 +3383,7 @@
 
  private:
   HInvoke* GetInvoke() const {
-    // TODO: Remove "OrNull".
-    return GetInstruction()->AsInvokeOrNull();
+    return GetInstruction()->AsInvoke();
   }
 
   mirror::VarHandle::AccessModeTemplate GetAccessModeTemplate() const {
diff --git a/compiler/optimizing/live_ranges_test.cc b/compiler/optimizing/live_ranges_test.cc
index 4e1a49b..fb1a23e 100644
--- a/compiler/optimizing/live_ranges_test.cc
+++ b/compiler/optimizing/live_ranges_test.cc
@@ -311,8 +311,7 @@
   liveness.Analyze();
 
   // Test for the 0 constant.
-  // TODO: Remove "OrNull".
-  HIntConstant* constant = liveness.GetInstructionFromSsaIndex(0)->AsIntConstantOrNull();
+  HIntConstant* constant = liveness.GetInstructionFromSsaIndex(0)->AsIntConstant();
   LiveInterval* interval = constant->GetLiveInterval();
   LiveRange* range = interval->GetFirstRange();
   ASSERT_EQ(2u, range->GetStart());
@@ -322,8 +321,7 @@
   ASSERT_TRUE(range->GetNext() == nullptr);
 
   // Test for the loop phi.
-  // TODO: Remove "OrNull".
-  HPhi* phi = liveness.GetInstructionFromSsaIndex(1)->AsPhiOrNull();
+  HPhi* phi = liveness.GetInstructionFromSsaIndex(1)->AsPhi();
   interval = phi->GetLiveInterval();
   range = interval->GetFirstRange();
   ASSERT_EQ(10u, range->GetStart());
@@ -334,8 +332,7 @@
   ASSERT_EQ(24u, range->GetEnd());
 
   // Test for the add instruction.
-  // TODO: Remove "OrNull".
-  HAdd* add = liveness.GetInstructionFromSsaIndex(2)->AsAddOrNull();
+  HAdd* add = liveness.GetInstructionFromSsaIndex(2)->AsAdd();
   interval = add->GetLiveInterval();
   range = interval->GetFirstRange();
   ASSERT_EQ(18u, range->GetStart());
@@ -409,8 +406,7 @@
   ASSERT_TRUE(range->GetNext() == nullptr);
 
   // Test for the first add.
-  // TODO: Remove "OrNull".
-  HAdd* add = liveness.GetInstructionFromSsaIndex(2)->AsAddOrNull();
+  HAdd* add = liveness.GetInstructionFromSsaIndex(2)->AsAdd();
   interval = add->GetLiveInterval();
   range = interval->GetFirstRange();
   ASSERT_EQ(16u, range->GetStart());
@@ -418,16 +414,14 @@
   ASSERT_TRUE(range->GetNext() == nullptr);
 
   // Test for the second add.
-  // TODO: Remove "OrNull".
-  add = liveness.GetInstructionFromSsaIndex(3)->AsAddOrNull();
+  add = liveness.GetInstructionFromSsaIndex(3)->AsAdd();
   interval = add->GetLiveInterval();
   range = interval->GetFirstRange();
   ASSERT_EQ(22u, range->GetStart());
   ASSERT_EQ(26u, range->GetEnd());
   ASSERT_TRUE(range->GetNext() == nullptr);
 
-  // TODO: Remove "OrNull".
-  HPhi* phi = liveness.GetInstructionFromSsaIndex(4)->AsPhiOrNull();
+  HPhi* phi = liveness.GetInstructionFromSsaIndex(4)->AsPhi();
   ASSERT_TRUE(phi->GetUses().HasExactlyOneElement());
   interval = phi->GetLiveInterval();
   range = interval->GetFirstRange();
diff --git a/compiler/optimizing/load_store_analysis.cc b/compiler/optimizing/load_store_analysis.cc
index 9a63da4..b46e3e1 100644
--- a/compiler/optimizing/load_store_analysis.cc
+++ b/compiler/optimizing/load_store_analysis.cc
@@ -51,10 +51,9 @@
 
   // Since 'i' are the same in [i+CONST] and [i],
   // further compare [CONST] and [0].
-  // TODO: Remove "OrNull".
   int64_t l1 = idx1->IsAdd()
-      ? idx1->GetConstantRight()->AsIntConstantOrNull()->GetValue()
-      : -idx1->GetConstantRight()->AsIntConstantOrNull()->GetValue();
+      ? idx1->GetConstantRight()->AsIntConstant()->GetValue()
+      : -idx1->GetConstantRight()->AsIntConstant()->GetValue();
   int64_t l2 = 0;
   int64_t h1 = l1 + (vector_length1 - 1);
   int64_t h2 = l2 + (vector_length2 - 1);
@@ -80,14 +79,12 @@
 
   // Since 'i' are the same in [i+CONST1] and [i+CONST2],
   // further compare [CONST1] and [CONST2].
-  // TODO: Remove "OrNull".
   int64_t l1 = idx1->IsAdd()
-      ? idx1->GetConstantRight()->AsIntConstantOrNull()->GetValue()
-      : -idx1->GetConstantRight()->AsIntConstantOrNull()->GetValue();
-  // TODO: Remove "OrNull".
+      ? idx1->GetConstantRight()->AsIntConstant()->GetValue()
+      : -idx1->GetConstantRight()->AsIntConstant()->GetValue();
   int64_t l2 = idx2->IsAdd()
-      ? idx2->GetConstantRight()->AsIntConstantOrNull()->GetValue()
-      : -idx2->GetConstantRight()->AsIntConstantOrNull()->GetValue();
+      ? idx2->GetConstantRight()->AsIntConstant()->GetValue()
+      : -idx2->GetConstantRight()->AsIntConstant()->GetValue();
   int64_t h1 = l1 + (vector_length1 - 1);
   int64_t h2 = l2 + (vector_length2 - 1);
   return CanIntegerRangesOverlap(l1, h1, l2, h2);
@@ -132,14 +129,11 @@
 
 bool HeapLocationCollector::InstructionEligibleForLSERemoval(HInstruction* inst) const {
   if (inst->IsNewInstance()) {
-    // TODO: Remove "OrNull".
-    return !inst->AsNewInstanceOrNull()->NeedsChecks();
+    return !inst->AsNewInstance()->NeedsChecks();
   } else if (inst->IsNewArray()) {
-    // TODO: Remove "OrNull".
-    HInstruction* array_length = inst->AsNewArrayOrNull()->GetLength();
-    // TODO: Remove "OrNull".
+    HInstruction* array_length = inst->AsNewArray()->GetLength();
     bool known_array_length =
-        array_length->IsIntConstant() && array_length->AsIntConstantOrNull()->GetValue() >= 0;
+        array_length->IsIntConstant() && array_length->AsIntConstant()->GetValue() >= 0;
     return known_array_length &&
            std::all_of(inst->GetUses().cbegin(),
                        inst->GetUses().cend(),
@@ -229,10 +223,8 @@
 
   // [CONST1] and [CONST2].
   if (idx1->IsIntConstant() && idx2->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    int64_t l1 = idx1->AsIntConstantOrNull()->GetValue();
-    // TODO: Remove "OrNull".
-    int64_t l2 = idx2->AsIntConstantOrNull()->GetValue();
+    int64_t l1 = idx1->AsIntConstant()->GetValue();
+    int64_t l2 = idx2->AsIntConstant()->GetValue();
     // To avoid any overflow in following CONST+vector_length calculation,
     // use int64_t instead of int32_t.
     int64_t h1 = l1 + (vector_length1 - 1);
@@ -241,39 +233,33 @@
   }
 
   // [i+CONST] and [i].
-  // TODO: Remove "OrNull".
   if (idx1->IsBinaryOperation() &&
-      idx1->AsBinaryOperationOrNull()->GetConstantRight() != nullptr &&
-      idx1->AsBinaryOperationOrNull()->GetLeastConstantLeft() == idx2) {
-    // TODO: Remove "OrNull".
-    return CanBinaryOpAndIndexAlias(idx1->AsBinaryOperationOrNull(),
+      idx1->AsBinaryOperation()->GetConstantRight() != nullptr &&
+      idx1->AsBinaryOperation()->GetLeastConstantLeft() == idx2) {
+    return CanBinaryOpAndIndexAlias(idx1->AsBinaryOperation(),
                                     vector_length1,
                                     idx2,
                                     vector_length2);
   }
 
   // [i] and [i+CONST].
-  // TODO: Remove "OrNull".
   if (idx2->IsBinaryOperation() &&
-      idx2->AsBinaryOperationOrNull()->GetConstantRight() != nullptr &&
-      idx2->AsBinaryOperationOrNull()->GetLeastConstantLeft() == idx1) {
-    // TODO: Remove "OrNull".
-    return CanBinaryOpAndIndexAlias(idx2->AsBinaryOperationOrNull(),
+      idx2->AsBinaryOperation()->GetConstantRight() != nullptr &&
+      idx2->AsBinaryOperation()->GetLeastConstantLeft() == idx1) {
+    return CanBinaryOpAndIndexAlias(idx2->AsBinaryOperation(),
                                     vector_length2,
                                     idx1,
                                     vector_length1);
   }
 
   // [i+CONST1] and [i+CONST2].
-  // TODO: Remove "OrNull".
   if (idx1->IsBinaryOperation() &&
-      idx1->AsBinaryOperationOrNull()->GetConstantRight() != nullptr &&
+      idx1->AsBinaryOperation()->GetConstantRight() != nullptr &&
       idx2->IsBinaryOperation() &&
-      idx2->AsBinaryOperationOrNull()->GetConstantRight() != nullptr) {
-    // TODO: Remove "OrNull".
-    return CanBinaryOpsAlias(idx1->AsBinaryOperationOrNull(),
+      idx2->AsBinaryOperation()->GetConstantRight() != nullptr) {
+    return CanBinaryOpsAlias(idx1->AsBinaryOperation(),
                              vector_length1,
-                             idx2->AsBinaryOperationOrNull(),
+                             idx2->AsBinaryOperation(),
                              vector_length2);
   }
 
diff --git a/compiler/optimizing/load_store_analysis.h b/compiler/optimizing/load_store_analysis.h
index 97a7cf6..c46a5b9 100644
--- a/compiler/optimizing/load_store_analysis.h
+++ b/compiler/optimizing/load_store_analysis.h
@@ -334,11 +334,9 @@
     size_t vector_length = HeapLocation::kScalar;
     const bool is_vec_op = instruction->IsVecStore() || instruction->IsVecLoad();
     if (instruction->IsArraySet()) {
-      // TODO: Remove "OrNull".
-      type = instruction->AsArraySetOrNull()->GetComponentType();
+      type = instruction->AsArraySet()->GetComponentType();
     } else if (is_vec_op) {
-      // TODO: Remove "OrNull".
-      HVecOperation* vec_op = instruction->AsVecOperationOrNull();
+      HVecOperation* vec_op = instruction->AsVecOperation();
       type = vec_op->GetPackedType();
       vector_length = vec_op->GetVectorLength();
     } else {
diff --git a/compiler/optimizing/load_store_elimination.cc b/compiler/optimizing/load_store_elimination.cc
index b44db65..9cabb12 100644
--- a/compiler/optimizing/load_store_elimination.cc
+++ b/compiler/optimizing/load_store_elimination.cc
@@ -736,8 +736,7 @@
           use.GetUser()->MoveBefore(instruction);
         }
         DCHECK(use.GetUser()->StrictlyDominates(instruction));
-        // TODO: Remove "OrNull".
-        return use.GetUser()->AsTypeConversionOrNull();
+        return use.GetUser()->AsTypeConversion();
       }
     }
 
@@ -976,13 +975,9 @@
   }
 
   void HandleAcquireLoad(HInstruction* instruction) {
-    // TODO: Remove "OrNull".
-    DCHECK((instruction->IsInstanceFieldGet() &&
-            instruction->AsInstanceFieldGetOrNull()->IsVolatile()) ||
-           (instruction->IsStaticFieldGet() &&
-            instruction->AsStaticFieldGetOrNull()->IsVolatile()) ||
-           (instruction->IsMonitorOperation() &&
-            instruction->AsMonitorOperationOrNull()->IsEnter()))
+    DCHECK((instruction->IsInstanceFieldGet() && instruction->AsInstanceFieldGet()->IsVolatile()) ||
+           (instruction->IsStaticFieldGet() && instruction->AsStaticFieldGet()->IsVolatile()) ||
+           (instruction->IsMonitorOperation() && instruction->AsMonitorOperation()->IsEnter()))
         << "Unexpected instruction " << instruction->GetId() << ": " << instruction->DebugName();
 
     // Acquire operations e.g. MONITOR_ENTER change the thread's view of the memory, so we must
@@ -1000,13 +995,9 @@
   }
 
   void HandleReleaseStore(HInstruction* instruction) {
-    // TODO: Remove "OrNull".
-    DCHECK((instruction->IsInstanceFieldSet() &&
-            instruction->AsInstanceFieldSetOrNull()->IsVolatile()) ||
-           (instruction->IsStaticFieldSet() &&
-            instruction->AsStaticFieldSetOrNull()->IsVolatile()) ||
-           (instruction->IsMonitorOperation() &&
-            !instruction->AsMonitorOperationOrNull()->IsEnter()))
+    DCHECK((instruction->IsInstanceFieldSet() && instruction->AsInstanceFieldSet()->IsVolatile()) ||
+           (instruction->IsStaticFieldSet() && instruction->AsStaticFieldSet()->IsVolatile()) ||
+           (instruction->IsMonitorOperation() && !instruction->AsMonitorOperation()->IsEnter()))
         << "Unexpected instruction " << instruction->GetId() << ": " << instruction->DebugName();
 
     // Release operations e.g. MONITOR_EXIT do not affect this thread's view of the memory, but
@@ -1114,9 +1105,8 @@
       if (!inside_a_try && info->IsSingleton()) {
         HInstruction* reference = info->GetReference();
         // Finalizable objects always escape.
-        // TODO: Remove "OrNull".
         const bool finalizable_object =
-            reference->IsNewInstance() && reference->AsNewInstanceOrNull()->IsFinalizable();
+            reference->IsNewInstance() && reference->AsNewInstance()->IsFinalizable();
         if (!finalizable_object && !IsEscapingObject(info, block, i)) {
           // Check whether the reference for a store is used by an environment local of
           // the HDeoptimize. If not, the singleton is not observed after deoptimization.
@@ -1341,8 +1331,7 @@
     }
     if (ref_info->IsSingletonAndRemovable()) {
       if (new_array->GetLength()->IsIntConstant() &&
-          // TODO: Remove "OrNull".
-          new_array->GetLength()->AsIntConstantOrNull()->GetValue() >= 0) {
+          new_array->GetLength()->AsIntConstant()->GetValue() >= 0) {
         // new_array can potentially be eliminated.
         singleton_new_instances_.push_back(new_array);
       } else {
@@ -1676,9 +1665,8 @@
   const ReferenceInfo* ref_info = heap_location_collector_.GetHeapLocation(idx)->GetReferenceInfo();
   const HInstruction* reference = ref_info->GetReference();
   // Finalizable objects always escape.
-  // TODO: Remove "OrNull".
   const bool is_finalizable =
-      reference->IsNewInstance() && reference->AsNewInstanceOrNull()->IsFinalizable();
+      reference->IsNewInstance() && reference->AsNewInstance()->IsFinalizable();
   if (ref_info->IsSingleton() &&
       block->GetLoopInformation()->Contains(*reference->GetBlock()) &&
       !is_finalizable) {
@@ -2411,9 +2399,7 @@
   for (size_t phi_placeholder_index : phi_placeholder_indexes) {
     PhiPlaceholder phi_placeholder = GetPhiPlaceholderAt(phi_placeholder_index);
     HBasicBlock* block = blocks[phi_placeholder.GetBlockId()];
-    // TODO: Remove "OrNull".
-    block->AddPhi(
-        phi_placeholder_replacements_[phi_placeholder_index].GetInstruction()->AsPhiOrNull());
+    block->AddPhi(phi_placeholder_replacements_[phi_placeholder_index].GetInstruction()->AsPhi());
   }
   if (type == DataType::Type::kReference) {
     ScopedArenaAllocator local_allocator(allocator_.GetArenaStack());
@@ -3393,8 +3379,7 @@
         } else if (ins->IsInstanceFieldGet()) {
           // IFieldGet[obj] => PredicatedIFieldGet[PartialValue, obj]
           HInstruction* new_fget = new (GetGraph()->GetAllocator()) HPredicatedInstanceFieldGet(
-              // TODO: Remove "OrNull".
-              ins->AsInstanceFieldGetOrNull(),
+              ins->AsInstanceFieldGet(),
               GetMaterialization(ins->GetBlock()),
               helper_->lse_->GetPartialValueAt(OriginalNewInstance(), ins));
           MaybeRecordStat(helper_->lse_->stats_, MethodCompilationStat::kPredicatedLoadAdded);
@@ -3420,8 +3405,7 @@
           ins->GetBlock()->RemoveInstruction(ins);
         } else if (ins->IsInstanceFieldSet()) {
           // Any predicated sets shouldn't require movement.
-          // TODO: Remove "OrNull".
-          ins->AsInstanceFieldSetOrNull()->SetIsPredicatedSet();
+          ins->AsInstanceFieldSet()->SetIsPredicatedSet();
           MaybeRecordStat(helper_->lse_->stats_, MethodCompilationStat::kPredicatedStoreAdded);
           HInstruction* merged_inst = GetMaterialization(ins->GetBlock());
           ins->ReplaceInput(merged_inst, idx);
@@ -3490,8 +3474,7 @@
           }
         } else if (use.GetUser()->IsConstructorFence()) {
           LSE_VLOG << "User " << *use.GetUser() << " being moved to materialization!";
-          // TODO: Remove "OrNull".
-          constructor_fences.push_back({use.GetUser()->AsConstructorFenceOrNull(), use.GetIndex()});
+          constructor_fences.push_back({use.GetUser()->AsConstructorFence(), use.GetIndex()});
         } else {
           LSE_VLOG << "User " << *use.GetUser() << " not contained in cohort!";
           to_remove.push_back(use.GetUser());
@@ -3662,8 +3645,7 @@
       for (HInstruction* ins :
            MakeSTLInstructionIteratorRange(HInstructionIterator(blk->GetInstructions()))) {
         if (ins->IsNewInstance()) {
-          // TODO: Remove "OrNull".
-          materializations.push_back(ins->AsNewInstanceOrNull());
+          materializations.push_back(ins->AsNewInstance());
           still_unsorted.SetBit(ins->GetId());
         }
       }
@@ -3717,8 +3699,7 @@
       if (ri->IsPartialSingleton() &&
           ri->GetReference()->GetBlock() != nullptr &&
           ri->GetNoEscapeSubgraph()->ContainsBlock(ri->GetReference()->GetBlock())) {
-        // TODO: Remove "OrNull".
-        RecordHeapRefField(ri->GetReference()->AsNewInstanceOrNull(), i);
+        RecordHeapRefField(ri->GetReference()->AsNewInstance(), i);
       }
     }
   }
@@ -3744,8 +3725,7 @@
 
   void NotifyNewMaterialization(HInstruction* ins) {
     if (ins->IsPhi()) {
-      // TODO: Remove "OrNull".
-      new_ref_phis_.push_back(ins->AsPhiOrNull());
+      new_ref_phis_.push_back(ins->AsPhi());
     }
   }
 
@@ -3793,8 +3773,7 @@
   }
   HBasicBlock* bb = helper.GetOrCreateMaterializationBlock(entry, pred_idx);
   CHECK(bb != nullptr) << "entry " << entry->GetBlockId() << " -> " << old_pred->GetBlockId();
-  // TODO: Remove "OrNull".
-  HNewInstance* repl_create = new_inst->Clone(GetGraph()->GetAllocator())->AsNewInstanceOrNull();
+  HNewInstance* repl_create = new_inst->Clone(GetGraph()->GetAllocator())->AsNewInstance();
   repl_create->SetPartialMaterialization();
   bb->InsertInstructionBefore(repl_create, bb->GetLastInstruction());
   repl_create->CopyEnvironmentFrom(new_inst->GetEnvironment());
diff --git a/compiler/optimizing/load_store_elimination_test.cc b/compiler/optimizing/load_store_elimination_test.cc
index 2126f9e..9fcc8dd 100644
--- a/compiler/optimizing/load_store_elimination_test.cc
+++ b/compiler/optimizing/load_store_elimination_test.cc
@@ -392,21 +392,17 @@
     PartialComparisonKind kind = GetParam();
     if (ins->IsIntConstant()) {
       if (kind.IsDefinitelyTrue()) {
-        // TODO: Remove "OrNull".
-        EXPECT_TRUE(ins->AsIntConstantOrNull()->IsTrue()) << kind << " " << *ins;
+        EXPECT_TRUE(ins->AsIntConstant()->IsTrue()) << kind << " " << *ins;
       } else if (kind.IsDefinitelyFalse()) {
-        // TODO: Remove "OrNull".
-        EXPECT_TRUE(ins->AsIntConstantOrNull()->IsFalse()) << kind << " " << *ins;
+        EXPECT_TRUE(ins->AsIntConstant()->IsFalse()) << kind << " " << *ins;
       } else {
         EXPECT_EQ(placement, ComparisonPlacement::kBeforeEscape);
         EXPECT_EQ(kind.target_, Target::kValue);
         // We are before escape so value is not the object
         if (kind.type_ == Type::kEquals) {
-          // TODO: Remove "OrNull".
-          EXPECT_TRUE(ins->AsIntConstantOrNull()->IsFalse()) << kind << " " << *ins;
+          EXPECT_TRUE(ins->AsIntConstant()->IsFalse()) << kind << " " << *ins;
         } else {
-          // TODO: Remove "OrNull".
-          EXPECT_TRUE(ins->AsIntConstantOrNull()->IsTrue()) << kind << " " << *ins;
+          EXPECT_TRUE(ins->AsIntConstant()->IsTrue()) << kind << " " << *ins;
         }
       }
       return;
@@ -417,14 +413,10 @@
     if (placement == ComparisonPlacement::kInEscape) {
       // Should be the same type.
       ASSERT_TRUE(ins->IsEqual() || ins->IsNotEqual()) << *ins;
-      // TODO: Remove "OrNull".
-      HInstruction* other = kind.position_ == Position::kLeft
-          ? ins->AsBinaryOperationOrNull()->GetRight()
-          : ins->AsBinaryOperationOrNull()->GetLeft();
+      HInstruction* other = kind.position_ == Position::kLeft ? ins->AsBinaryOperation()->GetRight()
+                                                              : ins->AsBinaryOperation()->GetLeft();
       if (kind.target_ == Target::kSelf) {
-        // TODO: Remove "OrNull".
-        EXPECT_INS_EQ(ins->AsBinaryOperationOrNull()->GetLeft(),
-                      ins->AsBinaryOperationOrNull()->GetRight())
+        EXPECT_INS_EQ(ins->AsBinaryOperation()->GetLeft(), ins->AsBinaryOperation()->GetRight())
             << " ins is: " << *ins;
       } else if (kind.target_ == Target::kNull) {
         EXPECT_INS_EQ(other, graph_->GetNullConstant()) << " ins is: " << *ins;
diff --git a/compiler/optimizing/locations.cc b/compiler/optimizing/locations.cc
index a1506ce..4189bc4 100644
--- a/compiler/optimizing/locations.cc
+++ b/compiler/optimizing/locations.cc
@@ -99,8 +99,7 @@
   DCHECK(instruction != nullptr);
   DCHECK(instruction->IsConstant());
   DCHECK_EQ(reinterpret_cast<uintptr_t>(instruction),
-            // TODO: Remove "OrNull".
-            reinterpret_cast<uintptr_t>(instruction->AsConstantOrNull()));
+            reinterpret_cast<uintptr_t>(instruction->AsConstant()));
 }
 
 std::ostream& operator<<(std::ostream& os, const Location& location) {
diff --git a/compiler/optimizing/loop_optimization.cc b/compiler/optimizing/loop_optimization.cc
index 4c51748..d5e3463 100644
--- a/compiler/optimizing/loop_optimization.cc
+++ b/compiler/optimizing/loop_optimization.cc
@@ -732,8 +732,7 @@
   // Examples: for (int i = 0; x != null;   i++) { .... no i .... }
   //           for (int i = 0; i < 10; i++, k++) { .... no k .... } return k;
   for (HInstructionIterator it(header->GetPhis()); !it.Done(); it.Advance()) {
-    // TODO: Remove "OrNull".
-    HPhi* phi = it.Current()->AsPhiOrNull();
+    HPhi* phi = it.Current()->AsPhi();
     if (TrySetPhiInduction(phi, /*restrict_uses*/ true) &&
         TryAssignLastValue(node->loop_info, phi, preheader, /*collect_loop_uses*/ false)) {
       // Note that it's ok to have replaced uses after the loop with the last value, without
@@ -892,9 +891,8 @@
     helper.DoUnrolling();
 
     // Remove the redundant loop check after unrolling.
-    // TODO: Remove "OrNull".
     HIf* copy_hif =
-        helper.GetBasicBlockMap()->Get(loop_info->GetHeader())->GetLastInstruction()->AsIfOrNull();
+        helper.GetBasicBlockMap()->Get(loop_info->GetHeader())->GetLastInstruction()->AsIf();
     int32_t constant = loop_info->Contains(*copy_hif->IfTrueSuccessor()) ? 1 : 0;
     copy_hif->ReplaceInput(graph_->GetIntConstant(constant), 0u);
   }
@@ -922,8 +920,7 @@
     for (auto entry : *hir_map) {
       HInstruction* copy = entry.second;
       if (copy->IsIf()) {
-        // TODO: Remove "OrNull".
-        TryToEvaluateIfCondition(copy->AsIfOrNull(), graph_);
+        TryToEvaluateIfCondition(copy->AsIf(), graph_);
       }
     }
   }
@@ -962,8 +959,7 @@
     //
     HLoopInformation* loop_info = analysis_info->GetLoopInfo();
     PeelByCount(loop_info, trip_count, &induction_range_);
-    // TODO: Remove "OrNull".
-    HIf* loop_hif = loop_info->GetHeader()->GetLastInstruction()->AsIfOrNull();
+    HIf* loop_hif = loop_info->GetHeader()->GetLastInstruction()->AsIf();
     int32_t constant = loop_info->Contains(*loop_hif->IfTrueSuccessor()) ? 0 : 1;
     loop_hif->ReplaceInput(graph_->GetIntConstant(constant), 0u);
   }
@@ -1371,8 +1367,7 @@
       if (i != vector_map_->end() && !i->second->IsInBlock()) {
         Insert(vector_body_, i->second);
         if (IsInPredicatedVectorizationMode() && i->second->IsVecOperation()) {
-          // TODO: Remove "OrNull".
-          HVecOperation* op = i->second->AsVecOperationOrNull();
+          HVecOperation* op = i->second->AsVecOperation();
           op->SetMergingGoverningPredicate(set_pred);
         }
         // Deal with instructions that need an environment, such as the scalar intrinsics.
@@ -1389,8 +1384,7 @@
   for (auto i = reductions_->begin(); i != reductions_->end(); ++i) {
     if (!i->first->IsPhi()) {
       DCHECK(i->second->IsPhi());
-      // TODO: Remove "OrNull".
-      GenerateVecReductionPhiInputs(i->second->AsPhiOrNull(), i->first);
+      GenerateVecReductionPhiInputs(i->second->AsPhi(), i->first);
     }
   }
   // Finalize phi inputs for the loop index.
@@ -1413,8 +1407,7 @@
     return false;
   }
   if (instruction->IsArraySet()) {
-    // TODO: Remove "OrNull".
-    DataType::Type type = instruction->AsArraySetOrNull()->GetComponentType();
+    DataType::Type type = instruction->AsArraySet()->GetComponentType();
     HInstruction* base = instruction->InputAt(0);
     HInstruction* index = instruction->InputAt(1);
     HInstruction* value = instruction->InputAt(2);
@@ -1490,8 +1483,7 @@
     return true;
   } else if (instruction->IsArrayGet()) {
     // Deal with vector restrictions.
-    // TODO: Remove "OrNull".
-    bool is_string_char_at = instruction->AsArrayGetOrNull()->IsStringCharAt();
+    bool is_string_char_at = instruction->AsArrayGet()->IsStringCharAt();
 
     if (is_string_char_at && (HasVectorRestrictions(restrictions, kNoStringCharAt) ||
                               IsInPredicatedVectorizationMode())) {
@@ -1526,8 +1518,7 @@
       }
       // Accept a reduction.
       if (generate_code) {
-        // TODO: Remove "OrNull".
-        GenerateVecReductionPhi(instruction->AsPhiOrNull());
+        GenerateVecReductionPhi(instruction->AsPhi());
       }
       return true;
     }
@@ -1535,8 +1526,7 @@
     return false;
   } else if (instruction->IsTypeConversion()) {
     // Accept particular type conversions.
-    // TODO: Remove "OrNull".
-    HTypeConversion* conversion = instruction->AsTypeConversionOrNull();
+    HTypeConversion* conversion = instruction->AsTypeConversion();
     HInstruction* opa = conversion->InputAt(0);
     DataType::Type from = conversion->GetInputType();
     DataType::Type to = conversion->GetResultType();
@@ -1872,8 +1862,7 @@
                                                                           vector_length_,
                                                                           0u);
         vector_preheader_->InsertInstructionBefore(set_pred, vector);
-        // TODO: Remove "OrNull".
-        vector->AsVecOperationOrNull()->SetMergingGoverningPredicate(set_pred);
+        vector->AsVecOperation()->SetMergingGoverningPredicate(set_pred);
       }
     }
     vector_map_->Put(org, vector);
@@ -1909,8 +1898,7 @@
       vector = new (global_allocator_) HVecStore(
           global_allocator_, base, opa, opb, type, org->GetSideEffects(), vector_length_, dex_pc);
     } else  {
-      // TODO: Remove "OrNull".
-      is_string_char_at = org->AsArrayGetOrNull()->IsStringCharAt();
+      is_string_char_at = org->AsArrayGet()->IsStringCharAt();
       vector = new (global_allocator_) HVecLoad(global_allocator_,
                                                 base,
                                                 opa,
@@ -1925,26 +1913,22 @@
       if (vector_dynamic_peeling_candidate_->offset == offset &&  // TODO: diffs too?
           DataType::Size(vector_dynamic_peeling_candidate_->type) == DataType::Size(type) &&
           vector_dynamic_peeling_candidate_->is_string_char_at == is_string_char_at) {
-        // TODO: Remove "OrNull".
-        vector->AsVecMemoryOperationOrNull()->SetAlignment(  // forced
+        vector->AsVecMemoryOperation()->SetAlignment(  // forced
             Alignment(GetVectorSizeInBytes(), 0));
       }
     } else {
-      // TODO: Remove "OrNull".
-      vector->AsVecMemoryOperationOrNull()->SetAlignment(  // adjusted/original
+      vector->AsVecMemoryOperation()->SetAlignment(  // adjusted/original
           ComputeAlignment(offset, type, is_string_char_at, vector_static_peeling_factor_));
     }
   } else {
     // Scalar store or load.
     DCHECK(vector_mode_ == kSequential);
     if (opb != nullptr) {
-      // TODO: Remove "OrNull".
-      DataType::Type component_type = org->AsArraySetOrNull()->GetComponentType();
+      DataType::Type component_type = org->AsArraySet()->GetComponentType();
       vector = new (global_allocator_) HArraySet(
           org->InputAt(0), opa, opb, component_type, org->GetSideEffects(), dex_pc);
     } else  {
-      // TODO: Remove "OrNull".
-      bool is_string_char_at = org->AsArrayGetOrNull()->IsStringCharAt();
+      bool is_string_char_at = org->AsArrayGet()->IsStringCharAt();
       vector = new (global_allocator_) HArrayGet(
           org->InputAt(0), opa, org->GetType(), org->GetSideEffects(), dex_pc, is_string_char_at);
     }
@@ -1988,8 +1972,7 @@
   if (vector_mode_ == kVector) {
     // Generate a [initial, 0, .., 0] vector for add or
     // a [initial, initial, .., initial] vector for min/max.
-    // TODO: Remove "OrNull".
-    HVecOperation* red_vector = new_red->AsVecOperationOrNull();
+    HVecOperation* red_vector = new_red->AsVecOperation();
     HVecReduce::ReductionKind kind = GetReductionKind(red_vector);
     uint32_t vector_length = red_vector->GetVectorLength();
     DataType::Type type = red_vector->GetPackedType();
@@ -2016,18 +1999,15 @@
                                                                         vector_length,
                                                                         0u);
       vector_preheader_->InsertInstructionBefore(set_pred, new_init);
-      // TODO: Remove "OrNull".
-      new_init->AsVecOperationOrNull()->SetMergingGoverningPredicate(set_pred);
+      new_init->AsVecOperation()->SetMergingGoverningPredicate(set_pred);
     }
   } else {
     new_init = ReduceAndExtractIfNeeded(new_init);
   }
   // Set the phi inputs.
   DCHECK(new_phi->IsPhi());
-  // TODO: Remove "OrNull".
-  new_phi->AsPhiOrNull()->AddInput(new_init);
-  // TODO: Remove "OrNull".
-  new_phi->AsPhiOrNull()->AddInput(new_red);
+  new_phi->AsPhi()->AddInput(new_init);
+  new_phi->AsPhi()->AddInput(new_red);
   // New feed value for next phi (safe mutation in iteration).
   reductions_->find(phi)->second = new_phi;
 }
@@ -2037,8 +2017,7 @@
     HInstruction* input = instruction->InputAt(1);
     if (HVecOperation::ReturnsSIMDValue(input)) {
       DCHECK(!input->IsPhi());
-      // TODO: Remove "OrNull".
-      HVecOperation* input_vector = input->AsVecOperationOrNull();
+      HVecOperation* input_vector = input->AsVecOperation();
       uint32_t vector_length = input_vector->GetVectorLength();
       DataType::Type type = input_vector->GetPackedType();
       HVecReduce::ReductionKind kind = GetReductionKind(input_vector);
@@ -2062,8 +2041,7 @@
                                                                           0u);
         exit->InsertInstructionBefore(set_pred, reduce);
         reduce->SetMergingGoverningPredicate(set_pred);
-        // TODO: Remove "OrNull".
-        instruction->AsVecOperationOrNull()->SetMergingGoverningPredicate(set_pred);
+        instruction->AsVecOperation()->SetMergingGoverningPredicate(set_pred);
       }
     }
   }
@@ -2543,13 +2521,11 @@
   // (2) the main induction, used in loop control.
   HPhi* phi = nullptr;
   for (HInstructionIterator it(block->GetPhis()); !it.Done(); it.Advance()) {
-    // TODO: Remove "OrNull".
-    if (TrySetPhiReduction(it.Current()->AsPhiOrNull())) {
+    if (TrySetPhiReduction(it.Current()->AsPhi())) {
       continue;
     } else if (phi == nullptr) {
       // Found the first candidate for main induction.
-      // TODO: Remove "OrNull".
-      phi = it.Current()->AsPhiOrNull();
+      phi = it.Current()->AsPhi();
     } else {
       return false;
     }
diff --git a/compiler/optimizing/loop_optimization_test.cc b/compiler/optimizing/loop_optimization_test.cc
index 3697651..7f694fb 100644
--- a/compiler/optimizing/loop_optimization_test.cc
+++ b/compiler/optimizing/loop_optimization_test.cc
@@ -324,8 +324,7 @@
   EXPECT_EQ(preheader1->GetSingleSuccessor(), new_preheader);
 
   EXPECT_EQ(new_preheader->GetPhis().CountSize(), 1u);
-  // TODO: Remove "OrNull".
-  HPhi* new_preheader_phi = new_preheader->GetFirstPhi()->AsPhiOrNull();
+  HPhi* new_preheader_phi = new_preheader->GetFirstPhi()->AsPhi();
   EXPECT_EQ(new_preheader_phi->InputCount(), 2u);
   EXPECT_EQ(new_preheader_phi->InputAt(0), preheader0_add);
   EXPECT_EQ(new_preheader_phi->InputAt(1), preheader1_add);
diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc
index b0c7b8a..83b5876 100644
--- a/compiler/optimizing/nodes.cc
+++ b/compiler/optimizing/nodes.cc
@@ -183,8 +183,7 @@
     DCHECK(use.GetUser()->IsPhi());
     DCHECK(user_block->IsCatchBlock());
     for (HInstructionIterator phi_it(user_block->GetPhis()); !phi_it.Done(); phi_it.Advance()) {
-      // TODO: Remove "OrNull".
-      phi_it.Current()->AsPhiOrNull()->RemoveInputAt(use_index);
+      phi_it.Current()->AsPhi()->RemoveInputAt(use_index);
     }
   }
 }
@@ -583,8 +582,7 @@
 // Reorder phi inputs to match reordering of the block's predecessors.
 static void FixPhisAfterPredecessorsReodering(HBasicBlock* block, size_t first, size_t second) {
   for (HInstructionIterator it(block->GetPhis()); !it.Done(); it.Advance()) {
-    // TODO: Remove "OrNull".
-    HPhi* phi = it.Current()->AsPhiOrNull();
+    HPhi* phi = it.Current()->AsPhi();
     HInstruction* first_instr = phi->InputAt(first);
     HInstruction* second_instr = phi->InputAt(second);
     phi->ReplaceInput(first_instr, second);
@@ -683,8 +681,7 @@
 
   // Fix the data-flow.
   for (HInstructionIterator it(header->GetPhis()); !it.Done(); it.Advance()) {
-    // TODO: Remove "OrNull".
-    HPhi* header_phi = it.Current()->AsPhiOrNull();
+    HPhi* header_phi = it.Current()->AsPhi();
 
     HPhi* preheader_phi = new (GetAllocator()) HPhi(GetAllocator(),
                                                     header_phi->GetRegNumber(),
@@ -739,8 +736,7 @@
   HInstruction* first_instruction = header->GetFirstInstruction();
   if (first_instruction != nullptr && first_instruction->IsSuspendCheck()) {
     // Called from DeadBlockElimination. Update SuspendCheck pointer.
-    // TODO: Remove "OrNull".
-    info->SetSuspendCheck(first_instruction->AsSuspendCheckOrNull());
+    info->SetSuspendCheck(first_instruction->AsSuspendCheck());
   }
 }
 
@@ -1287,8 +1283,7 @@
 
 void HBasicBlock::RemoveInstructionOrPhi(HInstruction* instruction, bool ensure_safety) {
   if (instruction->IsPhi()) {
-    // TODO: Remove "OrNull".
-    RemovePhi(instruction->AsPhiOrNull(), ensure_safety);
+    RemovePhi(instruction->AsPhi(), ensure_safety);
   } else {
     RemoveInstruction(instruction, ensure_safety);
   }
@@ -1326,8 +1321,7 @@
     if (instruction->IsLoopHeaderPhi() && (instruction->GetBlock() == loop_header)) {
       // At the end of the loop pre-header, the corresponding value for instruction
       // is the first input of the phi.
-      // TODO: Remove "OrNull".
-      HInstruction* initial = instruction->AsPhiOrNull()->InputAt(0);
+      HInstruction* initial = instruction->AsPhi()->InputAt(0);
       SetRawEnvAt(i, initial);
       initial->AddEnvUseAt(this, i);
     } else {
@@ -1582,8 +1576,7 @@
 
     if (dominated) {
       user->ReplaceInput(replacement, index);
-      // TODO: Remove "OrNull".
-    } else if (user->IsPhi() && !user->AsPhiOrNull()->IsCatchPhi()) {
+    } else if (user->IsPhi() && !user->AsPhi()->IsCatchPhi()) {
       // If the input flows from a block dominated by `dominator`, we can replace it.
       // We do not perform this for catch phis as we don't have control flow support
       // for their inputs.
@@ -1689,8 +1682,7 @@
     ++it;
 
     if (use_instruction->IsConstructorFence()) {
-      // TODO: Remove "OrNull".
-      HConstructorFence* ctor_fence = use_instruction->AsConstructorFenceOrNull();
+      HConstructorFence* ctor_fence = use_instruction->AsConstructorFence();
       size_t input_index = use_node.GetIndex();
 
       // Process the candidate instruction for removal
@@ -1826,8 +1818,7 @@
 HConstant* HTypeConversion::TryStaticEvaluation() const {
   HGraph* graph = GetBlock()->GetGraph();
   if (GetInput()->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    int32_t value = GetInput()->AsIntConstantOrNull()->GetValue();
+    int32_t value = GetInput()->AsIntConstant()->GetValue();
     switch (GetResultType()) {
       case DataType::Type::kInt8:
         return graph->GetIntConstant(static_cast<int8_t>(value), GetDexPc());
@@ -1847,8 +1838,7 @@
         return nullptr;
     }
   } else if (GetInput()->IsLongConstant()) {
-    // TODO: Remove "OrNull".
-    int64_t value = GetInput()->AsLongConstantOrNull()->GetValue();
+    int64_t value = GetInput()->AsLongConstant()->GetValue();
     switch (GetResultType()) {
       case DataType::Type::kInt8:
         return graph->GetIntConstant(static_cast<int8_t>(value), GetDexPc());
@@ -1868,8 +1858,7 @@
         return nullptr;
     }
   } else if (GetInput()->IsFloatConstant()) {
-    // TODO: Remove "OrNull".
-    float value = GetInput()->AsFloatConstantOrNull()->GetValue();
+    float value = GetInput()->AsFloatConstant()->GetValue();
     switch (GetResultType()) {
       case DataType::Type::kInt32:
         if (std::isnan(value))
@@ -1893,8 +1882,7 @@
         return nullptr;
     }
   } else if (GetInput()->IsDoubleConstant()) {
-    // TODO: Remove "OrNull".
-    double value = GetInput()->AsDoubleConstantOrNull()->GetValue();
+    double value = GetInput()->AsDoubleConstant()->GetValue();
     switch (GetResultType()) {
       case DataType::Type::kInt32:
         if (std::isnan(value))
@@ -1923,18 +1911,14 @@
 
 HConstant* HUnaryOperation::TryStaticEvaluation() const {
   if (GetInput()->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    return Evaluate(GetInput()->AsIntConstantOrNull());
+    return Evaluate(GetInput()->AsIntConstant());
   } else if (GetInput()->IsLongConstant()) {
-    // TODO: Remove "OrNull".
-    return Evaluate(GetInput()->AsLongConstantOrNull());
+    return Evaluate(GetInput()->AsLongConstant());
   } else if (kEnableFloatingPointStaticEvaluation) {
     if (GetInput()->IsFloatConstant()) {
-      // TODO: Remove "OrNull".
-      return Evaluate(GetInput()->AsFloatConstantOrNull());
+      return Evaluate(GetInput()->AsFloatConstant());
     } else if (GetInput()->IsDoubleConstant()) {
-      // TODO: Remove "OrNull".
-      return Evaluate(GetInput()->AsDoubleConstantOrNull());
+      return Evaluate(GetInput()->AsDoubleConstant());
     }
   }
   return nullptr;
@@ -1942,30 +1926,24 @@
 
 HConstant* HBinaryOperation::TryStaticEvaluation() const {
   if (GetLeft()->IsIntConstant() && GetRight()->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    return Evaluate(GetLeft()->AsIntConstantOrNull(), GetRight()->AsIntConstantOrNull());
+    return Evaluate(GetLeft()->AsIntConstant(), GetRight()->AsIntConstant());
   } else if (GetLeft()->IsLongConstant()) {
     if (GetRight()->IsIntConstant()) {
       // The binop(long, int) case is only valid for shifts and rotations.
       DCHECK(IsShl() || IsShr() || IsUShr() || IsRor()) << DebugName();
-      // TODO: Remove "OrNull".
-      return Evaluate(GetLeft()->AsLongConstantOrNull(), GetRight()->AsIntConstantOrNull());
+      return Evaluate(GetLeft()->AsLongConstant(), GetRight()->AsIntConstant());
     } else if (GetRight()->IsLongConstant()) {
-      // TODO: Remove "OrNull".
-      return Evaluate(GetLeft()->AsLongConstantOrNull(), GetRight()->AsLongConstantOrNull());
+      return Evaluate(GetLeft()->AsLongConstant(), GetRight()->AsLongConstant());
     }
   } else if (GetLeft()->IsNullConstant() && GetRight()->IsNullConstant()) {
     // The binop(null, null) case is only valid for equal and not-equal conditions.
     DCHECK(IsEqual() || IsNotEqual()) << DebugName();
-    // TODO: Remove "OrNull".
-    return Evaluate(GetLeft()->AsNullConstantOrNull(), GetRight()->AsNullConstantOrNull());
+    return Evaluate(GetLeft()->AsNullConstant(), GetRight()->AsNullConstant());
   } else if (kEnableFloatingPointStaticEvaluation) {
     if (GetLeft()->IsFloatConstant() && GetRight()->IsFloatConstant()) {
-      // TODO: Remove "OrNull".
-      return Evaluate(GetLeft()->AsFloatConstantOrNull(), GetRight()->AsFloatConstantOrNull());
+      return Evaluate(GetLeft()->AsFloatConstant(), GetRight()->AsFloatConstant());
     } else if (GetLeft()->IsDoubleConstant() && GetRight()->IsDoubleConstant()) {
-      // TODO: Remove "OrNull".
-      return Evaluate(GetLeft()->AsDoubleConstantOrNull(), GetRight()->AsDoubleConstantOrNull());
+      return Evaluate(GetLeft()->AsDoubleConstant(), GetRight()->AsDoubleConstant());
     }
   }
   return nullptr;
@@ -1973,11 +1951,9 @@
 
 HConstant* HBinaryOperation::GetConstantRight() const {
   if (GetRight()->IsConstant()) {
-    // TODO: Remove "OrNull".
-    return GetRight()->AsConstantOrNull();
+    return GetRight()->AsConstant();
   } else if (IsCommutative() && GetLeft()->IsConstant()) {
-    // TODO: Remove "OrNull".
-    return GetLeft()->AsConstantOrNull();
+    return GetLeft()->AsConstant();
   } else {
     return nullptr;
   }
@@ -2172,8 +2148,7 @@
     DCHECK(insert_pos->IsControlFlow());
     // Avoid splitting HCondition from HIf to prevent unnecessary materialization.
     if (insert_pos->IsIf()) {
-      // TODO: Remove "OrNull".
-      HInstruction* if_input = insert_pos->AsIfOrNull()->InputAt(0);
+      HInstruction* if_input = insert_pos->AsIf()->InputAt(0);
       if (if_input == insert_pos->GetPrevious()) {
         insert_pos = if_input;
       }
@@ -2290,8 +2265,7 @@
 
 const HTryBoundary* HBasicBlock::ComputeTryEntryOfSuccessors() const {
   if (EndsWithTryBoundary()) {
-    // TODO: Remove "OrNull".
-    HTryBoundary* try_boundary = GetLastInstruction()->AsTryBoundaryOrNull();
+    HTryBoundary* try_boundary = GetLastInstruction()->AsTryBoundary();
     if (try_boundary->IsEntry()) {
       DCHECK(!IsTryBlock());
       return try_boundary;
@@ -2363,9 +2337,7 @@
 ArrayRef<HBasicBlock* const> HBasicBlock::GetNormalSuccessors() const {
   if (EndsWithTryBoundary()) {
     // The normal-flow successor of HTryBoundary is always stored at index zero.
-    // TODO: Remove "OrNull".
-    DCHECK_EQ(successors_[0],
-              GetLastInstruction()->AsTryBoundaryOrNull()->GetNormalFlowSuccessor());
+    DCHECK_EQ(successors_[0], GetLastInstruction()->AsTryBoundary()->GetNormalFlowSuccessor());
     return ArrayRef<HBasicBlock* const>(successors_).SubArray(0u, 1u);
   } else {
     // All successors of blocks not ending with TryBoundary are normal.
@@ -2375,8 +2347,7 @@
 
 ArrayRef<HBasicBlock* const> HBasicBlock::GetExceptionalSuccessors() const {
   if (EndsWithTryBoundary()) {
-    // TODO: Remove "OrNull".
-    return GetLastInstruction()->AsTryBoundaryOrNull()->GetExceptionHandlers();
+    return GetLastInstruction()->AsTryBoundary()->GetExceptionHandlers();
   } else {
     // Blocks not ending with TryBoundary do not have exceptional successors.
     return ArrayRef<HBasicBlock* const>();
@@ -2501,8 +2472,7 @@
       // exception handlers of this TryBoundary were already visited and any
       // remaining handlers therefore must be live. We remove `predecessor` from
       // their list of predecessors.
-      // TODO: Remove "OrNull".
-      DCHECK_EQ(last_instruction->AsTryBoundaryOrNull()->GetNormalFlowSuccessor(), this);
+      DCHECK_EQ(last_instruction->AsTryBoundary()->GetNormalFlowSuccessor(), this);
       while (predecessor->GetSuccessors().size() > 1) {
         HBasicBlock* handler = predecessor->GetSuccessors()[1];
         DCHECK(handler->IsCatchBlock());
@@ -2582,15 +2552,13 @@
         // The successor has just one predecessor left. Replace phis with the only
         // remaining input.
         for (HInstructionIterator phi_it(successor->GetPhis()); !phi_it.Done(); phi_it.Advance()) {
-          // TODO: Remove "OrNull".
-          HPhi* phi = phi_it.Current()->AsPhiOrNull();
+          HPhi* phi = phi_it.Current()->AsPhi();
           phi->ReplaceWith(phi->InputAt(1 - this_index));
           successor->RemovePhi(phi);
         }
       } else {
         for (HInstructionIterator phi_it(successor->GetPhis()); !phi_it.Done(); phi_it.Advance()) {
-          // TODO: Remove "OrNull".
-          phi_it.Current()->AsPhiOrNull()->RemoveInputAt(this_index);
+          phi_it.Current()->AsPhi()->RemoveInputAt(this_index);
         }
       }
     }
@@ -2613,8 +2581,7 @@
     RemoveInstruction(insn, /* ensure_safety= */ !building_dominator_tree);
   }
   for (HInstructionIterator it(GetPhis()); !it.Done(); it.Advance()) {
-    // TODO: Remove "OrNull".
-    HPhi* insn = it.Current()->AsPhiOrNull();
+    HPhi* insn = it.Current()->AsPhi();
     RemoveCatchPhiUsesOfDeadInstruction(insn);
 
     // If we are building the dominator tree, we removed all input records previously.
@@ -2941,8 +2908,7 @@
       const bool saw_try_boundary = last->IsTryBoundary();
       if (saw_try_boundary) {
         DCHECK(predecessor->IsSingleTryBoundary());
-        // TODO: Remove "OrNull".
-        DCHECK(!last->AsTryBoundaryOrNull()->IsEntry());
+        DCHECK(!last->AsTryBoundary()->IsEntry());
         predecessor = predecessor->GetSinglePredecessor();
         last = predecessor->GetLastInstruction();
       }
@@ -2964,9 +2930,8 @@
                try_catch_info->GetTryEntry().GetBlock()->GetExceptionalSuccessors()) {
             new_block->AddSuccessor(xhandler);
           }
-          // TODO: Remove "OrNull".
           DCHECK(try_catch_info->GetTryEntry().HasSameExceptionHandlersAs(
-              *new_block->GetLastInstruction()->AsTryBoundaryOrNull()));
+              *new_block->GetLastInstruction()->AsTryBoundary()));
         } else {
           // We either have `Throw->TryBoundary` or `Throw`. We want to point the whole chain to the
           // exit, so we recompute `predecessor`
@@ -3049,26 +3014,21 @@
     if (current->IsNullConstant()) {
       replacement = outer_graph->GetNullConstant(current->GetDexPc());
     } else if (current->IsIntConstant()) {
-      // TODO: Remove "OrNull".
       replacement = outer_graph->GetIntConstant(
-          current->AsIntConstantOrNull()->GetValue(), current->GetDexPc());
+          current->AsIntConstant()->GetValue(), current->GetDexPc());
     } else if (current->IsLongConstant()) {
-      // TODO: Remove "OrNull".
       replacement = outer_graph->GetLongConstant(
-          current->AsLongConstantOrNull()->GetValue(), current->GetDexPc());
+          current->AsLongConstant()->GetValue(), current->GetDexPc());
     } else if (current->IsFloatConstant()) {
-      // TODO: Remove "OrNull".
       replacement = outer_graph->GetFloatConstant(
-          current->AsFloatConstantOrNull()->GetValue(), current->GetDexPc());
+          current->AsFloatConstant()->GetValue(), current->GetDexPc());
     } else if (current->IsDoubleConstant()) {
-      // TODO: Remove "OrNull".
       replacement = outer_graph->GetDoubleConstant(
-          current->AsDoubleConstantOrNull()->GetValue(), current->GetDexPc());
+          current->AsDoubleConstant()->GetValue(), current->GetDexPc());
     } else if (current->IsParameterValue()) {
       if (kIsDebugBuild &&
           invoke->IsInvokeStaticOrDirect() &&
-          // TODO: Remove "OrNull".
-          invoke->AsInvokeStaticOrDirectOrNull()->IsStaticWithExplicitClinitCheck()) {
+          invoke->AsInvokeStaticOrDirect()->IsStaticWithExplicitClinitCheck()) {
         // Ensure we do not use the last input of `invoke`, as it
         // contains a clinit check which is not an actual argument.
         size_t last_input_index = invoke->InputCount() - 1;
@@ -3248,8 +3208,7 @@
     if (IsBoundType()) {
       // Having the test here spares us from making the method virtual just for
       // the sake of a DCHECK.
-      // TODO: Remove "OrNull".
-      CheckAgainstUpperBound(rti, AsBoundTypeOrNull()->GetUpperBound());
+      CheckAgainstUpperBound(rti, AsBoundType()->GetUpperBound());
     }
   }
   reference_type_handle_ = rti.GetTypeHandle();
@@ -3263,8 +3222,7 @@
 }
 
 bool HBoundType::InstructionDataEquals(const HInstruction* other) const {
-  // TODO: Remove "OrNull".
-  const HBoundType* other_bt = other->AsBoundTypeOrNull();
+  const HBoundType* other_bt = other->AsBoundType();
   ScopedObjectAccess soa(Thread::Current());
   return GetUpperBound().IsEqual(other_bt->GetUpperBound()) &&
          GetUpperCanBeNull() == other_bt->GetUpperCanBeNull() &&
@@ -3404,8 +3362,7 @@
 }
 
 bool HLoadClass::InstructionDataEquals(const HInstruction* other) const {
-  // TODO: Remove "OrNull".
-  const HLoadClass* other_load_class = other->AsLoadClassOrNull();
+  const HLoadClass* other_load_class = other->AsLoadClass();
   // TODO: To allow GVN for HLoadClass from different dex files, we should compare the type
   // names rather than type indexes. However, we shall also have to re-think the hash code.
   if (type_index_ != other_load_class->type_index_ ||
@@ -3426,8 +3383,7 @@
 }
 
 bool HLoadString::InstructionDataEquals(const HInstruction* other) const {
-  // TODO: Remove "OrNull".
-  const HLoadString* other_load_string = other->AsLoadStringOrNull();
+  const HLoadString* other_load_string = other->AsLoadString();
   // TODO: To allow GVN for HLoadString from different dex files, we should compare the strings
   // rather than their indexes. However, we shall also have to re-think the hash code.
   if (string_index_ != other_load_string->string_index_ ||
@@ -3459,11 +3415,9 @@
   HBasicBlock* block = instr->GetBlock();
 
   if (instr->IsPhi()) {
-    // TODO: Remove "OrNull".
-    HPhi* phi = instr->AsPhiOrNull();
+    HPhi* phi = instr->AsPhi();
     DCHECK(!phi->HasEnvironment());
-    // TODO: Remove "OrNull".
-    HPhi* phi_clone = clone->AsPhiOrNull();
+    HPhi* phi_clone = clone->AsPhi();
     block->ReplaceAndRemovePhiWith(phi, phi_clone);
   } else {
     block->ReplaceAndRemoveInstructionWith(instr, clone);
@@ -3471,8 +3425,7 @@
       clone->CopyEnvironmentFrom(instr->GetEnvironment());
       HLoopInformation* loop_info = block->GetLoopInformation();
       if (instr->IsSuspendCheck() && loop_info != nullptr) {
-        // TODO: Remove "OrNull".
-        loop_info->SetSuspendCheck(clone->AsSuspendCheckOrNull());
+        loop_info->SetSuspendCheck(clone->AsSuspendCheck());
       }
     }
   }
@@ -3489,8 +3442,7 @@
     HInstruction* lhs = cond->InputAt(0);
     HInstruction* rhs = cond->InputAt(1);
     HInstruction* replacement = nullptr;
-    // TODO: Remove "OrNull".
-    switch (cond->AsConditionOrNull()->GetOppositeCondition()) {  // get *opposite*
+    switch (cond->AsCondition()->GetOppositeCondition()) {  // get *opposite*
       case kCondEQ: replacement = new (allocator) HEqual(lhs, rhs); break;
       case kCondNE: replacement = new (allocator) HNotEqual(lhs, rhs); break;
       case kCondLT: replacement = new (allocator) HLessThan(lhs, rhs); break;
@@ -3508,8 +3460,7 @@
     cursor->GetBlock()->InsertInstructionBefore(replacement, cursor);
     return replacement;
   } else if (cond->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    HIntConstant* int_const = cond->AsIntConstantOrNull();
+    HIntConstant* int_const = cond->AsIntConstant();
     if (int_const->IsFalse()) {
       return GetIntConstant(1);
     } else {
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h
index 53396db..4a0be10 100644
--- a/compiler/optimizing/nodes.h
+++ b/compiler/optimizing/nodes.h
@@ -2366,8 +2366,7 @@
     HInstruction* prev_not_move = GetPreviousDisregardingMoves();
     while (prev_not_move != nullptr && prev_not_move->IsEmittedAtUseSite()) {
       if (prev_not_move->IsNullCheck()) {
-        // TODO: Remove "OrNull".
-        return prev_not_move->AsNullCheckOrNull();
+        return prev_not_move->AsNullCheck();
       }
       prev_not_move = prev_not_move->GetPreviousDisregardingMoves();
     }
@@ -2553,6 +2552,8 @@
 #undef INSTRUCTION_TYPE_CHECK
 
 #define INSTRUCTION_TYPE_CAST(type, super)                                     \
+  const H##type* As##type() const;                                             \
+  H##type* As##type();                                                         \
   const H##type* As##type##OrNull() const;                                     \
   H##type* As##type##OrNull();
 
@@ -3166,18 +3167,14 @@
     return other != nullptr
         && other->IsPhi()
         && other->GetBlock() == GetBlock()
-        // TODO: Remove "OrNull".
-        && other->AsPhiOrNull()->GetRegNumber() == GetRegNumber();
+        && other->AsPhi()->GetRegNumber() == GetRegNumber();
   }
 
   bool HasEquivalentPhi() const {
-    // TODO: Remove "OrNull".
-    if (GetPrevious() != nullptr &&
-        GetPrevious()->AsPhiOrNull()->GetRegNumber() == GetRegNumber()) {
+    if (GetPrevious() != nullptr && GetPrevious()->AsPhi()->GetRegNumber() == GetRegNumber()) {
       return true;
     }
-    // TODO: Remove "OrNull".
-    if (GetNext() != nullptr && GetNext()->AsPhiOrNull()->GetRegNumber() == GetRegNumber()) {
+    if (GetNext() != nullptr && GetNext()->AsPhi()->GetRegNumber() == GetRegNumber()) {
       return true;
     }
     return false;
@@ -3188,11 +3185,9 @@
   // It assumes that phis with the same dex register are adjacent.
   HPhi* GetNextEquivalentPhiWithSameType() {
     HInstruction* next = GetNext();
-    // TODO: Remove "OrNull".
-    while (next != nullptr && next->AsPhiOrNull()->GetRegNumber() == reg_number_) {
+    while (next != nullptr && next->AsPhi()->GetRegNumber() == reg_number_) {
       if (next->GetType() == GetType()) {
-        // TODO: Remove "OrNull".
-        return next->AsPhiOrNull();
+        return next->AsPhi();
       }
       next = next->GetNext();
     }
@@ -3313,8 +3308,7 @@
 
   bool InstructionDataEquals(const HInstruction* other) const override {
     DCHECK(other->IsIntConstant()) << other->DebugName();
-    // TODO: Remove "OrNull".
-    return other->AsIntConstantOrNull()->value_ == value_;
+    return other->AsIntConstant()->value_ == value_;
   }
 
   size_t ComputeHashCode() const override { return GetValue(); }
@@ -3358,8 +3352,7 @@
 
   bool InstructionDataEquals(const HInstruction* other) const override {
     DCHECK(other->IsLongConstant()) << other->DebugName();
-    // TODO: Remove "OrNull".
-    return other->AsLongConstantOrNull()->value_ == value_;
+    return other->AsLongConstant()->value_ == value_;
   }
 
   size_t ComputeHashCode() const override { return static_cast<size_t>(GetValue()); }
@@ -3395,8 +3388,7 @@
 
   bool InstructionDataEquals(const HInstruction* other) const override {
     DCHECK(other->IsFloatConstant()) << other->DebugName();
-    // TODO: Remove "OrNull".
-    return other->AsFloatConstantOrNull()->GetValueAsUint64() == GetValueAsUint64();
+    return other->AsFloatConstant()->GetValueAsUint64() == GetValueAsUint64();
   }
 
   size_t ComputeHashCode() const override { return static_cast<size_t>(GetValue()); }
@@ -3453,8 +3445,7 @@
 
   bool InstructionDataEquals(const HInstruction* other) const override {
     DCHECK(other->IsDoubleConstant()) << other->DebugName();
-    // TODO: Remove "OrNull".
-    return other->AsDoubleConstantOrNull()->GetValueAsUint64() == GetValueAsUint64();
+    return other->AsDoubleConstant()->GetValueAsUint64() == GetValueAsUint64();
   }
 
   size_t ComputeHashCode() const override { return static_cast<size_t>(GetValue()); }
@@ -3651,8 +3642,7 @@
 
   bool InstructionDataEquals(const HInstruction* other) const override {
     return (other->CanBeMoved() == CanBeMoved()) &&
-           // TODO: Remove "OrNull".
-           (other->AsDeoptimizeOrNull()->GetDeoptimizationKind() == GetDeoptimizationKind());
+           (other->AsDeoptimize()->GetDeoptimizationKind() == GetDeoptimizationKind());
   }
 
   bool NeedsEnvironment() const override { return true; }
@@ -3761,9 +3751,8 @@
   bool IsClonable() const override { return true; }
   bool CanBeMoved() const override { return true; }
   bool InstructionDataEquals(const HInstruction* other) const override {
-    // TODO: Remove "OrNull".
-    return other->AsClassTableGetOrNull()->GetIndex() == index_ &&
-        other->AsClassTableGetOrNull()->GetPackedFields() == GetPackedFields();
+    return other->AsClassTableGet()->GetIndex() == index_ &&
+        other->AsClassTableGet()->GetPackedFields() == GetPackedFields();
   }
 
   TableKind GetTableKind() const { return GetPackedField<TableKindField>(); }
@@ -3999,8 +3988,7 @@
   void SetBias(ComparisonBias bias) { SetPackedField<ComparisonBiasField>(bias); }
 
   bool InstructionDataEquals(const HInstruction* other) const override {
-    // TODO: Remove "OrNull".
-    return GetPackedFields() == other->AsConditionOrNull()->GetPackedFields();
+    return GetPackedFields() == other->AsCondition()->GetPackedFields();
   }
 
   bool IsFPConditionTrueIfNaN() const {
@@ -4525,8 +4513,7 @@
   }
 
   bool InstructionDataEquals(const HInstruction* other) const override {
-    // TODO: Remove "OrNull".
-    return GetPackedFields() == other->AsCompareOrNull()->GetPackedFields();
+    return GetPackedFields() == other->AsCompare()->GetPackedFields();
   }
 
   ComparisonBias GetBias() const { return GetPackedField<ComparisonBiasField>(); }
@@ -4626,8 +4613,7 @@
       input = input->InputAt(0);
     }
     DCHECK(input->IsLoadClass());
-    // TODO: Remove "OrNull".
-    return input->AsLoadClassOrNull();
+    return input->AsLoadClass();
   }
 
   bool IsStringAlloc() const;
@@ -4759,8 +4745,7 @@
   bool CanBeMoved() const override { return IsIntrinsic() && !DoesAnyWrite(); }
 
   bool InstructionDataEquals(const HInstruction* other) const override {
-    // TODO: Remove "OrNull".
-    return intrinsic_ != Intrinsics::kNone && intrinsic_ == other->AsInvokeOrNull()->intrinsic_;
+    return intrinsic_ != Intrinsics::kNone && intrinsic_ == other->AsInvoke()->intrinsic_;
   }
 
   uint32_t* GetIntrinsicOptimizations() {
@@ -5365,8 +5350,7 @@
 
   HLoadClass* GetLoadClass() const {
     DCHECK(InputAt(0)->IsLoadClass());
-    // TODO: Remove "OrNull".
-    return InputAt(0)->AsLoadClassOrNull();
+    return InputAt(0)->AsLoadClass();
   }
 
   HInstruction* GetLength() const {
@@ -6306,8 +6290,7 @@
   bool CanBeMoved() const override { return !IsVolatile(); }
 
   bool InstructionDataEquals(const HInstruction* other) const override {
-    // TODO: Remove "OrNull".
-    const HInstanceFieldGet* other_get = other->AsInstanceFieldGetOrNull();
+    const HInstanceFieldGet* other_get = other->AsInstanceFieldGet();
     return GetFieldOffset().SizeValue() == other_get->GetFieldOffset().SizeValue();
   }
 
@@ -6396,8 +6379,7 @@
   }
 
   bool InstructionDataEquals(const HInstruction* other) const override {
-    // TODO: Remove "OrNull".
-    const HPredicatedInstanceFieldGet* other_get = other->AsPredicatedInstanceFieldGetOrNull();
+    const HPredicatedInstanceFieldGet* other_get = other->AsPredicatedInstanceFieldGet();
     return GetFieldOffset().SizeValue() == other_get->GetFieldOffset().SizeValue() &&
            GetDefaultValue() == other_get->GetDefaultValue();
   }
@@ -7457,8 +7439,7 @@
 
   HLoadClass* GetLoadClass() const {
     DCHECK(InputAt(0)->IsLoadClass());
-    // TODO: Remove "OrNull".
-    return InputAt(0)->AsLoadClassOrNull();
+    return InputAt(0)->AsLoadClass();
   }
 
   DECLARE_INSTRUCTION(ClinitCheck);
@@ -7498,8 +7479,7 @@
   bool CanBeMoved() const override { return !IsVolatile(); }
 
   bool InstructionDataEquals(const HInstruction* other) const override {
-    // TODO: Remove "OrNull".
-    const HStaticFieldGet* other_get = other->AsStaticFieldGetOrNull();
+    const HStaticFieldGet* other_get = other->AsStaticFieldGet();
     return GetFieldOffset().SizeValue() == other_get->GetFieldOffset().SizeValue();
   }
 
@@ -7634,8 +7614,7 @@
   }
 
   HIntConstant* GetFormat() {
-    // TODO: Remove "OrNull".
-    return InputAt(FormatIndex())->AsIntConstantOrNull();
+    return InputAt(FormatIndex())->AsIntConstant();
   }
 
   bool NeedsEnvironment() const override { return true; }
@@ -7898,24 +7877,21 @@
     DCHECK_NE(GetTypeCheckKind(), TypeCheckKind::kBitstringCheck);
     HInstruction* load_class = InputAt(1);
     DCHECK(load_class->IsLoadClass());
-    // TODO: Remove "OrNull".
-    return load_class->AsLoadClassOrNull();
+    return load_class->AsLoadClass();
   }
 
   uint32_t GetBitstringPathToRoot() const {
     DCHECK_EQ(GetTypeCheckKind(), TypeCheckKind::kBitstringCheck);
     HInstruction* path_to_root = InputAt(2);
     DCHECK(path_to_root->IsIntConstant());
-    // TODO: Remove "OrNull".
-    return static_cast<uint32_t>(path_to_root->AsIntConstantOrNull()->GetValue());
+    return static_cast<uint32_t>(path_to_root->AsIntConstant()->GetValue());
   }
 
   uint32_t GetBitstringMask() const {
     DCHECK_EQ(GetTypeCheckKind(), TypeCheckKind::kBitstringCheck);
     HInstruction* mask = InputAt(3);
     DCHECK(mask->IsIntConstant());
-    // TODO: Remove "OrNull".
-    return static_cast<uint32_t>(mask->AsIntConstantOrNull()->GetValue());
+    return static_cast<uint32_t>(mask->AsIntConstant()->GetValue());
   }
 
   bool IsClonable() const override { return true; }
@@ -8719,11 +8695,9 @@
 // Returns int64_t value of a properly typed constant.
 inline int64_t Int64FromConstant(HConstant* constant) {
   if (constant->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    return constant->AsIntConstantOrNull()->GetValue();
+    return constant->AsIntConstant()->GetValue();
   } else if (constant->IsLongConstant()) {
-    // TODO: Remove "OrNull".
-    return constant->AsLongConstantOrNull()->GetValue();
+    return constant->AsLongConstant()->GetValue();
   } else {
     DCHECK(constant->IsNullConstant()) << constant->DebugName();
     return 0;
@@ -8733,12 +8707,10 @@
 // Returns true iff instruction is an integral constant (and sets value on success).
 inline bool IsInt64AndGet(HInstruction* instruction, /*out*/ int64_t* value) {
   if (instruction->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    *value = instruction->AsIntConstantOrNull()->GetValue();
+    *value = instruction->AsIntConstant()->GetValue();
     return true;
   } else if (instruction->IsLongConstant()) {
-    // TODO: Remove "OrNull".
-    *value = instruction->AsLongConstantOrNull()->GetValue();
+    *value = instruction->AsLongConstant()->GetValue();
     return true;
   } else if (instruction->IsNullConstant()) {
     *value = 0;
@@ -8755,8 +8727,7 @@
 
 // Returns true iff instruction is a zero bit pattern.
 inline bool IsZeroBitPattern(HInstruction* instruction) {
-  // TODO: Remove "OrNull".
-  return instruction->IsConstant() && instruction->AsConstantOrNull()->IsZeroBitPattern();
+  return instruction->IsConstant() && instruction->AsConstant()->IsZeroBitPattern();
 }
 
 // Implement HInstruction::Is##type() for concrete instructions.
@@ -8783,6 +8754,14 @@
 #undef INSTRUCTION_TYPE_CHECK_RESULT
 
 #define INSTRUCTION_TYPE_CAST(type, super)                                     \
+  inline const H##type* HInstruction::As##type() const {                       \
+    DCHECK(Is##type());                                                        \
+    return down_cast<const H##type*>(this);                                    \
+  }                                                                            \
+  inline H##type* HInstruction::As##type() {                                   \
+    DCHECK(Is##type());                                                        \
+    return down_cast<H##type*>(this);                                          \
+  }                                                                            \
   inline const H##type* HInstruction::As##type##OrNull() const {               \
     return Is##type() ? down_cast<const H##type*>(this) : nullptr;             \
   }                                                                            \
@@ -8817,8 +8796,7 @@
          instruction->IsNullCheck() ||
          instruction->IsNewArray()) {
     instruction = instruction->IsNewArray()
-        // TODO: Remove "OrNull".
-        ? instruction->AsNewArrayOrNull()->GetLength()
+        ? instruction->AsNewArray()->GetLength()
         : instruction->InputAt(0);
   }
   return instruction;
diff --git a/compiler/optimizing/nodes_shared.cc b/compiler/optimizing/nodes_shared.cc
index 6216da8..b3a7ad9 100644
--- a/compiler/optimizing/nodes_shared.cc
+++ b/compiler/optimizing/nodes_shared.cc
@@ -33,22 +33,17 @@
   DCHECK(CanFitInShifterOperand(instruction));
   if (instruction->IsShl()) {
     *op_kind = kLSL;
-    // TODO: Remove "OrNull".
-    *shift_amount = instruction->AsShlOrNull()->GetRight()->AsIntConstantOrNull()->GetValue();
+    *shift_amount = instruction->AsShl()->GetRight()->AsIntConstant()->GetValue();
   } else if (instruction->IsShr()) {
     *op_kind = kASR;
-    // TODO: Remove "OrNull".
-    *shift_amount = instruction->AsShrOrNull()->GetRight()->AsIntConstantOrNull()->GetValue();
+    *shift_amount = instruction->AsShr()->GetRight()->AsIntConstant()->GetValue();
   } else if (instruction->IsUShr()) {
     *op_kind = kLSR;
-    // TODO: Remove "OrNull".
-    *shift_amount = instruction->AsUShrOrNull()->GetRight()->AsIntConstantOrNull()->GetValue();
+    *shift_amount = instruction->AsUShr()->GetRight()->AsIntConstant()->GetValue();
   } else {
     DCHECK(instruction->IsTypeConversion());
-    // TODO: Remove "OrNull".
-    DataType::Type result_type = instruction->AsTypeConversionOrNull()->GetResultType();
-    // TODO: Remove "OrNull".
-    DataType::Type input_type = instruction->AsTypeConversionOrNull()->GetInputType();
+    DataType::Type result_type = instruction->AsTypeConversion()->GetResultType();
+    DataType::Type input_type = instruction->AsTypeConversion()->GetInputType();
     int result_size = DataType::Size(result_type);
     int input_size = DataType::Size(input_type);
     int min_size = std::min(result_size, input_size);
diff --git a/compiler/optimizing/nodes_shared.h b/compiler/optimizing/nodes_shared.h
index b91cc3e..27e6103 100644
--- a/compiler/optimizing/nodes_shared.h
+++ b/compiler/optimizing/nodes_shared.h
@@ -47,8 +47,7 @@
 
   bool CanBeMoved() const override { return true; }
   bool InstructionDataEquals(const HInstruction* other) const override {
-    // TODO: Remove "OrNull".
-    return op_kind_ == other->AsMultiplyAccumulateOrNull()->op_kind_;
+    return op_kind_ == other->AsMultiplyAccumulate()->op_kind_;
   }
 
   InstructionKind GetOpKind() const { return op_kind_; }
@@ -216,8 +215,7 @@
   bool IsClonable() const override { return true; }
   bool CanBeMoved() const override { return true; }
   bool InstructionDataEquals(const HInstruction* other_instr) const override {
-    // TODO: Remove "OrNull".
-    const HDataProcWithShifterOp* other = other_instr->AsDataProcWithShifterOpOrNull();
+    const HDataProcWithShifterOp* other = other_instr->AsDataProcWithShifterOp();
     return instr_kind_ == other->instr_kind_ &&
         op_kind_ == other->op_kind_ &&
         shift_amount_ == other->shift_amount_;
diff --git a/compiler/optimizing/nodes_vector.h b/compiler/optimizing/nodes_vector.h
index 223c06e..73f6c40 100644
--- a/compiler/optimizing/nodes_vector.h
+++ b/compiler/optimizing/nodes_vector.h
@@ -142,8 +142,7 @@
     DCHECK(IsPredicated());
     HInstruction* pred_input = InputAt(InputCount() - 1);
     DCHECK(pred_input->IsVecPredSetOperation());
-    // TODO: Remove "OrNull".
-    return pred_input->AsVecPredSetOperationOrNull();
+    return pred_input->AsVecPredSetOperation();
   }
 
   // Returns whether two vector operations are predicated by the same vector predicate
@@ -189,8 +188,7 @@
   // those fields in its own method *and* call all super methods.
   bool InstructionDataEquals(const HInstruction* other) const override {
     DCHECK(other->IsVecOperation());
-    // TODO: Remove "OrNull".
-    const HVecOperation* o = other->AsVecOperationOrNull();
+    const HVecOperation* o = other->AsVecOperation();
     return GetVectorLength() == o->GetVectorLength() && GetPackedType() == o->GetPackedType();
   }
 
@@ -352,8 +350,7 @@
 
   bool InstructionDataEquals(const HInstruction* other) const override {
     DCHECK(other->IsVecMemoryOperation());
-    // TODO: Remove "OrNull".
-    const HVecMemoryOperation* o = other->AsVecMemoryOperationOrNull();
+    const HVecMemoryOperation* o = other->AsVecMemoryOperation();
     return HVecOperation::InstructionDataEquals(o) && GetAlignment() == o->GetAlignment();
   }
 
@@ -374,8 +371,7 @@
     return input->GetType() == HVecOperation::kSIMDType;  // carries SIMD
   }
   DCHECK(input->IsVecOperation());
-  // TODO: Remove "OrNull".
-  DataType::Type input_type = input->AsVecOperationOrNull()->GetPackedType();
+  DataType::Type input_type = input->AsVecOperation()->GetPackedType();
   DCHECK_EQ(HVecOperation::ToUnsignedType(input_type) == HVecOperation::ToUnsignedType(type),
             HVecOperation::ToSignedType(input_type) == HVecOperation::ToSignedType(type));
   return HVecOperation::ToSignedType(input_type) == HVecOperation::ToSignedType(type);
@@ -469,8 +465,7 @@
 
   bool InstructionDataEquals(const HInstruction* other) const override {
     DCHECK(other->IsVecReduce());
-    // TODO: Remove "OrNull".
-    const HVecReduce* o = other->AsVecReduceOrNull();
+    const HVecReduce* o = other->AsVecReduce();
     return HVecOperation::InstructionDataEquals(o) && GetReductionKind() == o->GetReductionKind();
   }
 
@@ -497,10 +492,7 @@
     DCHECK_NE(GetInputType(), GetResultType());  // actual convert
   }
 
-  DataType::Type GetInputType() const {
-    // TODO: Remove "OrNull".
-    return InputAt(0)->AsVecOperationOrNull()->GetPackedType();
-  }
+  DataType::Type GetInputType() const { return InputAt(0)->AsVecOperation()->GetPackedType(); }
   DataType::Type GetResultType() const { return GetPackedType(); }
 
   bool CanBeMoved() const override { return true; }
@@ -654,8 +646,7 @@
 
   bool InstructionDataEquals(const HInstruction* other) const override {
     DCHECK(other->IsVecHalvingAdd());
-    // TODO: Remove "OrNull".
-    const HVecHalvingAdd* o = other->AsVecHalvingAddOrNull();
+    const HVecHalvingAdd* o = other->AsVecHalvingAdd();
     return HVecOperation::InstructionDataEquals(o) && IsRounded() == o->IsRounded();
   }
 
@@ -1045,8 +1036,7 @@
 
   bool InstructionDataEquals(const HInstruction* other) const override {
     DCHECK(other->IsVecMultiplyAccumulate());
-    // TODO: Remove "OrNull".
-    const HVecMultiplyAccumulate* o = other->AsVecMultiplyAccumulateOrNull();
+    const HVecMultiplyAccumulate* o = other->AsVecMultiplyAccumulate();
     return HVecOperation::InstructionDataEquals(o) && GetOpKind() == o->GetOpKind();
   }
 
@@ -1086,9 +1076,8 @@
     DCHECK(HasConsistentPackedTypes(accumulator, packed_type));
     DCHECK(sad_left->IsVecOperation());
     DCHECK(sad_right->IsVecOperation());
-    // TODO: Remove "OrNull".
-    DCHECK_EQ(ToSignedType(sad_left->AsVecOperationOrNull()->GetPackedType()),
-              ToSignedType(sad_right->AsVecOperationOrNull()->GetPackedType()));
+    DCHECK_EQ(ToSignedType(sad_left->AsVecOperation()->GetPackedType()),
+              ToSignedType(sad_right->AsVecOperation()->GetPackedType()));
     SetRawInputAt(0, accumulator);
     SetRawInputAt(1, sad_left);
     SetRawInputAt(2, sad_right);
@@ -1135,9 +1124,8 @@
     DCHECK(DataType::IsIntegralType(packed_type));
     DCHECK(left->IsVecOperation());
     DCHECK(right->IsVecOperation());
-    // TODO: Remove "OrNull".
-    DCHECK_EQ(ToSignedType(left->AsVecOperationOrNull()->GetPackedType()),
-              ToSignedType(right->AsVecOperationOrNull()->GetPackedType()));
+    DCHECK_EQ(ToSignedType(left->AsVecOperation()->GetPackedType()),
+              ToSignedType(right->AsVecOperation()->GetPackedType()));
     SetRawInputAt(0, accumulator);
     SetRawInputAt(1, left);
     SetRawInputAt(2, right);
@@ -1191,8 +1179,7 @@
 
   bool InstructionDataEquals(const HInstruction* other) const override {
     DCHECK(other->IsVecLoad());
-    // TODO: Remove "OrNull".
-    const HVecLoad* o = other->AsVecLoadOrNull();
+    const HVecLoad* o = other->AsVecLoad();
     return HVecMemoryOperation::InstructionDataEquals(o) && IsStringCharAt() == o->IsStringCharAt();
   }
 
@@ -1323,10 +1310,7 @@
   // Having governing predicate doesn't make sense for set all TRUE/FALSE instruction.
   bool MustBePredicatedInPredicatedSIMDMode() override { return false; }
 
-  bool IsSetTrue() const {
-    // TODO: Remove "OrNull".
-    return InputAt(0)->AsIntConstantOrNull()->IsTrue();
-  }
+  bool IsSetTrue() const { return InputAt(0)->AsIntConstant()->IsTrue(); }
 
   // Vector predicates are not kept alive across vector loop boundaries.
   bool CanBeMoved() const override { return false; }
diff --git a/compiler/optimizing/nodes_x86.h b/compiler/optimizing/nodes_x86.h
index 04f9763..e246390 100644
--- a/compiler/optimizing/nodes_x86.h
+++ b/compiler/optimizing/nodes_x86.h
@@ -52,13 +52,11 @@
   }
 
   HX86ComputeBaseMethodAddress* GetBaseMethodAddress() const {
-    // TODO: Remove "OrNull".
-    return InputAt(0)->AsX86ComputeBaseMethodAddressOrNull();
+    return InputAt(0)->AsX86ComputeBaseMethodAddress();
   }
 
   HConstant* GetConstant() const {
-    // TODO: Remove "OrNull".
-    return InputAt(1)->AsConstantOrNull();
+    return InputAt(1)->AsConstant();
   }
 
   DECLARE_INSTRUCTION(X86LoadFromConstantTable);
@@ -81,8 +79,7 @@
   }
 
   HX86ComputeBaseMethodAddress* GetBaseMethodAddress() const {
-    // TODO: Remove "OrNull".
-    return InputAt(1)->AsX86ComputeBaseMethodAddressOrNull();
+    return InputAt(1)->AsX86ComputeBaseMethodAddress();
   }
 
   DECLARE_INSTRUCTION(X86FPNeg);
@@ -113,8 +110,7 @@
   int32_t GetNumEntries() const { return num_entries_; }
 
   HX86ComputeBaseMethodAddress* GetBaseMethodAddress() const {
-    // TODO: Remove "OrNull".
-    return InputAt(1)->AsX86ComputeBaseMethodAddressOrNull();
+    return InputAt(1)->AsX86ComputeBaseMethodAddress();
   }
 
   HBasicBlock* GetDefaultBlock() const {
diff --git a/compiler/optimizing/optimizing_unit_test.h b/compiler/optimizing/optimizing_unit_test.h
index ceffce9..2e05c41 100644
--- a/compiler/optimizing/optimizing_unit_test.h
+++ b/compiler/optimizing/optimizing_unit_test.h
@@ -407,9 +407,8 @@
 
   HNewInstance* MakeNewInstance(HInstruction* cls, uint32_t dex_pc = 0u) {
     EXPECT_TRUE(cls->IsLoadClass() || cls->IsClinitCheck()) << *cls;
-    // TODO: Remove "OrNull".
     HLoadClass* load =
-        cls->IsLoadClass() ? cls->AsLoadClassOrNull() : cls->AsClinitCheckOrNull()->GetLoadClass();
+        cls->IsLoadClass() ? cls->AsLoadClass() : cls->AsClinitCheck()->GetLoadClass();
     return new (GetAllocator()) HNewInstance(cls,
                                              dex_pc,
                                              load->GetTypeIndex(),
@@ -593,8 +592,7 @@
     explicit KindWrapper(F f) : f_(f) {}                                                \
     void operator()(HInstruction* h) override {                                         \
       if constexpr (std::is_invocable_v<F, H##nm*>) {                                   \
-        /* TODO: Remove "OrNull". */                                                    \
-        f_(h->As##nm##OrNull());                                                        \
+        f_(h->As##nm());                                                                \
       } else {                                                                          \
         LOG(FATAL) << "Incorrect call with " << #nm;                                    \
       }                                                                                 \
diff --git a/compiler/optimizing/prepare_for_register_allocation.cc b/compiler/optimizing/prepare_for_register_allocation.cc
index 741bef7..398b10a 100644
--- a/compiler/optimizing/prepare_for_register_allocation.cc
+++ b/compiler/optimizing/prepare_for_register_allocation.cc
@@ -58,8 +58,7 @@
     // so do it ourselves now to not prevent optimizations.
     while (next->IsBoundType()) {
       next = next->GetNext();
-      // TODO: Remove "OrNull".
-      VisitBoundType(next->GetPrevious()->AsBoundTypeOrNull());
+      VisitBoundType(next->GetPrevious()->AsBoundType());
     }
     if (next->CanDoImplicitNullCheckOn(check->InputAt(0))) {
       check->MarkEmittedAtUseSite();
@@ -124,18 +123,14 @@
         CanMoveClinitCheck(check, user)) {
       implicit_clinit = user;
       if (user->IsInvokeStaticOrDirect()) {
-        // TODO: Remove "OrNull".
-        DCHECK(user->AsInvokeStaticOrDirectOrNull()->IsStaticWithExplicitClinitCheck());
-        // TODO: Remove "OrNull".
-        user->AsInvokeStaticOrDirectOrNull()->RemoveExplicitClinitCheck(
+        DCHECK(user->AsInvokeStaticOrDirect()->IsStaticWithExplicitClinitCheck());
+        user->AsInvokeStaticOrDirect()->RemoveExplicitClinitCheck(
             HInvokeStaticOrDirect::ClinitCheckRequirement::kImplicit);
       } else {
         DCHECK(user->IsNewInstance());
         // We delegate the initialization duty to the allocation.
-        // TODO: Remove "OrNull".
-        if (user->AsNewInstanceOrNull()->GetEntrypoint() == kQuickAllocObjectInitialized) {
-          // TODO: Remove "OrNull".
-          user->AsNewInstanceOrNull()->SetEntrypoint(kQuickAllocObjectResolved);
+        if (user->AsNewInstance()->GetEntrypoint() == kQuickAllocObjectInitialized) {
+          user->AsNewInstance()->SetEntrypoint(kQuickAllocObjectResolved);
         }
       }
       break;
@@ -151,8 +146,7 @@
       DCHECK(implicit_clinit->StrictlyDominates(user) || (implicit_clinit == user));
       ++it;  // Advance before we remove the node, reference to the next node is preserved.
       if (user->IsInvokeStaticOrDirect()) {
-        // TODO: Remove "OrNull".
-        user->AsInvokeStaticOrDirectOrNull()->RemoveExplicitClinitCheck(
+        user->AsInvokeStaticOrDirect()->RemoveExplicitClinitCheck(
             HInvokeStaticOrDirect::ClinitCheckRequirement::kNone);
       }
     }
@@ -190,8 +184,7 @@
     return true;
   }
 
-  // TODO: Remove "OrNull".
-  if (user->IsSelect() && user->AsSelectOrNull()->GetCondition() == condition) {
+  if (user->IsSelect() && user->AsSelect()->GetCondition() == condition) {
     return true;
   }
 
@@ -219,8 +212,7 @@
   // TODO: Move this to a separate pass.
   HInstruction* allocation_inst = constructor_fence->GetAssociatedAllocation();
   if (allocation_inst != nullptr && allocation_inst->IsNewInstance()) {
-    // TODO: Remove "OrNull".
-    HNewInstance* new_inst = allocation_inst->AsNewInstanceOrNull();
+    HNewInstance* new_inst = allocation_inst->AsNewInstance();
     // This relies on the entrypoint already being set to the more optimized version;
     // as that happens in this pass, this redundancy removal also cannot happen any earlier.
     if (new_inst != nullptr && new_inst->GetEntrypoint() == kQuickAllocObjectResolved) {
@@ -276,8 +268,7 @@
     return false;
   }
 
-  // TODO: Remove "OrNull".
-  if (user->IsNewInstance() && user->AsNewInstanceOrNull()->IsPartialMaterialization()) {
+  if (user->IsNewInstance() && user->AsNewInstance()->IsPartialMaterialization()) {
     return false;
   }
 
diff --git a/compiler/optimizing/reference_type_propagation.cc b/compiler/optimizing/reference_type_propagation.cc
index 4fddee1..6d4fdf3 100644
--- a/compiler/optimizing/reference_type_propagation.cc
+++ b/compiler/optimizing/reference_type_propagation.cc
@@ -132,8 +132,7 @@
   for (HInstruction* instruction : instructions) {
     if (instruction->IsPhi()) {
       // Need to force phis to recalculate null-ness.
-      // TODO: Remove "OrNull".
-      instruction->AsPhiOrNull()->SetCanBeNull(false);
+      instruction->AsPhi()->SetCanBeNull(false);
     }
   }
   for (HInstruction* instruction : instructions) {
@@ -164,8 +163,7 @@
     return true;
   }
 
-  // TODO: Remove "OrNull".
-  HBoundType* existing_bound_type = position->AsBoundTypeOrNull();
+  HBoundType* existing_bound_type = position->AsBoundType();
   if (existing_bound_type->GetUpperBound().IsSupertypeOf(upper_bound)) {
     if (kIsDebugBuild) {
       // Check that the existing HBoundType dominates all the uses.
@@ -255,8 +253,7 @@
   HInstruction* input_one = compare->InputAt(0);
   HInstruction* input_two = compare->InputAt(1);
   HLoadClass* load_class = input_one->IsLoadClass()
-      // TODO: Remove "OrNull".
-      ? input_one->AsLoadClassOrNull()
+      ? input_one->AsLoadClass()
       : input_two->AsLoadClassOrNull();
   if (load_class == nullptr) {
     return;
@@ -289,15 +286,13 @@
   }
 
   if (check->IsIf()) {
-    // TODO: Remove "OrNull".
     HBasicBlock* trueBlock = compare->IsEqual()
-        ? check->AsIfOrNull()->IfTrueSuccessor()
-        : check->AsIfOrNull()->IfFalseSuccessor();
+        ? check->AsIf()->IfTrueSuccessor()
+        : check->AsIf()->IfFalseSuccessor();
     BoundTypeIn(receiver, trueBlock, /* start_instruction= */ nullptr, class_rti);
   } else {
     DCHECK(check->IsDeoptimize());
-    // TODO: Remove "OrNull".
-    if (compare->IsEqual() && check->AsDeoptimizeOrNull()->GuardsAnInput()) {
+    if (compare->IsEqual() && check->AsDeoptimize()->GuardsAnInput()) {
       check->SetReferenceTypeInfo(class_rti);
     }
   }
@@ -323,8 +318,7 @@
 void ReferenceTypePropagation::RTPVisitor::VisitBasicBlock(HBasicBlock* block) {
   // Handle Phis first as there might be instructions in the same block who depend on them.
   for (HInstructionIterator it(block->GetPhis()); !it.Done(); it.Advance()) {
-    // TODO: Remove "OrNull".
-    VisitPhi(it.Current()->AsPhiOrNull());
+    VisitPhi(it.Current()->AsPhi());
   }
 
   // Handle instructions. Since RTP may add HBoundType instructions just after the
@@ -397,18 +391,14 @@
   HInstruction* input = ifInstruction->InputAt(0);
 
   if (input->IsEqual()) {
-    // TODO: Remove "OrNull".
-    HInstruction* rhs = input->AsEqualOrNull()->GetConstantRight();
+    HInstruction* rhs = input->AsEqual()->GetConstantRight();
     if (rhs != nullptr) {
-      // TODO: Remove "OrNull".
-      HInstruction* lhs = input->AsEqualOrNull()->GetLeastConstantLeft();
+      HInstruction* lhs = input->AsEqual()->GetLeastConstantLeft();
       if (lhs->IsInstanceOf() && rhs->IsIntConstant()) {
-        // TODO: Remove "OrNull".
-        if (rhs->AsIntConstantOrNull()->IsTrue()) {
+        if (rhs->AsIntConstant()->IsTrue()) {
           // Case (1a)
           *trueBranch = ifInstruction->IfTrueSuccessor();
-          // TODO: Remove "OrNull".
-        } else if (rhs->AsIntConstantOrNull()->IsFalse()) {
+        } else if (rhs->AsIntConstant()->IsFalse()) {
           // Case (2a)
           *trueBranch = ifInstruction->IfFalseSuccessor();
         } else {
@@ -416,24 +406,19 @@
           // In those cases, we cannot do the match if+instance-of.
           return false;
         }
-        // TODO: Remove "OrNull".
-        *instanceOf = lhs->AsInstanceOfOrNull();
+        *instanceOf = lhs->AsInstanceOf();
         return true;
       }
     }
   } else if (input->IsNotEqual()) {
-    // TODO: Remove "OrNull".
-    HInstruction* rhs = input->AsNotEqualOrNull()->GetConstantRight();
+    HInstruction* rhs = input->AsNotEqual()->GetConstantRight();
     if (rhs != nullptr) {
-      // TODO: Remove "OrNull".
-      HInstruction* lhs = input->AsNotEqualOrNull()->GetLeastConstantLeft();
+      HInstruction* lhs = input->AsNotEqual()->GetLeastConstantLeft();
       if (lhs->IsInstanceOf() && rhs->IsIntConstant()) {
-        // TODO: Remove "OrNull".
-        if (rhs->AsIntConstantOrNull()->IsFalse()) {
+        if (rhs->AsIntConstant()->IsFalse()) {
           // Case (1b)
           *trueBranch = ifInstruction->IfTrueSuccessor();
-          // TODO: Remove "OrNull".
-        } else if (rhs->AsIntConstantOrNull()->IsTrue()) {
+        } else if (rhs->AsIntConstant()->IsTrue()) {
           // Case (2b)
           *trueBranch = ifInstruction->IfFalseSuccessor();
         } else {
@@ -441,23 +426,20 @@
           // In those cases, we cannot do the match if+instance-of.
           return false;
         }
-        // TODO: Remove "OrNull".
-        *instanceOf = lhs->AsInstanceOfOrNull();
+        *instanceOf = lhs->AsInstanceOf();
         return true;
       }
     }
   } else if (input->IsInstanceOf()) {
     // Case (1c)
-    // TODO: Remove "OrNull".
-    *instanceOf = input->AsInstanceOfOrNull();
+    *instanceOf = input->AsInstanceOf();
     *trueBranch = ifInstruction->IfTrueSuccessor();
     return true;
   } else if (input->IsBooleanNot()) {
     HInstruction* not_input = input->InputAt(0);
     if (not_input->IsInstanceOf()) {
       // Case (2c)
-      // TODO: Remove "OrNull".
-      *instanceOf = not_input->AsInstanceOfOrNull();
+      *instanceOf = not_input->AsInstanceOf();
       *trueBranch = ifInstruction->IfFalseSuccessor();
       return true;
     }
@@ -512,12 +494,10 @@
 void ReferenceTypePropagation::RTPVisitor::SetClassAsTypeInfo(HInstruction* instr,
                                                               ObjPtr<mirror::Class> klass,
                                                               bool is_exact) {
-  // TODO: Remove "OrNull".
-  if (instr->IsInvokeStaticOrDirect() && instr->AsInvokeStaticOrDirectOrNull()->IsStringInit()) {
+  if (instr->IsInvokeStaticOrDirect() && instr->AsInvokeStaticOrDirect()->IsStringInit()) {
     // Calls to String.<init> are replaced with a StringFactory.
     if (kIsDebugBuild) {
-      // TODO: Remove "OrNull".
-      HInvokeStaticOrDirect* invoke = instr->AsInvokeStaticOrDirectOrNull();
+      HInvokeStaticOrDirect* invoke = instr->AsInvokeStaticOrDirect();
       ClassLinker* cl = Runtime::Current()->GetClassLinker();
       Thread* self = Thread::Current();
       StackHandleScope<2> hs(self);
@@ -779,8 +759,7 @@
                                                     HandleCache* handle_cache) {
   if (instruction->IsSelect()) {
     ScopedObjectAccess soa(Thread::Current());
-    // TODO: Remove "OrNull".
-    HSelect* select = instruction->AsSelectOrNull();
+    HSelect* select = instruction->AsSelect();
     ReferenceTypeInfo false_rti = select->GetFalseValue()->GetReferenceTypeInfo();
     ReferenceTypeInfo true_rti = select->GetTrueValue()->GetReferenceTypeInfo();
     select->SetReferenceTypeInfo(MergeTypes(false_rti, true_rti, handle_cache));
@@ -858,11 +837,9 @@
 
   ReferenceTypeInfo previous_rti = instr->GetReferenceTypeInfo();
   if (instr->IsBoundType()) {
-    // TODO: Remove "OrNull".
-    UpdateBoundType(instr->AsBoundTypeOrNull());
+    UpdateBoundType(instr->AsBoundType());
   } else if (instr->IsPhi()) {
-    // TODO: Remove "OrNull".
-    UpdatePhi(instr->AsPhiOrNull());
+    UpdatePhi(instr->AsPhi());
   } else if (instr->IsNullCheck()) {
     ReferenceTypeInfo parent_rti = instr->InputAt(0)->GetReferenceTypeInfo();
     if (parent_rti.IsValid()) {
@@ -871,8 +848,7 @@
   } else if (instr->IsArrayGet()) {
     // TODO: consider if it's worth "looking back" and binding the input object
     // to an array type.
-    // TODO: Remove "OrNull".
-    UpdateArrayGet(instr->AsArrayGetOrNull());
+    UpdateArrayGet(instr->AsArrayGet());
   } else {
     LOG(FATAL) << "Invalid instruction (should not get here)";
   }
@@ -973,8 +949,7 @@
 }
 
 constexpr bool ReferenceTypePropagation::RTPVisitor::IsUpdateable(const HInstruction* instr) {
-  // TODO: Remove "OrNull".
-  return (instr->IsPhi() && instr->AsPhiOrNull()->IsLive()) ||
+  return (instr->IsPhi() && instr->AsPhi()->IsLive()) ||
          instr->IsBoundType() ||
          instr->IsNullCheck() ||
          instr->IsArrayGet();
@@ -991,8 +966,7 @@
 
   bool existing_can_be_null = instr->CanBeNull();
   if (instr->IsPhi()) {
-    // TODO: Remove "OrNull".
-    HPhi* phi = instr->AsPhiOrNull();
+    HPhi* phi = instr->AsPhi();
     bool new_can_be_null = false;
     for (HInstruction* input : phi->GetInputs()) {
       if (input->CanBeNull()) {
@@ -1002,8 +976,7 @@
     }
     phi->SetCanBeNull(new_can_be_null);
   } else if (instr->IsBoundType()) {
-    // TODO: Remove "OrNull".
-    HBoundType* bound_type = instr->AsBoundTypeOrNull();
+    HBoundType* bound_type = instr->AsBoundType();
     bound_type->SetCanBeNull(instr->InputAt(0)->CanBeNull() && bound_type->GetUpperCanBeNull());
   }
   return existing_can_be_null != instr->CanBeNull();
@@ -1031,8 +1004,7 @@
     HInstruction* instruction) {
   for (const HUseListNode<HInstruction*>& use : instruction->GetUses()) {
     HInstruction* user = use.GetUser();
-    // TODO: Remove "OrNull".
-    if ((user->IsPhi() && user->AsPhiOrNull()->IsLive())
+    if ((user->IsPhi() && user->AsPhi()->IsLive())
        || user->IsBoundType()
        || user->IsNullCheck()
        || (user->IsArrayGet() && (user->GetType() == DataType::Type::kReference))) {
diff --git a/compiler/optimizing/reference_type_propagation_test.cc b/compiler/optimizing/reference_type_propagation_test.cc
index 5211e09..2b012fc 100644
--- a/compiler/optimizing/reference_type_propagation_test.cc
+++ b/compiler/optimizing/reference_type_propagation_test.cc
@@ -333,8 +333,7 @@
   }
   for (HBasicBlock* blk : succ_blocks) {
     CHECK(single_value[blk]->IsPhi()) << blk->GetBlockId();
-    // TODO: Remove "OrNull".
-    blk->AddPhi(single_value[blk]->AsPhiOrNull());
+    blk->AddPhi(single_value[blk]->AsPhi());
   }
   auto vals = MakeTransformRange(succ_blocks, [&](HBasicBlock* blk) {
     DCHECK(single_value[blk]->IsPhi());
@@ -422,8 +421,7 @@
     for (const auto& [pred, index] : ZipCount(MakeIterationRange(blk->GetPredecessors()))) {
       my_val->SetRawInputAt(index, single_value[pred]);
     }
-    // TODO: Remove "OrNull".
-    blk->AddPhi(my_val->AsPhiOrNull());
+    blk->AddPhi(my_val->AsPhi());
   }
   auto vals = MakeTransformRange(succ_blocks, [&](HBasicBlock* blk) { return single_value[blk]; });
   std::vector<HInstruction*> ins(vals.begin(), vals.end());
@@ -487,15 +485,13 @@
           return uid(g);
       }
     };
-    // TODO: Remove "OrNull".
-    HPhi* nulled_phi = lo.null_insertion_ >= 0 ? lst[lo.null_insertion_]->AsPhiOrNull() : nullptr;
+    HPhi* nulled_phi = lo.null_insertion_ >= 0 ? lst[lo.null_insertion_]->AsPhi() : nullptr;
     if (nulled_phi != nullptr) {
       nulled_phi->ReplaceInput(null_input, lo.null_phi_arg_);
     }
     MutateList(lst, lo.shuffle_);
     std::for_each(lst.begin(), lst.end(), [&](HInstruction* ins) {
-      // TODO: Remove "OrNull".
-      ins->AsPhiOrNull()->SetCanBeNull(next_null());
+      ins->AsPhi()->SetCanBeNull(next_null());
     });
   });
 }
diff --git a/compiler/optimizing/register_allocation_resolver.cc b/compiler/optimizing/register_allocation_resolver.cc
index 969a273..a4b1698 100644
--- a/compiler/optimizing/register_allocation_resolver.cc
+++ b/compiler/optimizing/register_allocation_resolver.cc
@@ -76,8 +76,7 @@
     } else if (instruction->IsCurrentMethod()) {
       // The current method is always at offset 0.
       DCHECK_IMPLIES(current->HasSpillSlot(), (current->GetSpillSlot() == 0));
-      // TODO: Remove "OrNull".
-    } else if (instruction->IsPhi() && instruction->AsPhiOrNull()->IsCatchPhi()) {
+    } else if (instruction->IsPhi() && instruction->AsPhi()->IsCatchPhi()) {
       DCHECK(current->HasSpillSlot());
       size_t slot = current->GetSpillSlot()
                     + spill_slots
@@ -352,8 +351,7 @@
             }
           } else {
             DCHECK(use.GetUser()->IsInvoke());
-            // TODO: Remove "OrNull".
-            DCHECK(use.GetUser()->AsInvokeOrNull()->GetIntrinsic() != Intrinsics::kNone);
+            DCHECK(use.GetUser()->AsInvoke()->GetIntrinsic() != Intrinsics::kNone);
           }
         }
       }
@@ -540,8 +538,7 @@
     move->SetLifetimePosition(user->GetLifetimePosition());
     user->GetBlock()->InsertInstructionBefore(move, user);
   } else {
-    // TODO: Remove "OrNull".
-    move = previous->AsParallelMoveOrNull();
+    move = previous->AsParallelMove();
   }
   DCHECK_EQ(move->GetLifetimePosition(), user->GetLifetimePosition());
   AddMove(move, source, destination, nullptr, input->GetType());
@@ -590,8 +587,7 @@
         at->GetBlock()->InsertInstructionBefore(move, at);
       } else {
         DCHECK(at->IsParallelMove());
-        // TODO: Remove "OrNull".
-        move = at->AsParallelMoveOrNull();
+        move = at->AsParallelMove();
       }
     }
   } else if (IsInstructionEnd(position)) {
@@ -621,8 +617,7 @@
       move->SetLifetimePosition(position);
       at->GetBlock()->InsertInstructionBefore(move, at);
     } else {
-      // TODO: Remove "OrNull".
-      move = previous->AsParallelMoveOrNull();
+      move = previous->AsParallelMove();
     }
   }
   DCHECK_EQ(move->GetLifetimePosition(), position);
@@ -650,14 +645,12 @@
   size_t position = last->GetLifetimePosition();
   if (previous == nullptr ||
       !previous->IsParallelMove() ||
-      // TODO: Remove "OrNull".
-      previous->AsParallelMoveOrNull()->GetLifetimePosition() != position) {
+      previous->AsParallelMove()->GetLifetimePosition() != position) {
     move = new (allocator_) HParallelMove(allocator_);
     move->SetLifetimePosition(position);
     block->InsertInstructionBefore(move, last);
   } else {
-    // TODO: Remove "OrNull".
-    move = previous->AsParallelMoveOrNull();
+    move = previous->AsParallelMove();
   }
   AddMove(move, source, destination, instruction, instruction->GetType());
 }
diff --git a/compiler/optimizing/register_allocator_graph_color.cc b/compiler/optimizing/register_allocator_graph_color.cc
index 8b96f32..a7c891d 100644
--- a/compiler/optimizing/register_allocator_graph_color.cc
+++ b/compiler/optimizing/register_allocator_graph_color.cc
@@ -1044,16 +1044,13 @@
 }
 
 void RegisterAllocatorGraphColor::AllocateSpillSlotForCatchPhi(HInstruction* instruction) {
-  // TODO: Remove "OrNull".
-  if (instruction->IsPhi() && instruction->AsPhiOrNull()->IsCatchPhi()) {
-    // TODO: Remove "OrNull".
-    HPhi* phi = instruction->AsPhiOrNull();
+  if (instruction->IsPhi() && instruction->AsPhi()->IsCatchPhi()) {
+    HPhi* phi = instruction->AsPhi();
     LiveInterval* interval = phi->GetLiveInterval();
 
     HInstruction* previous_phi = phi->GetPrevious();
     DCHECK(previous_phi == nullptr ||
-           // TODO: Remove "OrNull".
-           previous_phi->AsPhiOrNull()->GetRegNumber() <= phi->GetRegNumber())
+           previous_phi->AsPhi()->GetRegNumber() <= phi->GetRegNumber())
         << "Phis expected to be sorted by vreg number, "
         << "so that equivalent phis are adjacent.";
 
@@ -1956,8 +1953,7 @@
       // We already have a spill slot for this value that we can reuse.
     } else if (defined_by->IsParameterValue()) {
       // Parameters already have a stack slot.
-      // TODO: Remove "OrNull".
-      parent->SetSpillSlot(codegen_->GetStackSlotOfParameter(defined_by->AsParameterValueOrNull()));
+      parent->SetSpillSlot(codegen_->GetStackSlotOfParameter(defined_by->AsParameterValue()));
     } else if (defined_by->IsCurrentMethod()) {
       // The current method is always at stack slot 0.
       parent->SetSpillSlot(0);
diff --git a/compiler/optimizing/register_allocator_linear_scan.cc b/compiler/optimizing/register_allocator_linear_scan.cc
index cbb9002..ffa9937 100644
--- a/compiler/optimizing/register_allocator_linear_scan.cc
+++ b/compiler/optimizing/register_allocator_linear_scan.cc
@@ -259,10 +259,8 @@
   current->ResetSearchCache();
   CheckForFixedOutput(instruction);
 
-  // TODO: Remove "OrNull".
-  if (instruction->IsPhi() && instruction->AsPhiOrNull()->IsCatchPhi()) {
-    // TODO: Remove "OrNull".
-    AllocateSpillSlotForCatchPhi(instruction->AsPhiOrNull());
+  if (instruction->IsPhi() && instruction->AsPhi()->IsCatchPhi()) {
+    AllocateSpillSlotForCatchPhi(instruction->AsPhi());
   }
 
   // If needed, add interval to the list of unhandled intervals.
@@ -1130,13 +1128,11 @@
   }
 
   HInstruction* defined_by = parent->GetDefinedBy();
-  // TODO: Remove "OrNull".
-  DCHECK_IMPLIES(defined_by->IsPhi(), !defined_by->AsPhiOrNull()->IsCatchPhi());
+  DCHECK_IMPLIES(defined_by->IsPhi(), !defined_by->AsPhi()->IsCatchPhi());
 
   if (defined_by->IsParameterValue()) {
     // Parameters have their own stack slot.
-    // TODO: Remove "OrNull".
-    parent->SetSpillSlot(codegen_->GetStackSlotOfParameter(defined_by->AsParameterValueOrNull()));
+    parent->SetSpillSlot(codegen_->GetStackSlotOfParameter(defined_by->AsParameterValue()));
     return;
   }
 
@@ -1212,9 +1208,7 @@
   LiveInterval* interval = phi->GetLiveInterval();
 
   HInstruction* previous_phi = phi->GetPrevious();
-  DCHECK(previous_phi == nullptr ||
-         // TODO: Remove "OrNull".
-         previous_phi->AsPhiOrNull()->GetRegNumber() <= phi->GetRegNumber())
+  DCHECK(previous_phi == nullptr || previous_phi->AsPhi()->GetRegNumber() <= phi->GetRegNumber())
       << "Phis expected to be sorted by vreg number, so that equivalent phis are adjacent.";
 
   if (phi->IsVRegEquivalentOf(previous_phi)) {
diff --git a/compiler/optimizing/register_allocator_test.cc b/compiler/optimizing/register_allocator_test.cc
index a123bf8..d316aa5 100644
--- a/compiler/optimizing/register_allocator_test.cc
+++ b/compiler/optimizing/register_allocator_test.cc
@@ -338,8 +338,7 @@
   ASSERT_TRUE(register_allocator->Validate(false));
 
   HBasicBlock* loop_header = graph->GetBlocks()[2];
-  // TODO: Remove "OrNull".
-  HPhi* phi = loop_header->GetFirstPhi()->AsPhiOrNull();
+  HPhi* phi = loop_header->GetFirstPhi()->AsPhi();
 
   LiveInterval* phi_interval = phi->GetLiveInterval();
   LiveInterval* loop_update = phi->InputAt(1)->GetLiveInterval();
@@ -348,8 +347,7 @@
   ASSERT_NE(phi_interval->GetRegister(), loop_update->GetRegister());
 
   HBasicBlock* return_block = graph->GetBlocks()[3];
-  // TODO: Remove "OrNull".
-  HReturn* ret = return_block->GetLastInstruction()->AsReturnOrNull();
+  HReturn* ret = return_block->GetLastInstruction()->AsReturn();
   ASSERT_EQ(phi_interval->GetRegister(), ret->InputAt(0)->GetLiveInterval()->GetRegister());
 }
 
@@ -368,10 +366,8 @@
   SsaLivenessAnalysis liveness(graph, &codegen, GetScopedAllocator());
   liveness.Analyze();
 
-  // TODO: Remove "OrNull".
-  HXor* first_xor = graph->GetBlocks()[1]->GetFirstInstruction()->AsXorOrNull();
-  // TODO: Remove "OrNull".
-  HXor* last_xor = graph->GetBlocks()[1]->GetLastInstruction()->GetPrevious()->AsXorOrNull();
+  HXor* first_xor = graph->GetBlocks()[1]->GetFirstInstruction()->AsXor();
+  HXor* last_xor = graph->GetBlocks()[1]->GetLastInstruction()->GetPrevious()->AsXor();
   ASSERT_EQ(last_xor->InputAt(0), first_xor);
   LiveInterval* interval = first_xor->GetLiveInterval();
   ASSERT_EQ(interval->GetEnd(), last_xor->GetLifetimePosition());
diff --git a/compiler/optimizing/scheduler.cc b/compiler/optimizing/scheduler.cc
index 299418a..1cdc98a 100644
--- a/compiler/optimizing/scheduler.cc
+++ b/compiler/optimizing/scheduler.cc
@@ -150,8 +150,7 @@
   DCHECK(heap_location_collector_ != nullptr);
 
   HInstruction* ref = instr->IsPredicatedInstanceFieldGet()
-      // TODO: Remove "OrNull".
-      ? instr->AsPredicatedInstanceFieldGetOrNull()->GetTarget()
+      ? instr->AsPredicatedInstanceFieldGet()->GetTarget()
       : instr->InputAt(0);
   size_t heap_loc = heap_location_collector_->GetFieldHeapLocation(ref, GetFieldInfo(instr));
   // This field access should be analyzed and added to HeapLocationCollector before.
@@ -491,11 +490,9 @@
   DCHECK(instruction != nullptr);
 
   if (instruction->IsIf()) {
-    // TODO: Remove first "OrNull", keep the second.
-    condition = instruction->AsIfOrNull()->InputAt(0)->AsConditionOrNull();
+    condition = instruction->AsIf()->InputAt(0)->AsConditionOrNull();
   } else if (instruction->IsSelect()) {
-    // TODO: Remove first "OrNull", keep the second.
-    condition = instruction->AsSelectOrNull()->GetCondition()->AsConditionOrNull();
+    condition = instruction->AsSelect()->GetCondition()->AsConditionOrNull();
   }
 
   SchedulingNode* condition_node = (condition != nullptr) ? graph.GetNode(condition) : nullptr;
@@ -736,15 +733,10 @@
          instruction->IsClassTableGet() ||
          instruction->IsCurrentMethod() ||
          instruction->IsDivZeroCheck() ||
-         (instruction->IsInstanceFieldGet() &&
-          // TODO: Remove "OrNull".
-          !instruction->AsInstanceFieldGetOrNull()->IsVolatile()) ||
+         (instruction->IsInstanceFieldGet() && !instruction->AsInstanceFieldGet()->IsVolatile()) ||
          (instruction->IsPredicatedInstanceFieldGet() &&
-          // TODO: Remove "OrNull".
-          !instruction->AsPredicatedInstanceFieldGetOrNull()->IsVolatile()) ||
-         (instruction->IsInstanceFieldSet() &&
-          // TODO: Remove "OrNull".
-          !instruction->AsInstanceFieldSetOrNull()->IsVolatile()) ||
+          !instruction->AsPredicatedInstanceFieldGet()->IsVolatile()) ||
+         (instruction->IsInstanceFieldSet() && !instruction->AsInstanceFieldSet()->IsVolatile()) ||
          instruction->IsInstanceOf() ||
          instruction->IsInvokeInterface() ||
          instruction->IsInvokeStaticOrDirect() ||
@@ -760,12 +752,8 @@
          instruction->IsReturn() ||
          instruction->IsReturnVoid() ||
          instruction->IsSelect() ||
-         (instruction->IsStaticFieldGet() &&
-          // TODO: Remove "OrNull".
-          !instruction->AsStaticFieldGetOrNull()->IsVolatile()) ||
-         (instruction->IsStaticFieldSet() &&
-          // TODO: Remove "OrNull".
-          !instruction->AsStaticFieldSetOrNull()->IsVolatile()) ||
+         (instruction->IsStaticFieldGet() && !instruction->AsStaticFieldGet()->IsVolatile()) ||
+         (instruction->IsStaticFieldSet() && !instruction->AsStaticFieldSet()->IsVolatile()) ||
          instruction->IsSuspendCheck() ||
          instruction->IsTypeConversion();
 }
diff --git a/compiler/optimizing/scheduler_arm.cc b/compiler/optimizing/scheduler_arm.cc
index cded09a..3f931c4 100644
--- a/compiler/optimizing/scheduler_arm.cc
+++ b/compiler/optimizing/scheduler_arm.cc
@@ -109,8 +109,7 @@
       // HandleLongRotate
       HInstruction* rhs = instr->GetRight();
       if (rhs->IsConstant()) {
-        // TODO: Remove "OrNull".
-        uint64_t rot = Uint64ConstantFrom(rhs->AsConstantOrNull()) & kMaxLongShiftDistance;
+        uint64_t rot = Uint64ConstantFrom(rhs->AsConstant()) & kMaxLongShiftDistance;
         if (rot != 0u) {
           last_visited_internal_latency_ = 3 * kArmIntegerOpLatency;
           last_visited_latency_ = kArmIntegerOpLatency;
@@ -144,8 +143,7 @@
       if (!rhs->IsConstant()) {
         last_visited_internal_latency_ = 8 * kArmIntegerOpLatency;
       } else {
-        // TODO: Remove "OrNull".
-        uint32_t shift_value = Int32ConstantFrom(rhs->AsConstantOrNull()) & kMaxLongShiftDistance;
+        uint32_t shift_value = Int32ConstantFrom(rhs->AsConstant()) & kMaxLongShiftDistance;
         if (shift_value == 1 || shift_value >= 32) {
           last_visited_internal_latency_ = kArmIntegerOpLatency;
         } else {
@@ -835,8 +833,7 @@
     case DataType::Type::kInt32: {
       HInstruction* rhs = instruction->GetRight();
       if (rhs->IsConstant()) {
-        // TODO: Remove "OrNull".
-        int32_t imm = Int32ConstantFrom(rhs->AsConstantOrNull());
+        int32_t imm = Int32ConstantFrom(rhs->AsConstant());
         HandleDivRemConstantIntegralLatencies(imm);
       } else {
         last_visited_latency_ = kArmDivIntegerLatency;
@@ -904,8 +901,7 @@
     case DataType::Type::kInt32: {
       HInstruction* rhs = instruction->GetRight();
       if (rhs->IsConstant()) {
-        // TODO: Remove "OrNull".
-        int32_t imm = Int32ConstantFrom(rhs->AsConstantOrNull());
+        int32_t imm = Int32ConstantFrom(rhs->AsConstant());
         HandleDivRemConstantIntegralLatencies(imm);
       } else {
         last_visited_internal_latency_ = kArmDivIntegerLatency;
diff --git a/compiler/optimizing/scheduler_arm64.cc b/compiler/optimizing/scheduler_arm64.cc
index 0c178f6..3071afd 100644
--- a/compiler/optimizing/scheduler_arm64.cc
+++ b/compiler/optimizing/scheduler_arm64.cc
@@ -91,8 +91,7 @@
     default:
       // Follow the code path used by code generation.
       if (instr->GetRight()->IsConstant()) {
-        // TODO: Remove "OrNull".
-        int64_t imm = Int64FromConstant(instr->GetRight()->AsConstantOrNull());
+        int64_t imm = Int64FromConstant(instr->GetRight()->AsConstant());
         if (imm == 0) {
           last_visited_internal_latency_ = 0;
           last_visited_latency_ = 0;
@@ -160,8 +159,7 @@
   } else {
     // Follow the code path used by code generation.
     if (instruction->GetRight()->IsConstant()) {
-      // TODO: Remove "OrNull".
-      int64_t imm = Int64FromConstant(instruction->GetRight()->AsConstantOrNull());
+      int64_t imm = Int64FromConstant(instruction->GetRight()->AsConstant());
       if (imm == 0) {
         last_visited_internal_latency_ = 0;
         last_visited_latency_ = 0;
diff --git a/compiler/optimizing/select_generator.cc b/compiler/optimizing/select_generator.cc
index 54eac54..07065ef 100644
--- a/compiler/optimizing/select_generator.cc
+++ b/compiler/optimizing/select_generator.cc
@@ -46,9 +46,7 @@
     } else if (instruction->CanBeMoved() &&
                !instruction->HasSideEffects() &&
                !instruction->CanThrow()) {
-      if (instruction->IsSelect() &&
-          // TODO: Remove "OrNull".
-          instruction->AsSelectOrNull()->GetCondition()->GetBlock() == block) {
+      if (instruction->IsSelect() && instruction->AsSelect()->GetCondition()->GetBlock() == block) {
         // Count one HCondition and HSelect in the same block as a single instruction.
         // This enables finding nested selects.
         continue;
@@ -77,8 +75,7 @@
 
   HPhi* select_phi = nullptr;
   for (HInstructionIterator it(block->GetPhis()); !it.Done(); it.Advance()) {
-    // TODO: Remove "OrNull".
-    HPhi* phi = it.Current()->AsPhiOrNull();
+    HPhi* phi = it.Current()->AsPhi();
     if (select_phi == nullptr) {
       // First phi found.
       select_phi = phi;
@@ -93,8 +90,7 @@
 bool HSelectGenerator::TryGenerateSelectSimpleDiamondPattern(
     HBasicBlock* block, ScopedArenaSafeMap<HInstruction*, HSelect*>* cache) {
   DCHECK(block->GetLastInstruction()->IsIf());
-  // TODO: Remove "OrNull".
-  HIf* if_instruction = block->GetLastInstruction()->AsIfOrNull();
+  HIf* if_instruction = block->GetLastInstruction()->AsIf();
   HBasicBlock* true_block = if_instruction->IfTrueSuccessor();
   HBasicBlock* false_block = if_instruction->IfFalseSuccessor();
   DCHECK_NE(true_block, false_block);
@@ -220,8 +216,7 @@
 
 HBasicBlock* HSelectGenerator::TryFixupDoubleDiamondPattern(HBasicBlock* block) {
   DCHECK(block->GetLastInstruction()->IsIf());
-  // TODO: Remove "OrNull".
-  HIf* if_instruction = block->GetLastInstruction()->AsIfOrNull();
+  HIf* if_instruction = block->GetLastInstruction()->AsIf();
   HBasicBlock* true_block = if_instruction->IfTrueSuccessor();
   HBasicBlock* false_block = if_instruction->IfFalseSuccessor();
   DCHECK_NE(true_block, false_block);
@@ -236,8 +231,7 @@
 
   // The innner if branch has to be a block with just a comparison and an if.
   if (!inner_if_block->EndsWithIf() ||
-      // TODO: Remove "OrNull".
-      inner_if_block->GetLastInstruction()->AsIfOrNull()->InputAt(0) !=
+      inner_if_block->GetLastInstruction()->AsIf()->InputAt(0) !=
           inner_if_block->GetFirstInstruction() ||
       inner_if_block->GetLastInstruction()->GetPrevious() !=
           inner_if_block->GetFirstInstruction() ||
@@ -245,8 +239,7 @@
     return nullptr;
   }
 
-  // TODO: Remove "OrNull".
-  HIf* inner_if_instruction = inner_if_block->GetLastInstruction()->AsIfOrNull();
+  HIf* inner_if_instruction = inner_if_block->GetLastInstruction()->AsIf();
   HBasicBlock* inner_if_true_block = inner_if_instruction->IfTrueSuccessor();
   HBasicBlock* inner_if_false_block = inner_if_instruction->IfFalseSuccessor();
   if (!inner_if_true_block->IsSingleGoto() || !inner_if_false_block->IsSingleGoto()) {
@@ -269,8 +262,7 @@
     return nullptr;
   }
 
-  // TODO: Remove "OrNull".
-  HPhi* first_phi = first_merge->GetFirstPhi()->AsPhiOrNull();
+  HPhi* first_phi = first_merge->GetFirstPhi()->AsPhi();
 
   // Second merge is first_merge and the remainder branch merging. It must be phi + goto, or phi +
   // return. Depending on the first merge, we define the second merge.
@@ -292,8 +284,7 @@
   }
 
   size_t index = second_merge->GetPredecessorIndexOf(merges_into_second_merge);
-  // TODO: Remove "OrNull".
-  HPhi* second_phi = second_merge->GetFirstPhi()->AsPhiOrNull();
+  HPhi* second_phi = second_merge->GetFirstPhi()->AsPhi();
 
   // Merge the phis.
   first_phi->AddInput(second_phi->InputAt(index));
diff --git a/compiler/optimizing/ssa_builder.cc b/compiler/optimizing/ssa_builder.cc
index 09ca850..2179bf5 100644
--- a/compiler/optimizing/ssa_builder.cc
+++ b/compiler/optimizing/ssa_builder.cc
@@ -56,8 +56,7 @@
       // Both type propagation and redundant phi elimination ensure `int_operand`
       // can only be the 0 constant.
       DCHECK(int_operand->IsIntConstant()) << int_operand->DebugName();
-      // TODO: Remove "OrNull".
-      DCHECK_EQ(0, int_operand->AsIntConstantOrNull()->GetValue());
+      DCHECK_EQ(0, int_operand->AsIntConstant()->GetValue());
       equality_instr->ReplaceInput(graph_->GetNullConstant(), int_operand == right ? 1 : 0);
     }
   }
@@ -67,8 +66,7 @@
   // The order doesn't matter here.
   for (HBasicBlock* block : graph_->GetReversePostOrder()) {
     for (HInstructionIterator it(block->GetPhis()); !it.Done(); it.Advance()) {
-      // TODO: Remove "OrNull".
-      HPhi* phi = it.Current()->AsPhiOrNull();
+      HPhi* phi = it.Current()->AsPhi();
       HPhi* next = phi->GetNextEquivalentPhiWithSameType();
       if (next != nullptr) {
         // Make sure we do not replace a live phi with a dead phi. A live phi
@@ -90,21 +88,18 @@
 void SsaBuilder::FixEnvironmentPhis() {
   for (HBasicBlock* block : graph_->GetReversePostOrder()) {
     for (HInstructionIterator it_phis(block->GetPhis()); !it_phis.Done(); it_phis.Advance()) {
-      // TODO: Remove "OrNull".
-      HPhi* phi = it_phis.Current()->AsPhiOrNull();
+      HPhi* phi = it_phis.Current()->AsPhi();
       // If the phi is not dead, or has no environment uses, there is nothing to do.
       if (!phi->IsDead() || !phi->HasEnvironmentUses()) continue;
       HInstruction* next = phi->GetNext();
       if (!phi->IsVRegEquivalentOf(next)) continue;
-      // TODO: Remove "OrNull".
-      if (next->AsPhiOrNull()->IsDead()) {
+      if (next->AsPhi()->IsDead()) {
         // If the phi equivalent is dead, check if there is another one.
         next = next->GetNext();
         if (!phi->IsVRegEquivalentOf(next)) continue;
         // There can be at most two phi equivalents.
         DCHECK(!phi->IsVRegEquivalentOf(next->GetNext()));
-        // TODO: Remove "OrNull".
-        if (next->AsPhiOrNull()->IsDead()) continue;
+        if (next->AsPhi()->IsDead()) continue;
       }
       // We found a live phi equivalent. Update the environment uses of `phi` with it.
       phi->ReplaceWith(next);
@@ -118,15 +113,12 @@
   // live phi users, and transitively users of those users, therefore need to be
   // marked dead/conflicting too, so we add them to the worklist. Otherwise we
   // add users whose type does not match and needs to be updated.
-  // TODO: Remove "OrNull".
-  bool add_all_live_phis = instruction->IsPhi() && instruction->AsPhiOrNull()->IsDead();
+  bool add_all_live_phis = instruction->IsPhi() && instruction->AsPhi()->IsDead();
   for (const HUseListNode<HInstruction*>& use : instruction->GetUses()) {
     HInstruction* user = use.GetUser();
-    // TODO: Remove "OrNull".
-    if (user->IsPhi() && user->AsPhiOrNull()->IsLive()) {
+    if (user->IsPhi() && user->AsPhi()->IsLive()) {
       if (add_all_live_phis || user->GetType() != instruction->GetType()) {
-        // TODO: Remove "OrNull".
-        worklist->push_back(user->AsPhiOrNull());
+        worklist->push_back(user->AsPhi());
       }
     }
   }
@@ -138,8 +130,7 @@
   DataType::Type common_type = phi->GetType();
 
   for (HInstruction* input : phi->GetInputs()) {
-    // TODO: Remove "OrNull".
-    if (input->IsPhi() && input->AsPhiOrNull()->IsDead()) {
+    if (input->IsPhi() && input->AsPhi()->IsDead()) {
       // Phis are constructed live so if an input is a dead phi, it must have
       // been made dead due to type conflict. Mark this phi conflicting too.
       return false;
@@ -213,8 +204,7 @@
 
         phi->ReplaceInput(equivalent, i);
         if (equivalent->IsPhi()) {
-          // TODO: Remove "OrNull".
-          worklist->push_back(equivalent->AsPhiOrNull());
+          worklist->push_back(equivalent->AsPhi());
         }
       }
     }
@@ -251,8 +241,7 @@
   for (HBasicBlock* block : graph_->GetReversePostOrder()) {
     if (block->IsLoopHeader()) {
       for (HInstructionIterator phi_it(block->GetPhis()); !phi_it.Done(); phi_it.Advance()) {
-        // TODO: Remove "OrNull".
-        HPhi* phi = phi_it.Current()->AsPhiOrNull();
+        HPhi* phi = phi_it.Current()->AsPhi();
         if (phi->IsLive()) {
           worklist.push_back(phi);
         }
@@ -264,8 +253,7 @@
         // doing a reverse post-order visit, therefore either the phi users are
         // non-loop phi and will be visited later in the visit, or are loop-phis,
         // and they are already in the work list.
-        // TODO: Remove "OrNull".
-        HPhi* phi = phi_it.Current()->AsPhiOrNull();
+        HPhi* phi = phi_it.Current()->AsPhi();
         if (phi->IsLive()) {
           UpdatePrimitiveType(phi, &worklist);
         }
@@ -295,8 +283,7 @@
   DCHECK(DataType::IsIntOrLongType(type));
   HInstruction* next = aget->GetNext();
   if (next != nullptr && next->IsArrayGet()) {
-    // TODO: Remove "OrNull".
-    HArrayGet* next_aget = next->AsArrayGetOrNull();
+    HArrayGet* next_aget = next->AsArrayGet();
     if (next_aget->IsEquivalentOf(aget)) {
       return next_aget;
     }
@@ -408,8 +395,7 @@
           if (equivalent->IsPhi()) {
             // Returned equivalent is a phi which may not have had its inputs
             // replaced yet. We need to run primitive type propagation on it.
-            // TODO: Remove "OrNull".
-            worklist.push_back(equivalent->AsPhiOrNull());
+            worklist.push_back(equivalent->AsPhi());
           }
         }
         // Refine the side effects of this floating point aset. Note that we do this even if
@@ -456,8 +442,7 @@
       return false;
     }
     DCHECK(str->IsNewInstance());
-    // TODO: Remove "OrNull".
-    AddUninitializedString(str->AsNewInstanceOrNull());
+    AddUninitializedString(str->AsNewInstance());
     str->ReplaceUsesDominatedBy(invoke, invoke);
     str->ReplaceEnvUsesDominatedBy(invoke, invoke);
     invoke->RemoveInputAt(invoke->InputCount() - 1);
@@ -493,13 +478,11 @@
       // class is always initialized at the point of running Java code, we can remove
       // that check.
       if (input->IsClinitCheck()) {
-        // TODO: Remove "OrNull".
-        load_class = input->InputAt(0)->AsLoadClassOrNull();
+        load_class = input->InputAt(0)->AsLoadClass();
         input->ReplaceWith(load_class);
         input->GetBlock()->RemoveInstruction(input);
       } else {
-        // TODO: Remove "OrNull".
-        load_class = input->AsLoadClassOrNull();
+        load_class = input->AsLoadClass();
         DCHECK(new_instance->IsStringAlloc());
         DCHECK(!load_class->NeedsAccessCheck()) << "String class is always accessible";
       }
@@ -520,8 +503,7 @@
   for (HBasicBlock* block : graph->GetReversePostOrder()) {
     if (block->IsLoopHeader()) {
       for (HInstructionIterator it(block->GetPhis()); !it.Done(); it.Advance()) {
-        // TODO: Remove "OrNull".
-        if (it.Current()->AsPhiOrNull()->HasEquivalentPhi()) {
+        if (it.Current()->AsPhi()->HasEquivalentPhi()) {
           return true;
         }
       }
@@ -671,16 +653,14 @@
   // We place the floating point /reference phi next to this phi.
   HInstruction* next = phi->GetNext();
   if (next != nullptr &&
-      // TODO: Remove "OrNull".
-      next->AsPhiOrNull()->GetRegNumber() == phi->GetRegNumber() &&
+      next->AsPhi()->GetRegNumber() == phi->GetRegNumber() &&
       next->GetType() != type) {
     // Move to the next phi to see if it is the one we are looking for.
     next = next->GetNext();
   }
 
   if (next == nullptr ||
-      // TODO: Remove "OrNull".
-      (next->AsPhiOrNull()->GetRegNumber() != phi->GetRegNumber()) ||
+      (next->AsPhi()->GetRegNumber() != phi->GetRegNumber()) ||
       (next->GetType() != type)) {
     ArenaAllocator* allocator = graph_->GetAllocator();
     HInputsRef inputs = phi->GetInputs();
@@ -697,8 +677,7 @@
   } else {
     // An existing equivalent was found. If it is dead, conflict was previously
     // identified and we return nullptr instead.
-    // TODO: Remove "OrNull".
-    HPhi* next_phi = next->AsPhiOrNull();
+    HPhi* next_phi = next->AsPhi();
     DCHECK_EQ(next_phi->GetType(), type);
     return next_phi->IsLive() ? next_phi : nullptr;
   }
@@ -731,30 +710,23 @@
 
 HInstruction* SsaBuilder::GetFloatOrDoubleEquivalent(HInstruction* value, DataType::Type type) {
   if (value->IsArrayGet()) {
-    // TODO: Remove "OrNull".
-    return GetFloatOrDoubleEquivalentOfArrayGet(value->AsArrayGetOrNull());
+    return GetFloatOrDoubleEquivalentOfArrayGet(value->AsArrayGet());
   } else if (value->IsLongConstant()) {
-    // TODO: Remove "OrNull".
-    return GetDoubleEquivalent(value->AsLongConstantOrNull());
+    return GetDoubleEquivalent(value->AsLongConstant());
   } else if (value->IsIntConstant()) {
-    // TODO: Remove "OrNull".
-    return GetFloatEquivalent(value->AsIntConstantOrNull());
+    return GetFloatEquivalent(value->AsIntConstant());
   } else if (value->IsPhi()) {
-    // TODO: Remove "OrNull".
-    return GetFloatDoubleOrReferenceEquivalentOfPhi(value->AsPhiOrNull(), type);
+    return GetFloatDoubleOrReferenceEquivalentOfPhi(value->AsPhi(), type);
   } else {
     return nullptr;
   }
 }
 
 HInstruction* SsaBuilder::GetReferenceTypeEquivalent(HInstruction* value) {
-  // TODO: Remove "OrNull".
-  if (value->IsIntConstant() && value->AsIntConstantOrNull()->GetValue() == 0) {
+  if (value->IsIntConstant() && value->AsIntConstant()->GetValue() == 0) {
     return graph_->GetNullConstant();
   } else if (value->IsPhi()) {
-    // TODO: Remove "OrNull".
-    return GetFloatDoubleOrReferenceEquivalentOfPhi(
-        value->AsPhiOrNull(), DataType::Type::kReference);
+    return GetFloatDoubleOrReferenceEquivalentOfPhi(value->AsPhi(), DataType::Type::kReference);
   } else {
     return nullptr;
   }
diff --git a/compiler/optimizing/ssa_liveness_analysis.cc b/compiler/optimizing/ssa_liveness_analysis.cc
index b36ccbe..317e099 100644
--- a/compiler/optimizing/ssa_liveness_analysis.cc
+++ b/compiler/optimizing/ssa_liveness_analysis.cc
@@ -496,8 +496,7 @@
     if (definition->IsPhi()) {
       definition = definition->InputAt(1);  // SIMD always appears on back-edge
     }
-    // TODO: Remove "OrNull".
-    return definition->AsVecOperationOrNull()->GetVectorNumberOfBytes() / kVRegSize;
+    return definition->AsVecOperation()->GetVectorNumberOfBytes() / kVRegSize;
   }
   // Return number of needed spill slots based on type.
   return (type_ == DataType::Type::kInt64 || type_ == DataType::Type::kFloat64) ? 2 : 1;
diff --git a/compiler/optimizing/ssa_phi_elimination.cc b/compiler/optimizing/ssa_phi_elimination.cc
index 2a1697d..1d9be39 100644
--- a/compiler/optimizing/ssa_phi_elimination.cc
+++ b/compiler/optimizing/ssa_phi_elimination.cc
@@ -45,8 +45,7 @@
   // Add to the worklist phis referenced by non-phi instructions.
   for (HBasicBlock* block : graph_->GetReversePostOrder()) {
     for (HInstructionIterator inst_it(block->GetPhis()); !inst_it.Done(); inst_it.Advance()) {
-      // TODO: Remove "OrNull".
-      HPhi* phi = inst_it.Current()->AsPhiOrNull();
+      HPhi* phi = inst_it.Current()->AsPhi();
       if (phi->IsDead()) {
         continue;
       }
@@ -98,8 +97,7 @@
     HInstruction* next = nullptr;
     HPhi* phi;
     while (current != nullptr) {
-      // TODO: Remove "OrNull".
-      phi = current->AsPhiOrNull();
+      phi = current->AsPhi();
       next = current->GetNext();
       if (phi->IsDead()) {
         // Make sure the phi is only used by other dead phis.
@@ -107,8 +105,7 @@
           for (const HUseListNode<HInstruction*>& use : phi->GetUses()) {
             HInstruction* user = use.GetUser();
             DCHECK(user->IsLoopHeaderPhi());
-            // TODO: Remove "OrNull".
-            DCHECK(user->AsPhiOrNull()->IsDead());
+            DCHECK(user->AsPhi()->IsDead());
           }
         }
         // Remove the phi from use lists of its inputs.
@@ -138,8 +135,7 @@
   // neither will necessarily converge faster.
   for (HBasicBlock* block : graph_->GetReversePostOrder()) {
     for (HInstructionIterator inst_it(block->GetPhis()); !inst_it.Done(); inst_it.Advance()) {
-      // TODO: Remove "OrNull".
-      worklist.push_back(inst_it.Current()->AsPhiOrNull());
+      worklist.push_back(inst_it.Current()->AsPhi());
     }
   }
 
@@ -201,11 +197,9 @@
             continue;
           } else if (input->IsPhi()) {
             if (!visited_phis_in_cycle.IsBitSet(input->GetId())) {
-              // TODO: Remove "OrNull".
-              cycle_worklist.push_back(input->AsPhiOrNull());
+              cycle_worklist.push_back(input->AsPhi());
               visited_phis_in_cycle.SetBit(input->GetId());
-              // TODO: Remove "OrNull".
-              catch_phi_in_cycle |= input->AsPhiOrNull()->IsCatchPhi();
+              catch_phi_in_cycle |= input->AsPhi()->IsCatchPhi();
               irreducible_loop_phi_in_cycle |= input->IsIrreducibleLoopHeaderPhi();
             } else {
               // Already visited, nothing to do.
@@ -254,8 +248,7 @@
       for (const HUseListNode<HInstruction*>& use : current->GetUses()) {
         HInstruction* user = use.GetUser();
         if (user->IsPhi() && !visited_phis_in_cycle.IsBitSet(user->GetId())) {
-          // TODO: Remove "OrNull".
-          worklist.push_back(user->AsPhiOrNull());
+          worklist.push_back(user->AsPhi());
         }
       }
       DCHECK(candidate->StrictlyDominates(current));
diff --git a/compiler/optimizing/superblock_cloner.cc b/compiler/optimizing/superblock_cloner.cc
index f323c8a..7c0097c 100644
--- a/compiler/optimizing/superblock_cloner.cc
+++ b/compiler/optimizing/superblock_cloner.cc
@@ -175,10 +175,8 @@
   // of copy successor's predecessors.
   bool first_phi_met = false;
   for (HInstructionIterator it(orig_succ->GetPhis()); !it.Done(); it.Advance()) {
-    // TODO: Remove "OrNull".
-    HPhi* orig_phi = it.Current()->AsPhiOrNull();
-    // TODO: Remove "OrNull".
-    HPhi* copy_phi = GetInstrCopy(orig_phi)->AsPhiOrNull();
+    HPhi* orig_phi = it.Current()->AsPhi();
+    HPhi* copy_phi = GetInstrCopy(orig_phi)->AsPhi();
     HInstruction* orig_phi_input = orig_phi->InputAt(this_index);
     // Remove corresponding input for original phi.
     orig_phi->RemoveInputAt(this_index);
@@ -207,10 +205,8 @@
 
   size_t orig_index = orig_succ->GetPredecessorIndexOf(orig_block);
   for (HInstructionIterator it(orig_succ->GetPhis()); !it.Done(); it.Advance()) {
-    // TODO: Remove "OrNull".
-    HPhi* orig_phi = it.Current()->AsPhiOrNull();
-    // TODO: Remove "OrNull".
-    HPhi* copy_phi = GetInstrCopy(orig_phi)->AsPhiOrNull();
+    HPhi* orig_phi = it.Current()->AsPhi();
+    HPhi* copy_phi = GetInstrCopy(orig_phi)->AsPhi();
     HInstruction* orig_phi_input = orig_phi->InputAt(orig_index);
     copy_phi->AddInput(orig_phi_input);
   }
@@ -225,8 +221,7 @@
 
   size_t orig_index = orig_succ->GetPredecessorIndexOf(orig_block);
   for (HInstructionIterator it(orig_succ->GetPhis()); !it.Done(); it.Advance()) {
-    // TODO: Remove "OrNull".
-    HPhi* orig_phi = it.Current()->AsPhiOrNull();
+    HPhi* orig_phi = it.Current()->AsPhi();
     HInstruction* orig_phi_input = orig_phi->InputAt(orig_index);
     orig_phi->AddInput(orig_phi_input);
   }
@@ -254,10 +249,8 @@
       // TODO: remove this requirement.
       DCHECK_EQ(orig_block->GetPredecessorIndexOf(orig_pred), incoming_edge_count);
       for (HInstructionIterator it(orig_block->GetPhis()); !it.Done(); it.Advance()) {
-        // TODO: Remove "OrNull".
-        HPhi* orig_phi = it.Current()->AsPhiOrNull();
-        // TODO: Remove "OrNull".
-        HPhi* copy_phi = GetInstrCopy(orig_phi)->AsPhiOrNull();
+        HPhi* orig_phi = it.Current()->AsPhi();
+        HPhi* copy_phi = GetInstrCopy(orig_phi)->AsPhi();
         HInstruction* orig_phi_input = orig_phi->InputAt(incoming_edge_count);
         // Add the corresponding input of the original phi to the copy one.
         copy_phi->AddInput(orig_phi_input);
@@ -554,10 +547,8 @@
     HBasicBlock* orig_block = entry.first;
 
     for (HInstructionIterator it(orig_block->GetPhis()); !it.Done(); it.Advance()) {
-      // TODO: Remove "OrNull".
-      HPhi* orig_phi = it.Current()->AsPhiOrNull();
-      // TODO: Remove "OrNull".
-      HPhi* copy_phi = GetInstrCopy(orig_phi)->AsPhiOrNull();
+      HPhi* orig_phi = it.Current()->AsPhi();
+      HPhi* copy_phi = GetInstrCopy(orig_phi)->AsPhi();
       ResolvePhi(orig_phi);
       ResolvePhi(copy_phi);
     }
@@ -678,8 +669,7 @@
   for (auto it : live_outs_) {
     DCHECK(it.first != it.second);
     HInstruction* orig_value = it.first;
-    // TODO: Remove "OrNull".
-    HPhi* phi = it.second->AsPhiOrNull();
+    HPhi* phi = it.second->AsPhi();
     HInstruction* copy_value = GetInstrCopy(orig_value);
     // Copy edges are inserted after the original so we can just add new input to the phi.
     phi->AddInput(copy_value);
@@ -1011,8 +1001,7 @@
   for (auto entry : *bb_map_) {
     HBasicBlock* orig_block = entry.first;
     for (HInstructionIterator inst_it(orig_block->GetPhis()); !inst_it.Done(); inst_it.Advance()) {
-      // TODO: Remove "OrNull".
-      HPhi* phi = inst_it.Current()->AsPhiOrNull();
+      HPhi* phi = inst_it.Current()->AsPhi();
       if (ArePhiInputsTheSame(phi)) {
         phi->ReplaceWith(phi->InputAt(0));
         orig_block->RemovePhi(phi);
@@ -1021,8 +1010,7 @@
 
     HBasicBlock* copy_block = GetBlockCopy(orig_block);
     for (HInstructionIterator inst_it(copy_block->GetPhis()); !inst_it.Done(); inst_it.Advance()) {
-      // TODO: Remove "OrNull".
-      HPhi* phi = inst_it.Current()->AsPhiOrNull();
+      HPhi* phi = inst_it.Current()->AsPhi();
       if (ArePhiInputsTheSame(phi)) {
         phi->ReplaceWith(phi->InputAt(0));
         copy_block->RemovePhi(phi);
@@ -1044,10 +1032,8 @@
   for (HInstructionIterator it(orig_block->GetPhis()); !it.Done(); it.Advance()) {
     HInstruction* orig_instr = it.Current();
     HInstruction* copy_instr = orig_instr->Clone(arena_);
-    // TODO: Remove "OrNull".
-    copy_block->AddPhi(copy_instr->AsPhiOrNull());
-    // TODO: Remove "OrNull".
-    copy_instr->AsPhiOrNull()->RemoveAllInputs();
+    copy_block->AddPhi(copy_instr->AsPhi());
+    copy_instr->AsPhi()->RemoveAllInputs();
     DCHECK(!orig_instr->HasEnvironment());
     hir_map_->Put(orig_instr, copy_instr);
   }
diff --git a/compiler/optimizing/superblock_cloner_test.cc b/compiler/optimizing/superblock_cloner_test.cc
index 7c90562..ea2563e 100644
--- a/compiler/optimizing/superblock_cloner_test.cc
+++ b/compiler/optimizing/superblock_cloner_test.cc
@@ -432,8 +432,7 @@
 
   HInstructionIterator it(header->GetPhis());
   DCHECK(!it.Done());
-  // TODO: Remove "OrNull".
-  HPhi* loop_phi = it.Current()->AsPhiOrNull();
+  HPhi* loop_phi = it.Current()->AsPhi();
   HInstruction* temp_add = new (GetAllocator()) HAdd(DataType::Type::kInt32,
                                                      loop_phi,
                                                      graph_->GetIntConstant(2));
diff --git a/compiler/optimizing/write_barrier_elimination.cc b/compiler/optimizing/write_barrier_elimination.cc
index 390c6e9..eb70b67 100644
--- a/compiler/optimizing/write_barrier_elimination.cc
+++ b/compiler/optimizing/write_barrier_elimination.cc
@@ -52,13 +52,10 @@
     auto it = current_write_barriers_.find(obj);
     if (it != current_write_barriers_.end()) {
       DCHECK(it->second->IsInstanceFieldSet());
-      // TODO: Remove "OrNull".
-      DCHECK(it->second->AsInstanceFieldSetOrNull()->GetWriteBarrierKind() !=
+      DCHECK(it->second->AsInstanceFieldSet()->GetWriteBarrierKind() !=
              WriteBarrierKind::kDontEmit);
       DCHECK_EQ(it->second->GetBlock(), instruction->GetBlock());
-      // TODO: Remove "OrNull".
-      it->second->AsInstanceFieldSetOrNull()->SetWriteBarrierKind(
-          WriteBarrierKind::kEmitNoNullCheck);
+      it->second->AsInstanceFieldSet()->SetWriteBarrierKind(WriteBarrierKind::kEmitNoNullCheck);
       instruction->SetWriteBarrierKind(WriteBarrierKind::kDontEmit);
       MaybeRecordStat(stats_, MethodCompilationStat::kRemovedWriteBarrier);
     } else {
@@ -82,12 +79,9 @@
     auto it = current_write_barriers_.find(cls);
     if (it != current_write_barriers_.end()) {
       DCHECK(it->second->IsStaticFieldSet());
-      // TODO: Remove "OrNull".
-      DCHECK(it->second->AsStaticFieldSetOrNull()->GetWriteBarrierKind() !=
-             WriteBarrierKind::kDontEmit);
+      DCHECK(it->second->AsStaticFieldSet()->GetWriteBarrierKind() != WriteBarrierKind::kDontEmit);
       DCHECK_EQ(it->second->GetBlock(), instruction->GetBlock());
-      // TODO: Remove "OrNull".
-      it->second->AsStaticFieldSetOrNull()->SetWriteBarrierKind(WriteBarrierKind::kEmitNoNullCheck);
+      it->second->AsStaticFieldSet()->SetWriteBarrierKind(WriteBarrierKind::kEmitNoNullCheck);
       instruction->SetWriteBarrierKind(WriteBarrierKind::kDontEmit);
       MaybeRecordStat(stats_, MethodCompilationStat::kRemovedWriteBarrier);
     } else {
@@ -113,13 +107,10 @@
     auto it = current_write_barriers_.find(arr);
     if (it != current_write_barriers_.end()) {
       DCHECK(it->second->IsArraySet());
-      // TODO: Remove "OrNull".
-      DCHECK(it->second->AsArraySetOrNull()->GetWriteBarrierKind() != WriteBarrierKind::kDontEmit);
+      DCHECK(it->second->AsArraySet()->GetWriteBarrierKind() != WriteBarrierKind::kDontEmit);
       DCHECK_EQ(it->second->GetBlock(), instruction->GetBlock());
       // We never skip the null check in ArraySets so that value is already set.
-      // TODO: Remove "OrNull".
-      DCHECK(it->second->AsArraySetOrNull()->GetWriteBarrierKind() ==
-             WriteBarrierKind::kEmitNoNullCheck);
+      DCHECK(it->second->AsArraySet()->GetWriteBarrierKind() == WriteBarrierKind::kEmitNoNullCheck);
       instruction->SetWriteBarrierKind(WriteBarrierKind::kDontEmit);
       MaybeRecordStat(stats_, MethodCompilationStat::kRemovedWriteBarrier);
     } else {