|
1 | 1 | /*========================== begin_copyright_notice ============================ |
2 | 2 |
|
3 | | -Copyright (C) 2017-2024 Intel Corporation |
| 3 | +Copyright (C) 2017-2025 Intel Corporation |
4 | 4 |
|
5 | 5 | SPDX-License-Identifier: MIT |
6 | 6 |
|
@@ -979,57 +979,63 @@ void ScalarizeFunction::visitShuffleVectorInst(ShuffleVectorInst& SI) |
979 | 979 | m_removedInsts.insert(&SI); |
980 | 980 | } |
981 | 981 |
|
982 | | -void ScalarizeFunction::visitCallInst(CallInst& CI) |
| 982 | +void ScalarizeFunction::ScalarizeIntrinsic(IntrinsicInst &II) |
983 | 983 | { |
984 | | - V_PRINT(scalarizer, "\t\tCall instruction\n"); |
985 | | - IGC_ASSERT_MESSAGE(&CI, "instruction type dynamic cast failed"); |
| 984 | + auto* InstType = dyn_cast<IGCLLVM::FixedVectorType>(II.getType()); |
| 985 | + if (!InstType) { |
| 986 | + recoverNonScalarizableInst(&II); |
| 987 | + return; |
| 988 | + } |
986 | 989 |
|
987 | | - Function* CalledFunc = CI.getCalledFunction(); |
988 | | - if (CalledFunc && CalledFunc->getName().startswith("llvm.fshl")) |
989 | | - { |
990 | | - V_PRINT(scalarizer, "\t\tScalarizing fshl intrinsic\n"); |
| 990 | + SCMEntry* NewEntry = getSCMEntry(&II); |
991 | 991 |
|
992 | | - IGCLLVM::FixedVectorType* instType = dyn_cast<IGCLLVM::FixedVectorType>(CI.getType()); |
993 | | - if (!instType) { |
994 | | - recoverNonScalarizableInst(&CI); |
995 | | - return; |
996 | | - } |
| 992 | + unsigned NumElements = int_cast<unsigned>(InstType->getNumElements()); |
| 993 | + unsigned NumOperands = II.arg_size(); |
997 | 994 |
|
998 | | - SCMEntry* newEntry = getSCMEntry(&CI); |
| 995 | + SmallVector<SmallVector<Value*, MAX_INPUT_VECTOR_WIDTH>, MAX_INTRINSIC_OPERANDS> Operands(NumOperands); |
| 996 | + SmallVector<bool, MAX_INTRINSIC_OPERANDS> IsOpConst(NumOperands); |
999 | 997 |
|
1000 | | - unsigned numElements = int_cast<unsigned>(instType->getNumElements()); |
| 998 | + for(unsigned i = 0; i < NumOperands; i++) |
| 999 | + obtainScalarizedValues(Operands[i], &IsOpConst[i], II.getOperand(i), II); |
1001 | 1000 |
|
1002 | | - SmallVector<Value*, MAX_INPUT_VECTOR_WIDTH> operand0; |
1003 | | - SmallVector<Value*, MAX_INPUT_VECTOR_WIDTH> operand1; |
1004 | | - SmallVector<Value*, MAX_INPUT_VECTOR_WIDTH> operand2; |
1005 | | - bool op0IsConst, op1IsConst, op2IsConst; |
| 1001 | + SmallVector<Value*, MAX_INPUT_VECTOR_WIDTH> NewScalarizedInsts(NumElements); |
| 1002 | + for (unsigned i = 0; i < NumElements; i++) |
| 1003 | + { |
| 1004 | + Type* ScalarType = Operands[0][i]->getType(); |
1006 | 1005 |
|
1007 | | - obtainScalarizedValues(operand0, &op0IsConst, CI.getOperand(0), CI); |
1008 | | - obtainScalarizedValues(operand1, &op1IsConst, CI.getOperand(1), CI); |
1009 | | - obtainScalarizedValues(operand2, &op2IsConst, CI.getOperand(2), CI); |
| 1006 | + SmallVector<Value*, MAX_INTRINSIC_OPERANDS> ScalarOperands(NumOperands); |
| 1007 | + for(unsigned j = 0; j < NumOperands; j++) |
| 1008 | + ScalarOperands[j] = Operands[j][i]; |
1010 | 1009 |
|
1011 | | - SmallVector<Value*, MAX_INPUT_VECTOR_WIDTH> newScalarizedInsts; |
1012 | | - newScalarizedInsts.resize(numElements); |
1013 | | - for (unsigned i = 0; i < numElements; i++) |
1014 | | - { |
1015 | | - Type* scalarType = operand0[i]->getType(); |
1016 | | - CallInst* scalarFshl = CallInst::Create( |
1017 | | - Intrinsic::getDeclaration(CI.getModule(), Intrinsic::fshl, { scalarType }), |
1018 | | - { operand0[i], operand1[i], operand2[i] }, |
1019 | | - CI.getName() + ".scalar", |
1020 | | - &CI |
1021 | | - ); |
1022 | | - scalarFshl->copyMetadata(CI); |
1023 | | - newScalarizedInsts[i] = scalarFshl; |
1024 | | - } |
| 1010 | + auto* ScalarIntr = CallInst::Create( |
| 1011 | + Intrinsic::getDeclaration(II.getModule(), II.getIntrinsicID(), { ScalarType }), |
| 1012 | + ScalarOperands, |
| 1013 | + II.getName() + ".scalar", |
| 1014 | + &II |
| 1015 | + ); |
| 1016 | + ScalarIntr->copyMetadata(II); |
| 1017 | + NewScalarizedInsts[i] = ScalarIntr; |
| 1018 | + } |
1025 | 1019 |
|
1026 | | - updateSCMEntryWithValues(newEntry, &(newScalarizedInsts[0]), &CI, true); |
| 1020 | + updateSCMEntryWithValues(NewEntry, &(NewScalarizedInsts[0]), &II, true); |
1027 | 1021 |
|
1028 | | - m_removedInsts.insert(&CI); |
1029 | | - } |
1030 | | - else |
| 1022 | + m_removedInsts.insert(&II); |
| 1023 | +} |
| 1024 | + |
| 1025 | +void ScalarizeFunction::visitIntrinsicInst(IntrinsicInst &II) |
| 1026 | +{ |
| 1027 | + switch (II.getIntrinsicID()) |
1031 | 1028 | { |
1032 | | - recoverNonScalarizableInst(&CI); |
| 1029 | + case Intrinsic::fshl: |
| 1030 | + case Intrinsic::smin: |
| 1031 | + case Intrinsic::smax: |
| 1032 | + case Intrinsic::umin: |
| 1033 | + case Intrinsic::umax: |
| 1034 | + ScalarizeIntrinsic(II); |
| 1035 | + break; |
| 1036 | + default: |
| 1037 | + recoverNonScalarizableInst(&II); |
| 1038 | + break; |
1033 | 1039 | } |
1034 | 1040 | } |
1035 | 1041 |
|
|
0 commit comments