Lines Matching refs:inst
41 void VisitUnaryOperation(HUnaryOperation* inst) override;
42 void VisitBinaryOperation(HBinaryOperation* inst) override;
49 bool TryRemoveBinaryOperationViaSelect(HBinaryOperation* inst);
51 void VisitArrayLength(HArrayLength* inst) override;
52 void VisitDivZeroCheck(HDivZeroCheck* inst) override;
53 void VisitIf(HIf* inst) override;
54 void VisitInvoke(HInvoke* inst) override;
55 void VisitTypeConversion(HTypeConversion* inst) override;
125 void HConstantFoldingVisitor::VisitUnaryOperation(HUnaryOperation* inst) { in VisitUnaryOperation() argument
128 HConstant* constant = inst->TryStaticEvaluation(); in VisitUnaryOperation()
130 inst->ReplaceWith(constant); in VisitUnaryOperation()
131 inst->GetBlock()->RemoveInstruction(inst); in VisitUnaryOperation()
132 } else if (inst->InputAt(0)->IsSelect() && inst->InputAt(0)->HasOnlyOneNonEnvironmentUse()) { in VisitUnaryOperation()
135 HSelect* select = inst->InputAt(0)->AsSelect(); in VisitUnaryOperation()
136 HConstant* false_constant = inst->TryStaticEvaluation(select->GetFalseValue()); in VisitUnaryOperation()
140 HConstant* true_constant = inst->TryStaticEvaluation(select->GetTrueValue()); in VisitUnaryOperation()
149 inst->ReplaceWith(select); in VisitUnaryOperation()
150 inst->GetBlock()->RemoveInstruction(inst); in VisitUnaryOperation()
154 bool HConstantFoldingVisitor::TryRemoveBinaryOperationViaSelect(HBinaryOperation* inst) { in TryRemoveBinaryOperationViaSelect() argument
155 if (inst->GetLeft()->IsSelect() == inst->GetRight()->IsSelect()) { in TryRemoveBinaryOperationViaSelect()
164 const bool left_is_select = inst->GetLeft()->IsSelect(); in TryRemoveBinaryOperationViaSelect()
165 HSelect* select = left_is_select ? inst->GetLeft()->AsSelect() : inst->GetRight()->AsSelect(); in TryRemoveBinaryOperationViaSelect()
166 HInstruction* maybe_constant = left_is_select ? inst->GetRight() : inst->GetLeft(); in TryRemoveBinaryOperationViaSelect()
172 inst->TryStaticEvaluation(left_is_select ? select->GetFalseValue() : maybe_constant, in TryRemoveBinaryOperationViaSelect()
178 inst->TryStaticEvaluation(left_is_select ? select->GetTrueValue() : maybe_constant, in TryRemoveBinaryOperationViaSelect()
188 inst->ReplaceWith(select); in TryRemoveBinaryOperationViaSelect()
189 inst->GetBlock()->RemoveInstruction(inst); in TryRemoveBinaryOperationViaSelect()
195 void HConstantFoldingVisitor::VisitBinaryOperation(HBinaryOperation* inst) { in VisitBinaryOperation() argument
198 HConstant* constant = inst->TryStaticEvaluation(); in VisitBinaryOperation()
200 inst->ReplaceWith(constant); in VisitBinaryOperation()
201 inst->GetBlock()->RemoveInstruction(inst); in VisitBinaryOperation()
202 } else if (TryRemoveBinaryOperationViaSelect(inst)) { in VisitBinaryOperation()
206 inst->Accept(&simplifier); in VisitBinaryOperation()
210 void HConstantFoldingVisitor::VisitDivZeroCheck(HDivZeroCheck* inst) { in VisitDivZeroCheck() argument
212 HInstruction* check_input = inst->InputAt(0); in VisitDivZeroCheck()
214 inst->ReplaceWith(check_input); in VisitDivZeroCheck()
215 inst->GetBlock()->RemoveInstruction(inst); in VisitDivZeroCheck()
242 void HConstantFoldingVisitor::VisitIf(HIf* inst) { in VisitIf() argument
244 DCHECK(!inst->IfTrueSuccessor()->Dominates(inst->IfFalseSuccessor()) && in VisitIf()
245 !inst->IfFalseSuccessor()->Dominates(inst->IfTrueSuccessor())); in VisitIf()
247 HInstruction* if_input = inst->InputAt(0); in VisitIf()
259 PropagateValue(inst->IfTrueSuccessor(), if_input, GetGraph()->GetIntConstant(1)); in VisitIf()
260 PropagateValue(inst->IfFalseSuccessor(), if_input, GetGraph()->GetIntConstant(0)); in VisitIf()
331 condition->IsEqual() ? inst->IfTrueSuccessor() : inst->IfFalseSuccessor(); in VisitIf()
342 condition->IsEqual() ? inst->IfFalseSuccessor() : inst->IfTrueSuccessor(); in VisitIf()
353 void HConstantFoldingVisitor::VisitInvoke(HInvoke* inst) { in VisitInvoke() argument
354 switch (inst->GetIntrinsic()) { in VisitInvoke()
357 FoldReverseIntrinsic(inst); in VisitInvoke()
362 FoldReverseBytesIntrinsic(inst); in VisitInvoke()
366 FoldBitCountIntrinsic(inst); in VisitInvoke()
370 FoldDivideUnsignedIntrinsic(inst); in VisitInvoke()
374 FoldHighestOneBitIntrinsic(inst); in VisitInvoke()
378 FoldLowestOneBitIntrinsic(inst); in VisitInvoke()
382 FoldNumberOfLeadingZerosIntrinsic(inst); in VisitInvoke()
386 FoldNumberOfTrailingZerosIntrinsic(inst); in VisitInvoke()
393 void HConstantFoldingVisitor::FoldReverseIntrinsic(HInvoke* inst) { in FoldReverseIntrinsic() argument
394 DCHECK(inst->GetIntrinsic() == Intrinsics::kIntegerReverse || in FoldReverseIntrinsic()
395 inst->GetIntrinsic() == Intrinsics::kLongReverse); in FoldReverseIntrinsic()
397 HInstruction* input = inst->InputAt(0); in FoldReverseIntrinsic()
403 if (inst->GetIntrinsic() == Intrinsics::kIntegerReverse) { in FoldReverseIntrinsic()
405 inst->ReplaceWith( in FoldReverseIntrinsic()
409 inst->ReplaceWith( in FoldReverseIntrinsic()
412 inst->GetBlock()->RemoveInstruction(inst); in FoldReverseIntrinsic()
415 void HConstantFoldingVisitor::FoldReverseBytesIntrinsic(HInvoke* inst) { in FoldReverseBytesIntrinsic() argument
416 DCHECK(inst->GetIntrinsic() == Intrinsics::kIntegerReverseBytes || in FoldReverseBytesIntrinsic()
417 inst->GetIntrinsic() == Intrinsics::kLongReverseBytes || in FoldReverseBytesIntrinsic()
418 inst->GetIntrinsic() == Intrinsics::kShortReverseBytes); in FoldReverseBytesIntrinsic()
420 HInstruction* input = inst->InputAt(0); in FoldReverseBytesIntrinsic()
426 if (inst->GetIntrinsic() == Intrinsics::kIntegerReverseBytes) { in FoldReverseBytesIntrinsic()
428 inst->ReplaceWith(GetGraph()->GetIntConstant(BSWAP(input->AsIntConstant()->GetValue()))); in FoldReverseBytesIntrinsic()
429 } else if (inst->GetIntrinsic() == Intrinsics::kLongReverseBytes) { in FoldReverseBytesIntrinsic()
431 inst->ReplaceWith(GetGraph()->GetLongConstant(BSWAP(input->AsLongConstant()->GetValue()))); in FoldReverseBytesIntrinsic()
434 inst->ReplaceWith(GetGraph()->GetIntConstant( in FoldReverseBytesIntrinsic()
437 inst->GetBlock()->RemoveInstruction(inst); in FoldReverseBytesIntrinsic()
440 void HConstantFoldingVisitor::FoldBitCountIntrinsic(HInvoke* inst) { in FoldBitCountIntrinsic() argument
441 DCHECK(inst->GetIntrinsic() == Intrinsics::kIntegerBitCount || in FoldBitCountIntrinsic()
442 inst->GetIntrinsic() == Intrinsics::kLongBitCount); in FoldBitCountIntrinsic()
444 HInstruction* input = inst->InputAt(0); in FoldBitCountIntrinsic()
449 DCHECK_IMPLIES(inst->GetIntrinsic() == Intrinsics::kIntegerBitCount, input->IsIntConstant()); in FoldBitCountIntrinsic()
450 DCHECK_IMPLIES(inst->GetIntrinsic() == Intrinsics::kLongBitCount, input->IsLongConstant()); in FoldBitCountIntrinsic()
453 int result = inst->GetIntrinsic() == Intrinsics::kIntegerBitCount ? in FoldBitCountIntrinsic()
456 inst->ReplaceWith(GetGraph()->GetIntConstant(result)); in FoldBitCountIntrinsic()
457 inst->GetBlock()->RemoveInstruction(inst); in FoldBitCountIntrinsic()
460 void HConstantFoldingVisitor::FoldDivideUnsignedIntrinsic(HInvoke* inst) { in FoldDivideUnsignedIntrinsic() argument
461 DCHECK(inst->GetIntrinsic() == Intrinsics::kIntegerDivideUnsigned || in FoldDivideUnsignedIntrinsic()
462 inst->GetIntrinsic() == Intrinsics::kLongDivideUnsigned); in FoldDivideUnsignedIntrinsic()
464 HInstruction* divisor = inst->InputAt(1); in FoldDivideUnsignedIntrinsic()
468 DCHECK_IMPLIES(inst->GetIntrinsic() == Intrinsics::kIntegerDivideUnsigned, in FoldDivideUnsignedIntrinsic()
470 DCHECK_IMPLIES(inst->GetIntrinsic() == Intrinsics::kLongDivideUnsigned, in FoldDivideUnsignedIntrinsic()
472 const bool is_int_intrinsic = inst->GetIntrinsic() == Intrinsics::kIntegerDivideUnsigned; in FoldDivideUnsignedIntrinsic()
476 inst->SetAlwaysThrows(true); in FoldDivideUnsignedIntrinsic()
481 HInstruction* dividend = inst->InputAt(0); in FoldDivideUnsignedIntrinsic()
485 DCHECK_IMPLIES(inst->GetIntrinsic() == Intrinsics::kIntegerDivideUnsigned, in FoldDivideUnsignedIntrinsic()
487 DCHECK_IMPLIES(inst->GetIntrinsic() == Intrinsics::kLongDivideUnsigned, in FoldDivideUnsignedIntrinsic()
495 inst->ReplaceWith(GetGraph()->GetIntConstant(static_cast<int32_t>(dividend_val / divisor_val))); in FoldDivideUnsignedIntrinsic()
499 inst->ReplaceWith( in FoldDivideUnsignedIntrinsic()
503 inst->GetBlock()->RemoveInstruction(inst); in FoldDivideUnsignedIntrinsic()
506 void HConstantFoldingVisitor::FoldHighestOneBitIntrinsic(HInvoke* inst) { in FoldHighestOneBitIntrinsic() argument
507 DCHECK(inst->GetIntrinsic() == Intrinsics::kIntegerHighestOneBit || in FoldHighestOneBitIntrinsic()
508 inst->GetIntrinsic() == Intrinsics::kLongHighestOneBit); in FoldHighestOneBitIntrinsic()
510 HInstruction* input = inst->InputAt(0); in FoldHighestOneBitIntrinsic()
516 if (inst->GetIntrinsic() == Intrinsics::kIntegerHighestOneBit) { in FoldHighestOneBitIntrinsic()
518 inst->ReplaceWith( in FoldHighestOneBitIntrinsic()
522 inst->ReplaceWith( in FoldHighestOneBitIntrinsic()
525 inst->GetBlock()->RemoveInstruction(inst); in FoldHighestOneBitIntrinsic()
528 void HConstantFoldingVisitor::FoldLowestOneBitIntrinsic(HInvoke* inst) { in FoldLowestOneBitIntrinsic() argument
529 DCHECK(inst->GetIntrinsic() == Intrinsics::kIntegerLowestOneBit || in FoldLowestOneBitIntrinsic()
530 inst->GetIntrinsic() == Intrinsics::kLongLowestOneBit); in FoldLowestOneBitIntrinsic()
532 HInstruction* input = inst->InputAt(0); in FoldLowestOneBitIntrinsic()
538 if (inst->GetIntrinsic() == Intrinsics::kIntegerLowestOneBit) { in FoldLowestOneBitIntrinsic()
540 inst->ReplaceWith( in FoldLowestOneBitIntrinsic()
544 inst->ReplaceWith( in FoldLowestOneBitIntrinsic()
547 inst->GetBlock()->RemoveInstruction(inst); in FoldLowestOneBitIntrinsic()
550 void HConstantFoldingVisitor::FoldNumberOfLeadingZerosIntrinsic(HInvoke* inst) { in FoldNumberOfLeadingZerosIntrinsic() argument
551 DCHECK(inst->GetIntrinsic() == Intrinsics::kIntegerNumberOfLeadingZeros || in FoldNumberOfLeadingZerosIntrinsic()
552 inst->GetIntrinsic() == Intrinsics::kLongNumberOfLeadingZeros); in FoldNumberOfLeadingZerosIntrinsic()
554 HInstruction* input = inst->InputAt(0); in FoldNumberOfLeadingZerosIntrinsic()
559 DCHECK_IMPLIES(inst->GetIntrinsic() == Intrinsics::kIntegerNumberOfLeadingZeros, in FoldNumberOfLeadingZerosIntrinsic()
561 DCHECK_IMPLIES(inst->GetIntrinsic() == Intrinsics::kLongNumberOfLeadingZeros, in FoldNumberOfLeadingZerosIntrinsic()
567 inst->ReplaceWith(GetGraph()->GetIntConstant(result)); in FoldNumberOfLeadingZerosIntrinsic()
568 inst->GetBlock()->RemoveInstruction(inst); in FoldNumberOfLeadingZerosIntrinsic()
571 void HConstantFoldingVisitor::FoldNumberOfTrailingZerosIntrinsic(HInvoke* inst) { in FoldNumberOfTrailingZerosIntrinsic() argument
572 DCHECK(inst->GetIntrinsic() == Intrinsics::kIntegerNumberOfTrailingZeros || in FoldNumberOfTrailingZerosIntrinsic()
573 inst->GetIntrinsic() == Intrinsics::kLongNumberOfTrailingZeros); in FoldNumberOfTrailingZerosIntrinsic()
575 HInstruction* input = inst->InputAt(0); in FoldNumberOfTrailingZerosIntrinsic()
580 DCHECK_IMPLIES(inst->GetIntrinsic() == Intrinsics::kIntegerNumberOfTrailingZeros, in FoldNumberOfTrailingZerosIntrinsic()
582 DCHECK_IMPLIES(inst->GetIntrinsic() == Intrinsics::kLongNumberOfTrailingZeros, in FoldNumberOfTrailingZerosIntrinsic()
588 inst->ReplaceWith(GetGraph()->GetIntConstant(result)); in FoldNumberOfTrailingZerosIntrinsic()
589 inst->GetBlock()->RemoveInstruction(inst); in FoldNumberOfTrailingZerosIntrinsic()
592 void HConstantFoldingVisitor::VisitArrayLength(HArrayLength* inst) { in VisitArrayLength() argument
593 HInstruction* input = inst->InputAt(0); in VisitArrayLength()
595 DCHECK(inst->IsStringLength()); in VisitArrayLength()
599 inst->ReplaceWith(GetGraph()->GetIntConstant( in VisitArrayLength()
604 void HConstantFoldingVisitor::VisitTypeConversion(HTypeConversion* inst) { in VisitTypeConversion() argument
607 HConstant* constant = inst->TryStaticEvaluation(); in VisitTypeConversion()
609 inst->ReplaceWith(constant); in VisitTypeConversion()
610 inst->GetBlock()->RemoveInstruction(inst); in VisitTypeConversion()
611 } else if (inst->InputAt(0)->IsSelect() && inst->InputAt(0)->HasOnlyOneNonEnvironmentUse()) { in VisitTypeConversion()
614 HSelect* select = inst->InputAt(0)->AsSelect(); in VisitTypeConversion()
615 HConstant* false_constant = inst->TryStaticEvaluation(select->GetFalseValue()); in VisitTypeConversion()
619 HConstant* true_constant = inst->TryStaticEvaluation(select->GetTrueValue()); in VisitTypeConversion()
628 inst->ReplaceWith(select); in VisitTypeConversion()
629 inst->GetBlock()->RemoveInstruction(inst); in VisitTypeConversion()