Skip to content

Commit 88e8bae

Browse files
committed
Vectorize Vector API intrisics if operands are known
- check if any of operands have known vector type - vectorize if such operand is found
1 parent 0da6158 commit 88e8bae

File tree

1 file changed

+16
-17
lines changed

1 file changed

+16
-17
lines changed

runtime/compiler/optimizer/VectorAPIExpansion.cpp

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ TR_VectorAPIExpansion::perform()
6565
}
6666

6767
bool
68-
TR_VectorAPIExpansion::isVectorAPIMethod(TR::MethodSymbol * methodSymbol)
68+
TR_VectorAPIExpansion::isVectorAPIMethod(TR::MethodSymbol *methodSymbol)
6969
{
7070
TR::RecognizedMethod index = methodSymbol->getRecognizedMethod();
7171

@@ -74,7 +74,7 @@ TR_VectorAPIExpansion::isVectorAPIMethod(TR::MethodSymbol * methodSymbol)
7474
}
7575

7676
TR_VectorAPIExpansion::vapiObjType
77-
TR_VectorAPIExpansion::getReturnType(TR::MethodSymbol * methodSymbol)
77+
TR_VectorAPIExpansion::getReturnType(TR::MethodSymbol *methodSymbol)
7878
{
7979
if (!isVectorAPIMethod(methodSymbol)) return Unknown;
8080

@@ -84,7 +84,7 @@ TR_VectorAPIExpansion::getReturnType(TR::MethodSymbol * methodSymbol)
8484
}
8585

8686
TR_VectorAPIExpansion::vapiObjType
87-
TR_VectorAPIExpansion::getArgumentType(TR::MethodSymbol * methodSymbol, int32_t i)
87+
TR_VectorAPIExpansion::getArgumentType(TR::MethodSymbol *methodSymbol, int32_t i)
8888
{
8989
TR_ASSERT_FATAL(i < _maxNumberArguments, "Wrong argument index");
9090

@@ -367,7 +367,7 @@ TR_VectorAPIExpansion::visitNodeToBuildVectorAliases(TR::Node *node, bool verify
367367
}
368368
else if (opCode.isFunctionCall())
369369
{
370-
TR::MethodSymbol * methodSymbol = node->getSymbolReference()->getSymbol()->castToMethodSymbol();
370+
TR::MethodSymbol *methodSymbol = node->getSymbolReference()->getSymbol()->castToMethodSymbol();
371371
TR::DataType methodElementType = TR::NoType;
372372
int32_t methodNumLanes = 0;
373373
int32_t methodRefNum = node->getSymbolReference()->getReferenceNumber();
@@ -665,7 +665,7 @@ TR_VectorAPIExpansion::visitNodeToBuildVectorAliases(TR::Node *node, bool verify
665665
bool scalarResult = false;
666666
if (child->getOpCode().isFunctionCall())
667667
{
668-
TR::MethodSymbol * methodSymbol = child->getSymbolReference()->getSymbol()->castToMethodSymbol();
668+
TR::MethodSymbol *methodSymbol = child->getSymbolReference()->getSymbol()->castToMethodSymbol();
669669
if (getReturnType(methodSymbol) == Scalar) continue; // OK to use by any other parent node
670670
}
671671

@@ -712,7 +712,7 @@ TR_VectorAPIExpansion::visitNodeToBuildVectorAliases(TR::Node *node, bool verify
712712

713713
void
714714
TR_VectorAPIExpansion::findAllAliases(int32_t classId, int32_t id,
715-
TR_BitVector * vectorAliasTableElement::* aliasesField,
715+
TR_BitVector *vectorAliasTableElement::* aliasesField,
716716
int32_t vectorAliasTableElement::* classField)
717717
{
718718
bool tempAliases = &vectorAliasTableElement::_tempAliases == aliasesField;
@@ -788,7 +788,7 @@ TR_VectorAPIExpansion::buildAliasClasses()
788788

789789
int32_t symRefCount = comp()->getSymRefTab()->getNumSymRefs();
790790

791-
TR_BitVector * vectorAliasTableElement::* aliasesField = &vectorAliasTableElement::_aliases;
791+
TR_BitVector *vectorAliasTableElement::* aliasesField = &vectorAliasTableElement::_aliases;
792792
int32_t vectorAliasTableElement::* classField = &vectorAliasTableElement::_classId;
793793

794794
for (int32_t i = 0; i < symRefCount; i++)
@@ -960,7 +960,7 @@ TR_VectorAPIExpansion::findVectorMethods(TR::Compilation *comp)
960960

961961
if (opCode.isFunctionCall())
962962
{
963-
TR::MethodSymbol * methodSymbol = node->getSymbolReference()->getSymbol()->castToMethodSymbol();
963+
TR::MethodSymbol *methodSymbol = node->getSymbolReference()->getSymbol()->castToMethodSymbol();
964964

965965
if (isVectorAPIMethod(methodSymbol))
966966
{
@@ -1085,7 +1085,7 @@ TR_VectorAPIExpansion::validateSymRef(int32_t id, int32_t i, vec_sz_t &classLeng
10851085

10861086

10871087
void
1088-
TR_VectorAPIExpansion::validateVectorAliasClasses(TR_BitVector * vectorAliasTableElement::* aliasesField,
1088+
TR_VectorAPIExpansion::validateVectorAliasClasses(TR_BitVector *vectorAliasTableElement::* aliasesField,
10891089
int32_t vectorAliasTableElement::* classField)
10901090
{
10911091
bool tempClasses = &vectorAliasTableElement::_tempAliases == aliasesField;
@@ -1666,42 +1666,41 @@ TR_VectorAPIExpansion::transformIL(bool checkBoxing)
16661666
continue;
16671667

16681668
bool scalarized;
1669-
bool vectorizedOrScalarizedNode;
16701669
TR::DataType elementType;
16711670
int32_t bitsLength;
16721671
vapiObjType objectType;
16731672

1674-
vectorizedOrScalarizedNode = isVectorizedOrScalarizedNode(node, elementType, bitsLength, objectType, scalarized);
1673+
bool vectorizedOrScalarizedNode = isVectorizedOrScalarizedNode(node, elementType, bitsLength, objectType, scalarized);
16751674

16761675
// Vectorize intrinsic if its operands are known
16771676
if (boxingAllowed() &&
16781677
!vectorizedOrScalarizedNode &&
16791678
opCode.isFunctionCall())
16801679
{
1681-
TR::MethodSymbol * methodSymbol = node->getSymbolReference()->getSymbol()->castToMethodSymbol();
1680+
TR::MethodSymbol *methodSymbol = node->getSymbolReference()->getSymbol()->castToMethodSymbol();
16821681
if (isVectorAPIMethod(methodSymbol))
16831682
{
16841683
if (methodSymbol->getRecognizedMethod() == TR::jdk_internal_vm_vector_VectorSupport_compare)
16851684
{
1685+
// compare has 2 operands that we can use
16861686
for (int i = 0; i < 2; i++)
16871687
{
1688-
TR::Node* operand = node->getChild(getFirstOperandIndex(methodSymbol) + i);
1688+
TR::Node *operand = node->getChild(getFirstOperandIndex(methodSymbol) + i);
16891689

1690-
bool operandVectorizedOrScalarized;
16911690
bool operandScalarized;
16921691
TR::DataType operandElementType;
16931692
int32_t operandBitsLength;
16941693
vapiObjType operandObjectType;
16951694

1696-
operandVectorizedOrScalarized = isVectorizedOrScalarizedNode(operand, operandElementType, operandBitsLength,
1695+
bool operandVectorizedOrScalarized = isVectorizedOrScalarizedNode(operand, operandElementType, operandBitsLength,
16971696
operandObjectType, operandScalarized);
16981697

16991698
if (operandVectorizedOrScalarized &&
17001699
!operandScalarized)
17011700
{
1702-
TR::MethodSymbol * methodSymbol = node->getSymbolReference()->getSymbol()->castToMethodSymbol();
1701+
TR::MethodSymbol *methodSymbol = node->getSymbolReference()->getSymbol()->castToMethodSymbol();
17031702
TR::RecognizedMethod index = methodSymbol->getRecognizedMethod();
1704-
int32_t handlerIndex = index - _firstMethod;
1703+
int32_t handlerIndex = static_cast <int32_t>(index) - _firstMethod;
17051704

17061705
TR::VectorLength operandVectorLength = OMR::DataType::bitsToVectorLength(operandBitsLength);
17071706
int32_t operandElementSize = OMR::DataType::getSize(operandElementType);

0 commit comments

Comments
 (0)