Index: llvm/trunk/lib/Analysis/ConstantFolding.cpp =================================================================== --- llvm/trunk/lib/Analysis/ConstantFolding.cpp +++ llvm/trunk/lib/Analysis/ConstantFolding.cpp @@ -25,6 +25,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/ValueTracking.h" +#include "llvm/Analysis/VectorUtils.h" #include "llvm/Config/config.h" #include "llvm/IR/Constant.h" #include "llvm/IR/Constants.h" @@ -1649,7 +1650,8 @@ return false; } -static Constant *ConstantFoldScalarCall1(StringRef Name, unsigned IntrinsicID, +static Constant *ConstantFoldScalarCall1(StringRef Name, + Intrinsic::ID IntrinsicID, Type *Ty, ArrayRef Operands, const TargetLibraryInfo *TLI, @@ -1943,7 +1945,8 @@ return nullptr; } -static Constant *ConstantFoldScalarCall2(StringRef Name, unsigned IntrinsicID, +static Constant *ConstantFoldScalarCall2(StringRef Name, + Intrinsic::ID IntrinsicID, Type *Ty, ArrayRef Operands, const TargetLibraryInfo *TLI, @@ -2172,7 +2175,8 @@ return nullptr; } -static Constant *ConstantFoldScalarCall3(StringRef Name, unsigned IntrinsicID, +static Constant *ConstantFoldScalarCall3(StringRef Name, + Intrinsic::ID IntrinsicID, Type *Ty, ArrayRef Operands, const TargetLibraryInfo *TLI, @@ -2270,7 +2274,8 @@ return nullptr; } -static Constant *ConstantFoldScalarCall(StringRef Name, unsigned IntrinsicID, +static Constant *ConstantFoldScalarCall(StringRef Name, + Intrinsic::ID IntrinsicID, Type *Ty, ArrayRef Operands, const TargetLibraryInfo *TLI, @@ -2287,7 +2292,8 @@ return nullptr; } -static Constant *ConstantFoldVectorCall(StringRef Name, unsigned IntrinsicID, +static Constant *ConstantFoldVectorCall(StringRef Name, + Intrinsic::ID IntrinsicID, VectorType *VTy, ArrayRef Operands, const DataLayout &DL, @@ -2339,17 +2345,8 @@ for (unsigned I = 0, E = VTy->getNumElements(); I != E; ++I) { // Gather a column of constants. for (unsigned J = 0, JE = Operands.size(); J != JE; ++J) { - // These intrinsics use a scalar type for their second argument. - if (J == 1 && - (IntrinsicID == Intrinsic::cttz || IntrinsicID == Intrinsic::ctlz || - IntrinsicID == Intrinsic::powi)) { - Lane[J] = Operands[J]; - continue; - } - // These intrinsics use a scalar type for their third argument. - if (J == 2 && - (IntrinsicID == Intrinsic::smul_fix || - IntrinsicID == Intrinsic::smul_fix_sat)) { + // Some intrinsics use a scalar type for certain arguments. + if (hasVectorInstrinsicScalarOpd(IntrinsicID, J)) { Lane[J] = Operands[J]; continue; }