summaryrefslogtreecommitdiff
path: root/compiler/optimizing/constant_folding.cc
diff options
context:
space:
mode:
author Santiago Aboy Solanes <solanes@google.com> 2023-11-16 15:34:48 +0000
committer Santiago Aboy Solanes <solanes@google.com> 2023-11-28 12:09:14 +0000
commit003cf923787b50ffc92bdf27a01f5331d094094d (patch)
tree0f798a9f3e781a273f101a778e311591f539bdd0 /compiler/optimizing/constant_folding.cc
parentdf85b459bc4119a4e280eabb2caff3405074d4d8 (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.cc25
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);