@@ -983,77 +983,53 @@ Value *llvm::createSimpleTargetReduction(IRBuilderBase &Builder,
983
983
RecurKind RdxKind,
984
984
ArrayRef<Value *> RedOps) {
985
985
TargetTransformInfo::ReductionFlags RdxFlags;
986
- RdxFlags.IsMaxOp = RdxKind == RecurKind::SMax ||
987
- RdxKind == RecurKind::UMax ||
986
+ RdxFlags.IsMaxOp = RdxKind == RecurKind::SMax || RdxKind == RecurKind::UMax ||
988
987
RdxKind == RecurKind::FMax;
989
988
RdxFlags.IsSigned = RdxKind == RecurKind::SMax || RdxKind == RecurKind::SMin;
990
989
if (!ForceReductionIntrinsic &&
991
990
!TTI->useReductionIntrinsic (Opcode, Src->getType (), RdxFlags))
992
991
return getShuffleReduction (Builder, Src, Opcode, RdxKind, RedOps);
993
992
994
- auto *SrcVTy = cast<VectorType>(Src->getType ());
995
-
996
- std::function<Value *()> BuildFunc;
993
+ auto *SrcVecEltTy = cast<VectorType>(Src->getType ())->getElementType ();
997
994
switch (Opcode) {
998
995
case Instruction::Add:
999
- BuildFunc = [&]() { return Builder.CreateAddReduce (Src); };
1000
- break ;
996
+ return Builder.CreateAddReduce (Src);
1001
997
case Instruction::Mul:
1002
- BuildFunc = [&]() { return Builder.CreateMulReduce (Src); };
1003
- break ;
998
+ return Builder.CreateMulReduce (Src);
1004
999
case Instruction::And:
1005
- BuildFunc = [&]() { return Builder.CreateAndReduce (Src); };
1006
- break ;
1000
+ return Builder.CreateAndReduce (Src);
1007
1001
case Instruction::Or:
1008
- BuildFunc = [&]() { return Builder.CreateOrReduce (Src); };
1009
- break ;
1002
+ return Builder.CreateOrReduce (Src);
1010
1003
case Instruction::Xor:
1011
- BuildFunc = [&]() { return Builder.CreateXorReduce (Src); };
1012
- break ;
1004
+ return Builder.CreateXorReduce (Src);
1013
1005
case Instruction::FAdd:
1014
- BuildFunc = [&]() {
1015
- auto Rdx = Builder.CreateFAddReduce (
1016
- ConstantFP::getNegativeZero (SrcVTy->getElementType ()), Src);
1017
- return Rdx;
1018
- };
1019
- break ;
1006
+ return Builder.CreateFAddReduce (ConstantFP::getNegativeZero (SrcVecEltTy),
1007
+ Src);
1020
1008
case Instruction::FMul:
1021
- BuildFunc = [&]() {
1022
- Type *Ty = SrcVTy->getElementType ();
1023
- auto Rdx = Builder.CreateFMulReduce (ConstantFP::get (Ty, 1.0 ), Src);
1024
- return Rdx;
1025
- };
1026
- break ;
1009
+ return Builder.CreateFMulReduce (ConstantFP::get (SrcVecEltTy, 1.0 ), Src);
1027
1010
case Instruction::ICmp:
1028
1011
switch (RdxKind) {
1029
1012
case RecurKind::SMax:
1030
- BuildFunc = [&]() { return Builder.CreateIntMaxReduce (Src, true ); };
1031
- break ;
1013
+ return Builder.CreateIntMaxReduce (Src, true );
1032
1014
case RecurKind::SMin:
1033
- BuildFunc = [&]() { return Builder.CreateIntMinReduce (Src, true ); };
1034
- break ;
1015
+ return Builder.CreateIntMinReduce (Src, true );
1035
1016
case RecurKind::UMax:
1036
- BuildFunc = [&]() { return Builder.CreateIntMaxReduce (Src, false ); };
1037
- break ;
1017
+ return Builder.CreateIntMaxReduce (Src, false );
1038
1018
case RecurKind::UMin:
1039
- BuildFunc = [&]() { return Builder.CreateIntMinReduce (Src, false ); };
1040
- break ;
1019
+ return Builder.CreateIntMinReduce (Src, false );
1041
1020
default :
1042
1021
llvm_unreachable (" Unexpected min/max reduction type" );
1043
1022
}
1044
- break ;
1045
1023
case Instruction::FCmp:
1046
1024
assert ((RdxKind == RecurKind::FMax || RdxKind == RecurKind::FMin) &&
1047
1025
" Unexpected min/max reduction type" );
1048
1026
if (RdxKind == RecurKind::FMax)
1049
- BuildFunc = [&]() { return Builder.CreateFPMaxReduce (Src); } ;
1027
+ return Builder.CreateFPMaxReduce (Src);
1050
1028
else
1051
- BuildFunc = [&]() { return Builder.CreateFPMinReduce (Src); };
1052
- break ;
1029
+ return Builder.CreateFPMinReduce (Src);
1053
1030
default :
1054
1031
llvm_unreachable (" Unhandled opcode" );
1055
1032
}
1056
- return BuildFunc ();
1057
1033
}
1058
1034
1059
1035
Value *llvm::createTargetReduction (IRBuilderBase &B,
0 commit comments