forked from OSchip/llvm-project
Teach SimplifyLibCalls to fold memcmp calls with constant arguments.
llvm-svn: 86141
This commit is contained in:
parent
65ae200a13
commit
b971445ab7
|
@ -955,6 +955,17 @@ struct MemCmpOpt : public LibCallOptimization {
|
||||||
return B.CreateZExt(B.CreateXor(LHSV, RHSV, "shortdiff"), CI->getType());
|
return B.CreateZExt(B.CreateXor(LHSV, RHSV, "shortdiff"), CI->getType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Constant folding: memcmp(x, y, l) -> cnst (all arguments are constant)
|
||||||
|
std::string LHSStr, RHSStr;
|
||||||
|
if (GetConstantStringInfo(LHS, LHSStr) &&
|
||||||
|
GetConstantStringInfo(RHS, RHSStr)) {
|
||||||
|
// Make sure we're not reading out-of-bounds memory.
|
||||||
|
if (Len > LHSStr.length() || Len > RHSStr.length())
|
||||||
|
return 0;
|
||||||
|
uint64_t Ret = memcmp(LHSStr.data(), RHSStr.data(), Len);
|
||||||
|
return ConstantInt::get(CI->getType(), Ret);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -2479,10 +2490,6 @@ bool SimplifyLibCalls::doInitialization(Module &M) {
|
||||||
// lround, lroundf, lroundl:
|
// lround, lroundf, lroundl:
|
||||||
// * lround(cnst) -> cnst'
|
// * lround(cnst) -> cnst'
|
||||||
//
|
//
|
||||||
// memcmp:
|
|
||||||
// * memcmp(x,y,l) -> cnst
|
|
||||||
// (if all arguments are constant and strlen(x) <= l and strlen(y) <= l)
|
|
||||||
//
|
|
||||||
// pow, powf, powl:
|
// pow, powf, powl:
|
||||||
// * pow(exp(x),y) -> exp(x*y)
|
// * pow(exp(x),y) -> exp(x*y)
|
||||||
// * pow(sqrt(x),y) -> pow(x,y*0.5)
|
// * pow(sqrt(x),y) -> pow(x,y*0.5)
|
||||||
|
|
|
@ -17,6 +17,10 @@ define void @test(i8* %P, i8* %Q, i32 %N, i32* %IP, i1* %BP) {
|
||||||
%D = call i32 @memcmp( i8* %P, i8* %Q, i32 2 ) ; <i32> [#uses=1]
|
%D = call i32 @memcmp( i8* %P, i8* %Q, i32 2 ) ; <i32> [#uses=1]
|
||||||
%E = icmp eq i32 %D, 0 ; <i1> [#uses=1]
|
%E = icmp eq i32 %D, 0 ; <i1> [#uses=1]
|
||||||
volatile store i1 %E, i1* %BP
|
volatile store i1 %E, i1* %BP
|
||||||
|
%F = call i32 @memcmp(i8* getelementptr ([4 x i8]* @hel, i32 0, i32 0),
|
||||||
|
i8* getelementptr ([8 x i8]* @hello_u, i32 0, i32 0),
|
||||||
|
i32 3)
|
||||||
|
volatile store i32 %F, i32* %IP
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue