mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-05 11:46:42 +00:00
Changes for ffs lib call simplification:
* Check for availability of ffsll call in configure script * Support ffs, ffsl, and ffsll conversion to constant value if the argument is constant. llvm-svn: 22027
This commit is contained in:
parent
46de5c99bd
commit
9cd1000c52
@ -484,8 +484,8 @@ dnl=== SECTION 8: Check for specific functions needed
|
|||||||
dnl===
|
dnl===
|
||||||
dnl===-----------------------------------------------------------------------===
|
dnl===-----------------------------------------------------------------------===
|
||||||
|
|
||||||
AC_CHECK_FUNCS([backtrace getcwd getpagesize getrusage gettimeofday isatty ])
|
AC_CHECK_FUNCS([backtrace ffsll getcwd getpagesize getrusage gettimeofday ])
|
||||||
AC_CHECK_FUNCS([mkdtemp mkstemp mktemp ])
|
AC_CHECK_FUNCS([isatty mkdtemp mkstemp mktemp ])
|
||||||
AC_CHECK_FUNCS([realpath sbrk setrlimit strdup strerror strerror_r ])
|
AC_CHECK_FUNCS([realpath sbrk setrlimit strdup strerror strerror_r ])
|
||||||
AC_CHECK_FUNCS([strtoll strtoq sysconf])
|
AC_CHECK_FUNCS([strtoll strtoq sysconf])
|
||||||
AC_C_PRINTF_A
|
AC_C_PRINTF_A
|
||||||
|
5
configure
vendored
5
configure
vendored
@ -27227,7 +27227,7 @@ fi
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
for ac_func in backtrace getcwd getpagesize getrusage gettimeofday isatty
|
for ac_func in backtrace ffsll getcwd getpagesize getrusage gettimeofday
|
||||||
do
|
do
|
||||||
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||||
echo "$as_me:$LINENO: checking for $ac_func" >&5
|
echo "$as_me:$LINENO: checking for $ac_func" >&5
|
||||||
@ -27331,7 +27331,8 @@ done
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
for ac_func in mkdtemp mkstemp mktemp
|
|
||||||
|
for ac_func in isatty mkdtemp mkstemp mktemp
|
||||||
do
|
do
|
||||||
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||||
echo "$as_me:$LINENO: checking for $ac_func" >&5
|
echo "$as_me:$LINENO: checking for $ac_func" >&5
|
||||||
|
@ -1672,6 +1672,80 @@ public:
|
|||||||
}
|
}
|
||||||
} ToAsciiOptimizer;
|
} ToAsciiOptimizer;
|
||||||
|
|
||||||
|
#if defined(HAVE_FFSLL)
|
||||||
|
/// This LibCallOptimization will simplify calls to the "ffs" library
|
||||||
|
/// calls which find the first set bit in an int, long, or long long. The
|
||||||
|
/// optimization is to compute the result at compile time if the argument is
|
||||||
|
/// a constant.
|
||||||
|
/// @brief Simplify the ffs library function.
|
||||||
|
struct FFSOptimization : public LibCallOptimization
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
/// @brief Subclass Constructor
|
||||||
|
FFSOptimization(const char* funcName, const char* description)
|
||||||
|
: LibCallOptimization(funcName, description)
|
||||||
|
{}
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// @brief Default Constructor
|
||||||
|
FFSOptimization() : LibCallOptimization("ffs",
|
||||||
|
"Number of 'ffs' calls simplified") {}
|
||||||
|
|
||||||
|
/// @brief Destructor
|
||||||
|
virtual ~FFSOptimization() {}
|
||||||
|
|
||||||
|
/// @brief Make sure that the "fputs" function has the right prototype
|
||||||
|
virtual bool ValidateCalledFunction(const Function* f, SimplifyLibCalls& SLC)
|
||||||
|
{
|
||||||
|
// Just make sure this has 2 arguments
|
||||||
|
return (f->arg_size() == 1 && f->getReturnType() == Type::IntTy);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Perform the ffs optimization.
|
||||||
|
virtual bool OptimizeCall(CallInst* ci, SimplifyLibCalls& SLC)
|
||||||
|
{
|
||||||
|
if (ConstantInt* CI = dyn_cast<ConstantInt>(ci->getOperand(1)))
|
||||||
|
{
|
||||||
|
// ffs(cnst) -> bit#
|
||||||
|
// ffsl(cnst) -> bit#
|
||||||
|
uint64_t val = CI->getRawValue();
|
||||||
|
int result = ffsll(static_cast<long long>(val));
|
||||||
|
ci->replaceAllUsesWith(ConstantSInt::get(Type::IntTy, result));
|
||||||
|
ci->eraseFromParent();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} FFSOptimizer;
|
||||||
|
|
||||||
|
/// This LibCallOptimization will simplify calls to the "ffsl" library
|
||||||
|
/// calls. It simply uses FFSOptimization for which the transformation is
|
||||||
|
/// identical.
|
||||||
|
/// @brief Simplify the ffsl library function.
|
||||||
|
struct FFSLOptimization : public FFSOptimization
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// @brief Default Constructor
|
||||||
|
FFSLOptimization() : FFSOptimization("ffsl",
|
||||||
|
"Number of 'ffsl' calls simplified") {}
|
||||||
|
|
||||||
|
} FFSLOptimizer;
|
||||||
|
|
||||||
|
/// This LibCallOptimization will simplify calls to the "ffsll" library
|
||||||
|
/// calls. It simply uses FFSOptimization for which the transformation is
|
||||||
|
/// identical.
|
||||||
|
/// @brief Simplify the ffsl library function.
|
||||||
|
struct FFSLLOptimization : public FFSOptimization
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// @brief Default Constructor
|
||||||
|
FFSLLOptimization() : FFSOptimization("ffsll",
|
||||||
|
"Number of 'ffsll' calls simplified") {}
|
||||||
|
|
||||||
|
} FFSLLOptimizer;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/// A function to compute the length of a null-terminated constant array of
|
/// A function to compute the length of a null-terminated constant array of
|
||||||
/// integers. This function can't rely on the size of the constant array
|
/// integers. This function can't rely on the size of the constant array
|
||||||
/// because there could be a null terminator in the middle of the array.
|
/// because there could be a null terminator in the middle of the array.
|
||||||
@ -1788,9 +1862,6 @@ bool getConstantStringLength(Value* V, uint64_t& len, ConstantArray** CA )
|
|||||||
// exp, expf, expl:
|
// exp, expf, expl:
|
||||||
// * exp(log(x)) -> x
|
// * exp(log(x)) -> x
|
||||||
//
|
//
|
||||||
// ffs, ffsl, ffsll:
|
|
||||||
// * ffs(cnst) -> cnst'
|
|
||||||
//
|
|
||||||
// isascii:
|
// isascii:
|
||||||
// * isascii(c) -> ((c & ~0x7f) == 0)
|
// * isascii(c) -> ((c & ~0x7f) == 0)
|
||||||
//
|
//
|
||||||
|
Loading…
x
Reference in New Issue
Block a user