aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp4
-rw-r--r--llvm/include/llvm/Analysis/ValueTracking.h2
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp7
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp4
-rw-r--r--llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp2
-rw-r--r--llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp2
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp2
-rw-r--r--llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp12
-rw-r--r--llvm/lib/Transforms/Utils/AMDGPUEmitPrintf.cpp4
-rw-r--r--llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp103
10 files changed, 96 insertions, 46 deletions
diff --git a/clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp b/clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp
index f09b3b9..b7b6563 100644
--- a/clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp
+++ b/clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp
@@ -226,7 +226,7 @@ void CodeGenFunction::ProcessOrderScopeAMDGCN(Value *Order, Value *Scope,
// Some of the atomic builtins take the scope as a string name.
StringRef scp;
- if (llvm::getConstantStringInfo(Scope, scp)) {
+ if (llvm::getConstantStringInfo(Scope, scp, /*CharWidth=*/8)) {
SSID = getLLVMContext().getOrInsertSyncScopeID(scp);
return;
}
@@ -281,7 +281,7 @@ void CodeGenFunction::AddAMDGPUFenceAddressSpaceMMRA(llvm::Instruction *Inst,
for (unsigned K = 2; K < E->getNumArgs(); ++K) {
llvm::Value *V = EmitScalarExpr(E->getArg(K));
StringRef AS;
- if (llvm::getConstantStringInfo(V, AS)) {
+ if (llvm::getConstantStringInfo(V, AS, /*CharWidth=*/8)) {
MMRAs.push_back({Tag, AS});
// TODO: Delete the resulting unused constant?
continue;
diff --git a/llvm/include/llvm/Analysis/ValueTracking.h b/llvm/include/llvm/Analysis/ValueTracking.h
index 02990a3..e6fb3cb 100644
--- a/llvm/include/llvm/Analysis/ValueTracking.h
+++ b/llvm/include/llvm/Analysis/ValueTracking.h
@@ -404,7 +404,7 @@ LLVM_ABI bool getConstantDataArrayInfo(const Value *V,
/// trailing null characters as well as any other characters that come after
/// it.
LLVM_ABI bool getConstantStringInfo(const Value *V, StringRef &Str,
- bool TrimAtNul = true);
+ unsigned CharWidth, bool TrimAtNul = true);
/// If we can compute the length of the string pointed to by the specified
/// pointer, return 'len+1'. If we can't, return 0.
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 858d79b..ed202b8 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -6457,9 +6457,12 @@ bool llvm::getConstantDataArrayInfo(const Value *V,
/// return true. When TrimAtNul is set, Str will contain only the bytes up
/// to but not including the first nul. Return false on failure.
bool llvm::getConstantStringInfo(const Value *V, StringRef &Str,
- bool TrimAtNul) {
+ unsigned CharWidth, bool TrimAtNul) {
+ if (CharWidth != CHAR_BIT)
+ return false;
+
ConstantDataArraySlice Slice;
- if (!getConstantDataArrayInfo(V, Slice, 8))
+ if (!getConstantDataArrayInfo(V, Slice, CharWidth))
return false;
if (Slice.Array == nullptr) {
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp b/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
index 7a2a7fc..471dfbc 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
@@ -121,7 +121,7 @@ static_assert(NonLiteralStr.size() == 3);
static StringRef getAsConstantStr(Value *V) {
StringRef S;
- if (!getConstantStringInfo(V, S))
+ if (!getConstantStringInfo(V, S, /*CharWidth=*/8))
S = NonLiteralStr;
return S;
@@ -154,7 +154,7 @@ bool AMDGPUPrintfRuntimeBindingImpl::lowerPrintfForGpu(Module &M) {
Value *Op = CI->getArgOperand(0);
StringRef FormatStr;
- if (!getConstantStringInfo(Op, FormatStr)) {
+ if (!getConstantStringInfo(Op, FormatStr, /*CharWidth=*/8)) {
Value *Stripped = Op->stripPointerCasts();
if (!isa<UndefValue>(Stripped) && !isa<ConstantPointerNull>(Stripped))
diagnoseInvalidFormatString(CI);
diff --git a/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp b/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp
index 1ebfde2..d76ce52 100644
--- a/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp
@@ -591,7 +591,7 @@ void SPIRVAsmPrinter::outputAnnotations(const Module &M) {
cast<GlobalVariable>(CS->getOperand(1)->stripPointerCasts());
StringRef AnnotationString;
- getConstantStringInfo(GV, AnnotationString);
+ getConstantStringInfo(GV, AnnotationString, /*CharWidth=*/8);
MCInst Inst;
Inst.setOpcode(SPIRV::OpDecorate);
Inst.addOperand(MCOperand::createReg(Reg));
diff --git a/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp b/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp
index 2bffbf7..ede852a 100644
--- a/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp
@@ -159,7 +159,7 @@ static std::string getAnnotation(Value *AnnoVal, Value *OptAnnoVal) {
std::string Anno;
if (auto *C = dyn_cast_or_null<Constant>(AnnoVal)) {
StringRef Str;
- if (getConstantStringInfo(C, Str))
+ if (getConstantStringInfo(C, Str, /*CharWidth=*/8))
Anno = Str;
}
// handle optional annotation parameter in a way that Khronos Translator do
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
index 1bf070e..1f5903b 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
@@ -580,7 +580,7 @@ void WebAssemblyAsmPrinter::EmitFunctionAttributes(Module &M) {
// The second field is a pointer to a global annotation string.
auto *GV = cast<GlobalVariable>(CS->getOperand(1)->stripPointerCasts());
StringRef AnnotationString;
- getConstantStringInfo(GV, AnnotationString);
+ getConstantStringInfo(GV, AnnotationString, /*CharWidth=*/8);
auto *Sym = cast<MCSymbolWasm>(getSymbol(F));
CustomSections[AnnotationString].push_back(Sym);
}
diff --git a/llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp b/llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
index 8c156c9..fc3aac1 100644
--- a/llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
+++ b/llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp
@@ -1036,6 +1036,8 @@ private:
/// handled by the instcombine pass.
///
bool StrNCmpInliner::optimizeStrNCmp() {
+ unsigned CharWidth = DL.getByteWidth();
+
if (StrNCmpInlineThreshold < 2)
return false;
@@ -1049,8 +1051,10 @@ bool StrNCmpInliner::optimizeStrNCmp() {
return false;
StringRef Str1, Str2;
- bool HasStr1 = getConstantStringInfo(Str1P, Str1, /*TrimAtNul=*/false);
- bool HasStr2 = getConstantStringInfo(Str2P, Str2, /*TrimAtNul=*/false);
+ bool HasStr1 =
+ getConstantStringInfo(Str1P, Str1, CharWidth, /*TrimAtNul=*/false);
+ bool HasStr2 =
+ getConstantStringInfo(Str2P, Str2, CharWidth, /*TrimAtNul=*/false);
if (HasStr1 == HasStr2)
return false;
@@ -1180,12 +1184,14 @@ void StrNCmpInliner::inlineCompare(Value *LHS, StringRef RHS, uint64_t N,
/// Convert memchr with a small constant string into a switch
static bool foldMemChr(CallInst *Call, DomTreeUpdater *DTU,
const DataLayout &DL) {
+ unsigned CharWidth = DL.getByteWidth();
+
if (isa<Constant>(Call->getArgOperand(1)))
return false;
StringRef Str;
Value *Base = Call->getArgOperand(0);
- if (!getConstantStringInfo(Base, Str, /*TrimAtNul=*/false))
+ if (!getConstantStringInfo(Base, Str, CharWidth, /*TrimAtNul=*/false))
return false;
uint64_t N = Str.size();
diff --git a/llvm/lib/Transforms/Utils/AMDGPUEmitPrintf.cpp b/llvm/lib/Transforms/Utils/AMDGPUEmitPrintf.cpp
index a25632a..617f912 100644
--- a/llvm/lib/Transforms/Utils/AMDGPUEmitPrintf.cpp
+++ b/llvm/lib/Transforms/Utils/AMDGPUEmitPrintf.cpp
@@ -250,7 +250,7 @@ static Value *callBufferedPrintfStart(
for (size_t i = 1; i < Args.size(); i++) {
if (SpecIsCString.test(i)) {
StringRef ArgStr;
- if (getConstantStringInfo(Args[i], ArgStr)) {
+ if (getConstantStringInfo(Args[i], ArgStr, /*CharWidth=*/8)) {
auto alignedLen = alignTo(ArgStr.size() + 1, 8);
StringContents.push_back(StringData(
ArgStr,
@@ -432,7 +432,7 @@ Value *llvm::emitAMDGPUPrintfCall(IRBuilder<> &Builder, ArrayRef<Value *> Args,
SparseBitVector<8> SpecIsCString;
StringRef FmtStr;
- if (getConstantStringInfo(Fmt, FmtStr))
+ if (getConstantStringInfo(Fmt, FmtStr, /*CharWidth=*/8))
locateCStrings(SpecIsCString, FmtStr);
if (IsBuffered) {
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
index 737321d..a762eaf 100644
--- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -473,6 +473,7 @@ static Value* memChrToCharCompare(CallInst *CI, Value *NBytes,
}
Value *LibCallSimplifier::optimizeStrChr(CallInst *CI, IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
Value *SrcStr = CI->getArgOperand(0);
Value *CharVal = CI->getArgOperand(1);
annotateNonNullNoUndefBasedOnAccess(CI, 0);
@@ -515,7 +516,7 @@ Value *LibCallSimplifier::optimizeStrChr(CallInst *CI, IRBuilderBase &B) {
// Otherwise, the character is a constant, see if the first argument is
// a string literal. If so, we can constant fold.
StringRef Str;
- if (!getConstantStringInfo(SrcStr, Str)) {
+ if (!getConstantStringInfo(SrcStr, Str, CharWidth)) {
if (CharC->isZero()) // strchr(p, 0) -> p + strlen(p)
if (Value *StrLen = emitStrLen(SrcStr, B, DL, TLI))
return B.CreateInBoundsGEP(B.getInt8Ty(), SrcStr, StrLen, "strchr");
@@ -535,13 +536,14 @@ Value *LibCallSimplifier::optimizeStrChr(CallInst *CI, IRBuilderBase &B) {
}
Value *LibCallSimplifier::optimizeStrRChr(CallInst *CI, IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
Value *SrcStr = CI->getArgOperand(0);
Value *CharVal = CI->getArgOperand(1);
ConstantInt *CharC = dyn_cast<ConstantInt>(CharVal);
annotateNonNullNoUndefBasedOnAccess(CI, 0);
StringRef Str;
- if (!getConstantStringInfo(SrcStr, Str)) {
+ if (!getConstantStringInfo(SrcStr, Str, CharWidth)) {
// strrchr(s, 0) -> strchr(s, 0)
if (CharC && CharC->isZero())
return copyFlags(*CI, emitStrChr(SrcStr, '\0', B, TLI));
@@ -559,13 +561,15 @@ Value *LibCallSimplifier::optimizeStrRChr(CallInst *CI, IRBuilderBase &B) {
}
Value *LibCallSimplifier::optimizeStrCmp(CallInst *CI, IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
+
Value *Str1P = CI->getArgOperand(0), *Str2P = CI->getArgOperand(1);
if (Str1P == Str2P) // strcmp(x,x) -> 0
return ConstantInt::get(CI->getType(), 0);
StringRef Str1, Str2;
- bool HasStr1 = getConstantStringInfo(Str1P, Str1);
- bool HasStr2 = getConstantStringInfo(Str2P, Str2);
+ bool HasStr1 = getConstantStringInfo(Str1P, Str1, CharWidth);
+ bool HasStr2 = getConstantStringInfo(Str2P, Str2, CharWidth);
// strcmp(x, y) -> cnst (if both x and y are constant strings)
if (HasStr1 && HasStr2)
@@ -619,6 +623,7 @@ static Value *optimizeMemCmpVarSize(CallInst *CI, Value *LHS, Value *RHS,
IRBuilderBase &B, const DataLayout &DL);
Value *LibCallSimplifier::optimizeStrNCmp(CallInst *CI, IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
Value *Str1P = CI->getArgOperand(0);
Value *Str2P = CI->getArgOperand(1);
Value *Size = CI->getArgOperand(2);
@@ -641,8 +646,8 @@ Value *LibCallSimplifier::optimizeStrNCmp(CallInst *CI, IRBuilderBase &B) {
return copyFlags(*CI, emitMemCmp(Str1P, Str2P, Size, B, DL, TLI));
StringRef Str1, Str2;
- bool HasStr1 = getConstantStringInfo(Str1P, Str1);
- bool HasStr2 = getConstantStringInfo(Str2P, Str2);
+ bool HasStr1 = getConstantStringInfo(Str1P, Str1, CharWidth);
+ bool HasStr2 = getConstantStringInfo(Str2P, Str2, CharWidth);
// strncmp(x, y) -> cnst (if both x and y are constant strings)
if (HasStr1 && HasStr2) {
@@ -753,6 +758,8 @@ Value *LibCallSimplifier::optimizeStpCpy(CallInst *CI, IRBuilderBase &B) {
// Optimize a call to size_t strlcpy(char*, const char*, size_t).
Value *LibCallSimplifier::optimizeStrLCpy(CallInst *CI, IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
+
Value *Size = CI->getArgOperand(2);
if (isKnownNonZero(Size, DL))
// Like snprintf, the function stores into the destination only when
@@ -783,7 +790,7 @@ Value *LibCallSimplifier::optimizeStrLCpy(CallInst *CI, IRBuilderBase &B) {
// when it's not nul-terminated (as it's required to be) to avoid
// reading past its end.
StringRef Str;
- if (!getConstantStringInfo(Src, Str, /*TrimAtNul=*/false))
+ if (!getConstantStringInfo(Src, Str, CharWidth, /*TrimAtNul=*/false))
return nullptr;
uint64_t SrcLen = Str.find('\0');
@@ -831,6 +838,7 @@ Value *LibCallSimplifier::optimizeStrLCpy(CallInst *CI, IRBuilderBase &B) {
// otherwise.
Value *LibCallSimplifier::optimizeStringNCpy(CallInst *CI, bool RetEnd,
IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
Value *Dst = CI->getArgOperand(0);
Value *Src = CI->getArgOperand(1);
Value *Size = CI->getArgOperand(2);
@@ -897,7 +905,7 @@ Value *LibCallSimplifier::optimizeStringNCpy(CallInst *CI, bool RetEnd,
// st{p,r}ncpy(D, "a", N) -> memcpy(D, "a\0\0\0", N) for N <= 128.
StringRef Str;
- if (!getConstantStringInfo(Src, Str))
+ if (!getConstantStringInfo(Src, Str, CharWidth))
return nullptr;
std::string SrcStr = Str.str();
// Create a bigger, nul-padded array with the same length, SrcLen,
@@ -1065,9 +1073,11 @@ Value *LibCallSimplifier::optimizeWcslen(CallInst *CI, IRBuilderBase &B) {
}
Value *LibCallSimplifier::optimizeStrPBrk(CallInst *CI, IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
+
StringRef S1, S2;
- bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1);
- bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2);
+ bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1, CharWidth);
+ bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2, CharWidth);
// strpbrk(s, "") -> nullptr
// strpbrk("", s) -> nullptr
@@ -1104,9 +1114,11 @@ Value *LibCallSimplifier::optimizeStrTo(CallInst *CI, IRBuilderBase &B) {
}
Value *LibCallSimplifier::optimizeStrSpn(CallInst *CI, IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
+
StringRef S1, S2;
- bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1);
- bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2);
+ bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1, CharWidth);
+ bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2, CharWidth);
// strspn(s, "") -> 0
// strspn("", s) -> 0
@@ -1125,9 +1137,11 @@ Value *LibCallSimplifier::optimizeStrSpn(CallInst *CI, IRBuilderBase &B) {
}
Value *LibCallSimplifier::optimizeStrCSpn(CallInst *CI, IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
+
StringRef S1, S2;
- bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1);
- bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2);
+ bool HasS1 = getConstantStringInfo(CI->getArgOperand(0), S1, CharWidth);
+ bool HasS2 = getConstantStringInfo(CI->getArgOperand(1), S2, CharWidth);
// strcspn("", s) -> 0
if (HasS1 && S1.empty())
@@ -1149,6 +1163,8 @@ Value *LibCallSimplifier::optimizeStrCSpn(CallInst *CI, IRBuilderBase &B) {
}
Value *LibCallSimplifier::optimizeStrStr(CallInst *CI, IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
+
// fold strstr(x, x) -> x.
if (CI->getArgOperand(0) == CI->getArgOperand(1))
return CI->getArgOperand(0);
@@ -1174,8 +1190,10 @@ Value *LibCallSimplifier::optimizeStrStr(CallInst *CI, IRBuilderBase &B) {
// See if either input string is a constant string.
StringRef SearchStr, ToFindStr;
- bool HasStr1 = getConstantStringInfo(CI->getArgOperand(0), SearchStr);
- bool HasStr2 = getConstantStringInfo(CI->getArgOperand(1), ToFindStr);
+ bool HasStr1 =
+ getConstantStringInfo(CI->getArgOperand(0), SearchStr, CharWidth);
+ bool HasStr2 =
+ getConstantStringInfo(CI->getArgOperand(1), ToFindStr, CharWidth);
// fold strstr(x, "") -> x.
if (HasStr2 && ToFindStr.empty())
@@ -1203,6 +1221,8 @@ Value *LibCallSimplifier::optimizeStrStr(CallInst *CI, IRBuilderBase &B) {
}
Value *LibCallSimplifier::optimizeMemRChr(CallInst *CI, IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
+
Value *SrcStr = CI->getArgOperand(0);
Value *Size = CI->getArgOperand(2);
annotateNonNullAndDereferenceable(CI, 0, Size, DL);
@@ -1227,7 +1247,7 @@ Value *LibCallSimplifier::optimizeMemRChr(CallInst *CI, IRBuilderBase &B) {
}
StringRef Str;
- if (!getConstantStringInfo(SrcStr, Str, /*TrimAtNul=*/false))
+ if (!getConstantStringInfo(SrcStr, Str, CharWidth, /*TrimAtNul=*/false))
return nullptr;
if (Str.size() == 0)
@@ -1291,6 +1311,7 @@ Value *LibCallSimplifier::optimizeMemRChr(CallInst *CI, IRBuilderBase &B) {
}
Value *LibCallSimplifier::optimizeMemChr(CallInst *CI, IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
Value *SrcStr = CI->getArgOperand(0);
Value *Size = CI->getArgOperand(2);
@@ -1322,7 +1343,7 @@ Value *LibCallSimplifier::optimizeMemChr(CallInst *CI, IRBuilderBase &B) {
}
StringRef Str;
- if (!getConstantStringInfo(SrcStr, Str, /*TrimAtNul=*/false))
+ if (!getConstantStringInfo(SrcStr, Str, CharWidth, /*TrimAtNul=*/false))
return nullptr;
if (CharC) {
@@ -1488,12 +1509,14 @@ Value *LibCallSimplifier::optimizeMemChr(CallInst *CI, IRBuilderBase &B) {
static Value *optimizeMemCmpVarSize(CallInst *CI, Value *LHS, Value *RHS,
Value *Size, bool StrNCmp,
IRBuilderBase &B, const DataLayout &DL) {
+ unsigned CharWidth = DL.getByteWidth();
+
if (LHS == RHS) // memcmp(s,s,x) -> 0
return Constant::getNullValue(CI->getType());
StringRef LStr, RStr;
- if (!getConstantStringInfo(LHS, LStr, /*TrimAtNul=*/false) ||
- !getConstantStringInfo(RHS, RStr, /*TrimAtNul=*/false))
+ if (!getConstantStringInfo(LHS, LStr, CharWidth, /*TrimAtNul=*/false) ||
+ !getConstantStringInfo(RHS, RStr, CharWidth, /*TrimAtNul=*/false))
return nullptr;
// If the contents of both constant arrays are known, fold a call to
@@ -1629,6 +1652,7 @@ Value *LibCallSimplifier::optimizeMemCpy(CallInst *CI, IRBuilderBase &B) {
}
Value *LibCallSimplifier::optimizeMemCCpy(CallInst *CI, IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
Value *Dst = CI->getArgOperand(0);
Value *Src = CI->getArgOperand(1);
ConstantInt *StopChar = dyn_cast<ConstantInt>(CI->getArgOperand(2));
@@ -1640,7 +1664,7 @@ Value *LibCallSimplifier::optimizeMemCCpy(CallInst *CI, IRBuilderBase &B) {
if (N) {
if (N->isNullValue())
return Constant::getNullValue(CI->getType());
- if (!getConstantStringInfo(Src, SrcStr, /*TrimAtNul=*/false) ||
+ if (!getConstantStringInfo(Src, SrcStr, CharWidth, /*TrimAtNul=*/false) ||
// TODO: Handle zeroinitializer.
!StopChar)
return nullptr;
@@ -3198,8 +3222,10 @@ Value *LibCallSimplifier::optimizeToAscii(CallInst *CI, IRBuilderBase &B) {
// Fold calls to atoi, atol, and atoll.
Value *LibCallSimplifier::optimizeAtoi(CallInst *CI, IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
+
StringRef Str;
- if (!getConstantStringInfo(CI->getArgOperand(0), Str))
+ if (!getConstantStringInfo(CI->getArgOperand(0), Str, CharWidth))
return nullptr;
return convertStrToInt(CI, Str, nullptr, 10, /*AsSigned=*/true, B);
@@ -3208,6 +3234,8 @@ Value *LibCallSimplifier::optimizeAtoi(CallInst *CI, IRBuilderBase &B) {
// Fold calls to strtol, strtoll, strtoul, and strtoull.
Value *LibCallSimplifier::optimizeStrToInt(CallInst *CI, IRBuilderBase &B,
bool AsSigned) {
+ unsigned CharWidth = DL.getByteWidth();
+
Value *EndPtr = CI->getArgOperand(1);
if (isa<ConstantPointerNull>(EndPtr)) {
// With a null EndPtr, this function won't capture the main argument.
@@ -3219,7 +3247,7 @@ Value *LibCallSimplifier::optimizeStrToInt(CallInst *CI, IRBuilderBase &B,
return nullptr;
StringRef Str;
- if (!getConstantStringInfo(CI->getArgOperand(0), Str))
+ if (!getConstantStringInfo(CI->getArgOperand(0), Str, CharWidth))
return nullptr;
if (ConstantInt *CInt = dyn_cast<ConstantInt>(CI->getArgOperand(2))) {
@@ -3276,9 +3304,11 @@ static bool isReportingError(Function *Callee, CallInst *CI, int StreamArg) {
}
Value *LibCallSimplifier::optimizePrintFString(CallInst *CI, IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
+
// Check for a fixed format string.
StringRef FormatStr;
- if (!getConstantStringInfo(CI->getArgOperand(0), FormatStr))
+ if (!getConstantStringInfo(CI->getArgOperand(0), FormatStr, CharWidth))
return nullptr;
// Empty format string -> noop.
@@ -3304,7 +3334,7 @@ Value *LibCallSimplifier::optimizePrintFString(CallInst *CI, IRBuilderBase &B) {
// Try to remove call or emit putchar/puts.
if (FormatStr == "%s" && CI->arg_size() > 1) {
StringRef OperandStr;
- if (!getConstantStringInfo(CI->getOperand(1), OperandStr))
+ if (!getConstantStringInfo(CI->getOperand(1), OperandStr, CharWidth))
return nullptr;
// printf("%s", "") --> NOP
if (OperandStr.empty())
@@ -3393,9 +3423,11 @@ Value *LibCallSimplifier::optimizePrintF(CallInst *CI, IRBuilderBase &B) {
Value *LibCallSimplifier::optimizeSPrintFString(CallInst *CI,
IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
+
// Check for a fixed format string.
StringRef FormatStr;
- if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr))
+ if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr, CharWidth))
return nullptr;
// If we just have a format string (nothing else crazy) transform it.
@@ -3561,6 +3593,8 @@ Value *LibCallSimplifier::emitSnPrintfMemCpy(CallInst *CI, Value *StrArg,
Value *LibCallSimplifier::optimizeSnPrintFString(CallInst *CI,
IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
+
// Check for size
ConstantInt *Size = dyn_cast<ConstantInt>(CI->getArgOperand(1));
if (!Size)
@@ -3578,7 +3612,7 @@ Value *LibCallSimplifier::optimizeSnPrintFString(CallInst *CI,
// Check for a fixed format string.
StringRef FormatStr;
- if (!getConstantStringInfo(FmtArg, FormatStr))
+ if (!getConstantStringInfo(FmtArg, FormatStr, CharWidth))
return nullptr;
// If we just have a format string (nothing else crazy) transform it.
@@ -3623,7 +3657,7 @@ Value *LibCallSimplifier::optimizeSnPrintFString(CallInst *CI,
Value *StrArg = CI->getArgOperand(3);
// snprintf(dest, size, "%s", str) to llvm.memcpy(dest, str, len+1, 1)
StringRef Str;
- if (!getConstantStringInfo(StrArg, Str))
+ if (!getConstantStringInfo(StrArg, Str, CharWidth))
return nullptr;
return emitSnPrintfMemCpy(CI, StrArg, Str, N, B);
@@ -3641,11 +3675,13 @@ Value *LibCallSimplifier::optimizeSnPrintF(CallInst *CI, IRBuilderBase &B) {
Value *LibCallSimplifier::optimizeFPrintFString(CallInst *CI,
IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
+
optimizeErrorReporting(CI, B, 0);
// All the optimizations depend on the format string.
StringRef FormatStr;
- if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr))
+ if (!getConstantStringInfo(CI->getArgOperand(1), FormatStr, CharWidth))
return nullptr;
// Do not do any of the following transformations if the fprintf return
@@ -3784,6 +3820,8 @@ Value *LibCallSimplifier::optimizeFPuts(CallInst *CI, IRBuilderBase &B) {
}
Value *LibCallSimplifier::optimizePuts(CallInst *CI, IRBuilderBase &B) {
+ unsigned CharWidth = DL.getByteWidth();
+
annotateNonNullNoUndefBasedOnAccess(CI, 0);
if (!CI->use_empty())
return nullptr;
@@ -3791,7 +3829,8 @@ Value *LibCallSimplifier::optimizePuts(CallInst *CI, IRBuilderBase &B) {
// Check for a constant string.
// puts("") -> putchar('\n')
StringRef Str;
- if (getConstantStringInfo(CI->getArgOperand(0), Str) && Str.empty()) {
+ if (getConstantStringInfo(CI->getArgOperand(0), Str, CharWidth) &&
+ Str.empty()) {
// putchar takes an argument of the same type as puts returns, i.e.,
// int, which need not be 32 bits wide.
Type *IntTy = CI->getType();
@@ -3937,8 +3976,10 @@ Value *LibCallSimplifier::optimizeStringMemoryLibCall(CallInst *CI,
/// Constant folding nan/nanf/nanl.
static Value *optimizeNaN(CallInst *CI) {
+ unsigned CharWidth = CI->getDataLayout().getByteWidth();
+
StringRef CharSeq;
- if (!getConstantStringInfo(CI->getArgOperand(0), CharSeq))
+ if (!getConstantStringInfo(CI->getArgOperand(0), CharSeq, CharWidth))
return nullptr;
APInt Fill;