r214222 - PR20473: Don't "deduplicate" string literals with the same value but different

Richard Smith richard at metafoo.co.uk
Tue Jul 29 14:38:40 PDT 2014


This fixes a wrong-code regression since 3.4, and should go onto the branch.


On Tue, Jul 29, 2014 at 2:20 PM, Richard Smith <richard-llvm at metafoo.co.uk>
wrote:

> Author: rsmith
> Date: Tue Jul 29 16:20:12 2014
> New Revision: 214222
>
> URL: http://llvm.org/viewvc/llvm-project?rev=214222&view=rev
> Log:
> PR20473: Don't "deduplicate" string literals with the same value but
> different
> lengths! In passing, simplify string literal deduplication by relying on
> LLVM
> to deduplicate the underlying constant values.
>
> Modified:
>     cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>     cfe/trunk/lib/CodeGen/CodeGenModule.h
>     cfe/trunk/test/CodeGen/init.c
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=214222&r1=214221&r2=214222&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Tue Jul 29 16:20:12 2014
> @@ -2773,10 +2773,11 @@ CodeGenModule::GetAddrOfConstantStringFr
>    auto Alignment =
>        getContext().getAlignOfGlobalVarInChars(S->getType()).getQuantity();
>
> -  llvm::StringMapEntry<llvm::GlobalVariable *> *Entry = nullptr;
> +  llvm::Constant *C = GetConstantArrayFromStringLiteral(S);
> +  llvm::GlobalVariable **Entry = nullptr;
>    if (!LangOpts.WritableStrings) {
> -    Entry = getConstantStringMapEntry(S->getBytes(),
> S->getCharByteWidth());
> -    if (auto GV = Entry->getValue()) {
> +    Entry = &ConstantStringMap[C];
> +    if (auto GV = *Entry) {
>        if (Alignment > GV->getAlignment())
>          GV->setAlignment(Alignment);
>        return GV;
> @@ -2803,10 +2804,9 @@ CodeGenModule::GetAddrOfConstantStringFr
>      GlobalVariableName = ".str";
>    }
>
> -  llvm::Constant *C = GetConstantArrayFromStringLiteral(S);
>    auto GV = GenerateStringLiteral(C, LT, *this, GlobalVariableName,
> Alignment);
>    if (Entry)
> -    Entry->setValue(GV);
> +    *Entry = GV;
>
>    reportGlobalToASan(GV, S->getStrTokenLoc(0), "<string literal>");
>    return GV;
> @@ -2822,26 +2822,6 @@ CodeGenModule::GetAddrOfConstantStringFr
>    return GetAddrOfConstantCString(Str);
>  }
>
> -
> -llvm::StringMapEntry<llvm::GlobalVariable *>
> *CodeGenModule::getConstantStringMapEntry(
> -    StringRef Str, int CharByteWidth) {
> -  llvm::StringMap<llvm::GlobalVariable *> *ConstantStringMap = nullptr;
> -  switch (CharByteWidth) {
> -  case 1:
> -    ConstantStringMap = &Constant1ByteStringMap;
> -    break;
> -  case 2:
> -    ConstantStringMap = &Constant2ByteStringMap;
> -    break;
> -  case 4:
> -    ConstantStringMap = &Constant4ByteStringMap;
> -    break;
> -  default:
> -    llvm_unreachable("unhandled byte width!");
> -  }
> -  return &ConstantStringMap->GetOrCreateValue(Str);
> -}
> -
>  /// GetAddrOfConstantCString - Returns a pointer to a character array
> containing
>  /// the literal and a terminating '\0' character.
>  /// The result has pointer to array type.
> @@ -2854,19 +2834,20 @@ llvm::GlobalVariable *CodeGenModule::Get
>                      .getQuantity();
>    }
>
> +  llvm::Constant *C =
> +      llvm::ConstantDataArray::getString(getLLVMContext(), StrWithNull,
> false);
> +
>    // Don't share any string literals if strings aren't constant.
> -  llvm::StringMapEntry<llvm::GlobalVariable *> *Entry = nullptr;
> +  llvm::GlobalVariable **Entry = nullptr;
>    if (!LangOpts.WritableStrings) {
> -    Entry = getConstantStringMapEntry(StrWithNull, 1);
> -    if (auto GV = Entry->getValue()) {
> +    Entry = &ConstantStringMap[C];
> +    if (auto GV = *Entry) {
>        if (Alignment > GV->getAlignment())
>          GV->setAlignment(Alignment);
>        return GV;
>      }
>    }
>
> -  llvm::Constant *C =
> -      llvm::ConstantDataArray::getString(getLLVMContext(), StrWithNull,
> false);
>    // Get the default prefix if a name wasn't specified.
>    if (!GlobalName)
>      GlobalName = ".str";
> @@ -2874,7 +2855,7 @@ llvm::GlobalVariable *CodeGenModule::Get
>    auto GV = GenerateStringLiteral(C, llvm::GlobalValue::PrivateLinkage,
> *this,
>                                    GlobalName, Alignment);
>    if (Entry)
> -    Entry->setValue(GV);
> +    *Entry = GV;
>    return GV;
>  }
>
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=214222&r1=214221&r2=214222&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenModule.h (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.h Tue Jul 29 16:20:12 2014
> @@ -361,9 +361,7 @@ class CodeGenModule : public CodeGenType
>
>    llvm::StringMap<llvm::Constant*> CFConstantStringMap;
>
> -  llvm::StringMap<llvm::GlobalVariable *> Constant1ByteStringMap;
> -  llvm::StringMap<llvm::GlobalVariable *> Constant2ByteStringMap;
> -  llvm::StringMap<llvm::GlobalVariable *> Constant4ByteStringMap;
> +  llvm::DenseMap<llvm::Constant *, llvm::GlobalVariable *>
> ConstantStringMap;
>    llvm::DenseMap<const Decl*, llvm::Constant *> StaticLocalDeclMap;
>    llvm::DenseMap<const Decl*, llvm::GlobalVariable*>
> StaticLocalDeclGuardMap;
>    llvm::DenseMap<const Expr*, llvm::Constant *>
> MaterializedGlobalTemporaryMap;
> @@ -1044,9 +1042,6 @@ private:
>                                          llvm::PointerType *PTy,
>                                          const VarDecl *D);
>
> -  llvm::StringMapEntry<llvm::GlobalVariable *> *
> -  getConstantStringMapEntry(StringRef Str, int CharByteWidth);
> -
>    /// Set attributes which are common to any form of a global definition
> (alias,
>    /// Objective-C method, function, global variable).
>    ///
>
> Modified: cfe/trunk/test/CodeGen/init.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/init.c?rev=214222&r1=214221&r2=214222&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGen/init.c (original)
> +++ cfe/trunk/test/CodeGen/init.c Tue Jul 29 16:20:12 2014
> @@ -132,3 +132,11 @@ void test13(int x) {
>    // CHECK: @test13
>    // CHECK: and i16 {{.*}}, -1024
>  }
> +
> +// CHECK-LABEL: @PR20473
> +void PR20473() {
> +  // CHECK: memcpy{{.*}}([2 x i8]* @
> +  bar((char[2]) {""});
> +  // CHECK: memcpy{{.*}}([3 x i8]* @
> +  bar((char[3]) {""});
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140729/8d636188/attachment.html>


More information about the cfe-commits mailing list