diff options
author | 2023-11-16 15:34:48 +0000 | |
---|---|---|
committer | 2023-11-28 12:09:14 +0000 | |
commit | 003cf923787b50ffc92bdf27a01f5331d094094d (patch) | |
tree | 0f798a9f3e781a273f101a778e311591f539bdd0 /compiler/optimizing/constant_folding.cc | |
parent | df85b459bc4119a4e280eabb2caff3405074d4d8 (diff) |
Constant fold BitCount intrinsic
Bug: 309886589
Test: art/test/testrunner/testrunner.py --host --64 -b --optimizing
Change-Id: Id0db658e1139886b7bffd63431a7cd2d4c75506d
Diffstat (limited to 'compiler/optimizing/constant_folding.cc')
-rw-r--r-- | compiler/optimizing/constant_folding.cc | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/compiler/optimizing/constant_folding.cc b/compiler/optimizing/constant_folding.cc index e2bfffb8ec..29f5d5caee 100644 --- a/compiler/optimizing/constant_folding.cc +++ b/compiler/optimizing/constant_folding.cc @@ -59,6 +59,7 @@ class HConstantFoldingVisitor final : public HGraphDelegateVisitor { // Intrinsics foldings void FoldReverseIntrinsic(HInvoke* invoke); void FoldReverseBytesIntrinsic(HInvoke* invoke); + void FoldBitCountIntrinsic(HInvoke* invoke); void FoldHighestOneBitIntrinsic(HInvoke* invoke); void FoldLowestOneBitIntrinsic(HInvoke* invoke); void FoldNumberOfLeadingZerosIntrinsic(HInvoke* invoke); @@ -374,6 +375,10 @@ void HConstantFoldingVisitor::VisitInvoke(HInvoke* inst) { case Intrinsics::kShortReverseBytes: FoldReverseBytesIntrinsic(inst); break; + case Intrinsics::kIntegerBitCount: + case Intrinsics::kLongBitCount: + FoldBitCountIntrinsic(inst); + break; case Intrinsics::kIntegerHighestOneBit: case Intrinsics::kLongHighestOneBit: FoldHighestOneBitIntrinsic(inst); @@ -442,6 +447,26 @@ void HConstantFoldingVisitor::FoldReverseBytesIntrinsic(HInvoke* inst) { inst->GetBlock()->RemoveInstruction(inst); } +void HConstantFoldingVisitor::FoldBitCountIntrinsic(HInvoke* inst) { + DCHECK(inst->GetIntrinsic() == Intrinsics::kIntegerBitCount || + inst->GetIntrinsic() == Intrinsics::kLongBitCount); + + HInstruction* input = inst->InputAt(0); + if (!input->IsConstant()) { + return; + } + + DCHECK_IMPLIES(inst->GetIntrinsic() == Intrinsics::kIntegerBitCount, input->IsIntConstant()); + DCHECK_IMPLIES(inst->GetIntrinsic() == Intrinsics::kLongBitCount, input->IsLongConstant()); + + // Note that both the Integer and Long intrinsics return an int as a result. + int result = inst->GetIntrinsic() == Intrinsics::kIntegerBitCount ? + POPCOUNT(input->AsIntConstant()->GetValue()) : + POPCOUNT(input->AsLongConstant()->GetValue()); + inst->ReplaceWith(GetGraph()->GetIntConstant(result)); + inst->GetBlock()->RemoveInstruction(inst); +} + void HConstantFoldingVisitor::FoldHighestOneBitIntrinsic(HInvoke* inst) { DCHECK(inst->GetIntrinsic() == Intrinsics::kIntegerHighestOneBit || inst->GetIntrinsic() == Intrinsics::kLongHighestOneBit); |