Skip to content

Commit 1591f0b

Browse files
committed
[ValueTracking] Add CharWidth argument to getConstantStringInfo (NFC)
The method assumes that host chars and target chars have the same width. Add a CharWidth argument so that it can bail out if the requested char width differs from the host char width. Alternatively, the check could be done at call sites, but this is more error-prone. In the future, this method will be replaced with a different one that allows host/target chars to have different widths. The prototype will be the same except that StringRef is replaced with something that is byte width agnostic. Adding CharWidth argument now reduces the future diff.
1 parent 4d50f23 commit 1591f0b

File tree

10 files changed

+96
-46
lines changed

10 files changed

+96
-46
lines changed

clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ void CodeGenFunction::ProcessOrderScopeAMDGCN(Value *Order, Value *Scope,
226226

227227
// Some of the atomic builtins take the scope as a string name.
228228
StringRef scp;
229-
if (llvm::getConstantStringInfo(Scope, scp)) {
229+
if (llvm::getConstantStringInfo(Scope, scp, /*CharWidth=*/8)) {
230230
SSID = getLLVMContext().getOrInsertSyncScopeID(scp);
231231
return;
232232
}
@@ -281,7 +281,7 @@ void CodeGenFunction::AddAMDGPUFenceAddressSpaceMMRA(llvm::Instruction *Inst,
281281
for (unsigned K = 2; K < E->getNumArgs(); ++K) {
282282
llvm::Value *V = EmitScalarExpr(E->getArg(K));
283283
StringRef AS;
284-
if (llvm::getConstantStringInfo(V, AS)) {
284+
if (llvm::getConstantStringInfo(V, AS, /*CharWidth=*/8)) {
285285
MMRAs.push_back({Tag, AS});
286286
// TODO: Delete the resulting unused constant?
287287
continue;

llvm/include/llvm/Analysis/ValueTracking.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ LLVM_ABI bool getConstantDataArrayInfo(const Value *V,
404404
/// trailing null characters as well as any other characters that come after
405405
/// it.
406406
LLVM_ABI bool getConstantStringInfo(const Value *V, StringRef &Str,
407-
bool TrimAtNul = true);
407+
unsigned CharWidth, bool TrimAtNul = true);
408408

409409
/// If we can compute the length of the string pointed to by the specified
410410
/// pointer, return 'len+1'. If we can't, return 0.

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6457,9 +6457,12 @@ bool llvm::getConstantDataArrayInfo(const Value *V,
64576457
/// return true. When TrimAtNul is set, Str will contain only the bytes up
64586458
/// to but not including the first nul. Return false on failure.
64596459
bool llvm::getConstantStringInfo(const Value *V, StringRef &Str,
6460-
bool TrimAtNul) {
6460+
unsigned CharWidth, bool TrimAtNul) {
6461+
if (CharWidth != CHAR_BIT)
6462+
return false;
6463+
64616464
ConstantDataArraySlice Slice;
6462-
if (!getConstantDataArrayInfo(V, Slice, 8))
6465+
if (!getConstantDataArrayInfo(V, Slice, CharWidth))
64636466
return false;
64646467

64656468
if (Slice.Array == nullptr) {

llvm/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ static_assert(NonLiteralStr.size() == 3);
121121

122122
static StringRef getAsConstantStr(Value *V) {
123123
StringRef S;
124-
if (!getConstantStringInfo(V, S))
124+
if (!getConstantStringInfo(V, S, /*CharWidth=*/8))
125125
S = NonLiteralStr;
126126

127127
return S;
@@ -154,7 +154,7 @@ bool AMDGPUPrintfRuntimeBindingImpl::lowerPrintfForGpu(Module &M) {
154154
Value *Op = CI->getArgOperand(0);
155155

156156
StringRef FormatStr;
157-
if (!getConstantStringInfo(Op, FormatStr)) {
157+
if (!getConstantStringInfo(Op, FormatStr, /*CharWidth=*/8)) {
158158
Value *Stripped = Op->stripPointerCasts();
159159
if (!isa<UndefValue>(Stripped) && !isa<ConstantPointerNull>(Stripped))
160160
diagnoseInvalidFormatString(CI);

llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,7 @@ void SPIRVAsmPrinter::outputAnnotations(const Module &M) {
591591
cast<GlobalVariable>(CS->getOperand(1)->stripPointerCasts());
592592

593593
StringRef AnnotationString;
594-
getConstantStringInfo(GV, AnnotationString);
594+
getConstantStringInfo(GV, AnnotationString, /*CharWidth=*/8);
595595
MCInst Inst;
596596
Inst.setOpcode(SPIRV::OpDecorate);
597597
Inst.addOperand(MCOperand::createReg(Reg));

llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ static std::string getAnnotation(Value *AnnoVal, Value *OptAnnoVal) {
159159
std::string Anno;
160160
if (auto *C = dyn_cast_or_null<Constant>(AnnoVal)) {
161161
StringRef Str;
162-
if (getConstantStringInfo(C, Str))
162+
if (getConstantStringInfo(C, Str, /*CharWidth=*/8))
163163
Anno = Str;
164164
}
165165
// handle optional annotation parameter in a way that Khronos Translator do

llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,7 @@ void WebAssemblyAsmPrinter::EmitFunctionAttributes(Module &M) {
580580
// The second field is a pointer to a global annotation string.
581581
auto *GV = cast<GlobalVariable>(CS->getOperand(1)->stripPointerCasts());
582582
StringRef AnnotationString;
583-
getConstantStringInfo(GV, AnnotationString);
583+
getConstantStringInfo(GV, AnnotationString, /*CharWidth=*/8);
584584
auto *Sym = cast<MCSymbolWasm>(getSymbol(F));
585585
CustomSections[AnnotationString].push_back(Sym);
586586
}

llvm/lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,6 +1036,8 @@ class StrNCmpInliner {
10361036
/// handled by the instcombine pass.
10371037
///
10381038
bool StrNCmpInliner::optimizeStrNCmp() {
1039+
unsigned CharWidth = DL.getByteWidth();
1040+
10391041
if (StrNCmpInlineThreshold < 2)
10401042
return false;
10411043

@@ -1049,8 +1051,10 @@ bool StrNCmpInliner::optimizeStrNCmp() {
10491051
return false;
10501052

10511053
StringRef Str1, Str2;
1052-
bool HasStr1 = getConstantStringInfo(Str1P, Str1, /*TrimAtNul=*/false);
1053-
bool HasStr2 = getConstantStringInfo(Str2P, Str2, /*TrimAtNul=*/false);
1054+
bool HasStr1 =
1055+
getConstantStringInfo(Str1P, Str1, CharWidth, /*TrimAtNul=*/false);
1056+
bool HasStr2 =
1057+
getConstantStringInfo(Str2P, Str2, CharWidth, /*TrimAtNul=*/false);
10541058
if (HasStr1 == HasStr2)
10551059
return false;
10561060

@@ -1180,12 +1184,14 @@ void StrNCmpInliner::inlineCompare(Value *LHS, StringRef RHS, uint64_t N,
11801184
/// Convert memchr with a small constant string into a switch
11811185
static bool foldMemChr(CallInst *Call, DomTreeUpdater *DTU,
11821186
const DataLayout &DL) {
1187+
unsigned CharWidth = DL.getByteWidth();
1188+
11831189
if (isa<Constant>(Call->getArgOperand(1)))
11841190
return false;
11851191

11861192
StringRef Str;
11871193
Value *Base = Call->getArgOperand(0);
1188-
if (!getConstantStringInfo(Base, Str, /*TrimAtNul=*/false))
1194+
if (!getConstantStringInfo(Base, Str, CharWidth, /*TrimAtNul=*/false))
11891195
return false;
11901196

11911197
uint64_t N = Str.size();

llvm/lib/Transforms/Utils/AMDGPUEmitPrintf.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ static Value *callBufferedPrintfStart(
250250
for (size_t i = 1; i < Args.size(); i++) {
251251
if (SpecIsCString.test(i)) {
252252
StringRef ArgStr;
253-
if (getConstantStringInfo(Args[i], ArgStr)) {
253+
if (getConstantStringInfo(Args[i], ArgStr, /*CharWidth=*/8)) {
254254
auto alignedLen = alignTo(ArgStr.size() + 1, 8);
255255
StringContents.push_back(StringData(
256256
ArgStr,
@@ -432,7 +432,7 @@ Value *llvm::emitAMDGPUPrintfCall(IRBuilder<> &Builder, ArrayRef<Value *> Args,
432432
SparseBitVector<8> SpecIsCString;
433433
StringRef FmtStr;
434434

435-
if (getConstantStringInfo(Fmt, FmtStr))
435+
if (getConstantStringInfo(Fmt, FmtStr, /*CharWidth=*/8))
436436
locateCStrings(SpecIsCString, FmtStr);
437437

438438
if (IsBuffered) {

0 commit comments

Comments
 (0)