r342734 - NFC: deduplicate isRepeatedBytePattern from clang to LLVM's isBytewiseValue
Nico Weber via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 21 12:04:19 PDT 2018
Hello, please add linebreaks to your commit messages. This commit makes
`git log` look pretty ugly.
On Fri, Sep 21, 2018 at 9:55 AM JF Bastien via cfe-commits <
cfe-commits at lists.llvm.org> wrote:
> Author: jfb
> Date: Fri Sep 21 06:54:09 2018
> New Revision: 342734
>
> URL: http://llvm.org/viewvc/llvm-project?rev=342734&view=rev
> Log:
> NFC: deduplicate isRepeatedBytePattern from clang to LLVM's isBytewiseValue
>
> Summary:
> This code was in CGDecl.cpp and really belongs in LLVM. It happened to
> have isBytewiseValue which served a very similar purpose but wasn't as
> powerful as clang's version. Remove the clang version, and augment
> isBytewiseValue to be as powerful so that clang does the same thing it used
> to.
>
> LLVM part of this patch: D51751
>
> Subscribers: dexonsmith, cfe-commits
>
> Differential Revision: https://reviews.llvm.org/D51752
>
> Modified:
> cfe/trunk/lib/CodeGen/CGDecl.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDecl.cpp?rev=342734&r1=342733&r2=342734&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDecl.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDecl.cpp Fri Sep 21 06:54:09 2018
> @@ -30,6 +30,7 @@
> #include "clang/Basic/TargetInfo.h"
> #include "clang/CodeGen/CGFunctionInfo.h"
> #include "clang/Frontend/CodeGenOptions.h"
> +#include "llvm/Analysis/ValueTracking.h"
> #include "llvm/IR/DataLayout.h"
> #include "llvm/IR/GlobalVariable.h"
> #include "llvm/IR/Intrinsics.h"
> @@ -948,111 +949,17 @@ static bool shouldUseBZeroPlusStoresToIn
> canEmitInitWithFewStoresAfterBZero(Init, StoreBudget);
> }
>
> -/// A byte pattern.
> -///
> -/// Can be "any" pattern if the value was padding or known to be undef.
> -/// Can be "none" pattern if a sequence doesn't exist.
> -class BytePattern {
> - uint8_t Val;
> - enum class ValueType : uint8_t { Specific, Any, None } Type;
> - BytePattern(ValueType Type) : Type(Type) {}
> -
> -public:
> - BytePattern(uint8_t Value) : Val(Value), Type(ValueType::Specific) {}
> - static BytePattern Any() { return BytePattern(ValueType::Any); }
> - static BytePattern None() { return BytePattern(ValueType::None); }
> - bool isAny() const { return Type == ValueType::Any; }
> - bool isNone() const { return Type == ValueType::None; }
> - bool isValued() const { return Type == ValueType::Specific; }
> - uint8_t getValue() const {
> - assert(isValued());
> - return Val;
> - }
> - BytePattern merge(const BytePattern Other) const {
> - if (isNone() || Other.isNone())
> - return None();
> - if (isAny())
> - return Other;
> - if (Other.isAny())
> - return *this;
> - if (getValue() == Other.getValue())
> - return *this;
> - return None();
> - }
> -};
> -
> -/// Figures out whether the constant can be initialized with memset.
> -static BytePattern constantIsRepeatedBytePattern(llvm::Constant *C) {
> - if (isa<llvm::ConstantAggregateZero>(C) ||
> isa<llvm::ConstantPointerNull>(C))
> - return BytePattern(0x00);
> - if (isa<llvm::UndefValue>(C))
> - return BytePattern::Any();
> -
> - if (isa<llvm::ConstantInt>(C)) {
> - auto *Int = cast<llvm::ConstantInt>(C);
> - if (Int->getBitWidth() % 8 != 0)
> - return BytePattern::None();
> - const llvm::APInt &Value = Int->getValue();
> - if (Value.isSplat(8))
> - return BytePattern(Value.getLoBits(8).getLimitedValue());
> - return BytePattern::None();
> - }
> -
> - if (isa<llvm::ConstantFP>(C)) {
> - auto *FP = cast<llvm::ConstantFP>(C);
> - llvm::APInt Bits = FP->getValueAPF().bitcastToAPInt();
> - if (Bits.getBitWidth() % 8 != 0)
> - return BytePattern::None();
> - if (!Bits.isSplat(8))
> - return BytePattern::None();
> - return BytePattern(Bits.getLimitedValue() & 0xFF);
> - }
> -
> - if (isa<llvm::ConstantVector>(C)) {
> - llvm::Constant *Splat =
> cast<llvm::ConstantVector>(C)->getSplatValue();
> - if (Splat)
> - return constantIsRepeatedBytePattern(Splat);
> - return BytePattern::None();
> - }
> -
> - if (isa<llvm::ConstantArray>(C) || isa<llvm::ConstantStruct>(C)) {
> - BytePattern Pattern(BytePattern::Any());
> - for (unsigned I = 0, E = C->getNumOperands(); I != E; ++I) {
> - llvm::Constant *Elt = cast<llvm::Constant>(C->getOperand(I));
> - Pattern = Pattern.merge(constantIsRepeatedBytePattern(Elt));
> - if (Pattern.isNone())
> - return Pattern;
> - }
> - return Pattern;
> - }
> -
> - if (llvm::ConstantDataSequential *CDS =
> - dyn_cast<llvm::ConstantDataSequential>(C)) {
> - BytePattern Pattern(BytePattern::Any());
> - for (unsigned I = 0, E = CDS->getNumElements(); I != E; ++I) {
> - llvm::Constant *Elt = CDS->getElementAsConstant(I);
> - Pattern = Pattern.merge(constantIsRepeatedBytePattern(Elt));
> - if (Pattern.isNone())
> - return Pattern;
> - }
> - return Pattern;
> - }
> -
> - // BlockAddress, ConstantExpr, and everything else is scary.
> - return BytePattern::None();
> -}
> -
> /// Decide whether we should use memset to initialize a local variable
> instead
> /// of using a memcpy from a constant global. Assumes we've already
> decided to
> /// not user bzero.
> /// FIXME We could be more clever, as we are for bzero above, and generate
> /// memset followed by stores. It's unclear that's worth the effort.
> -static BytePattern shouldUseMemSetToInitialize(llvm::Constant *Init,
> - uint64_t GlobalSize) {
> +static llvm::Value *shouldUseMemSetToInitialize(llvm::Constant *Init,
> + uint64_t GlobalSize) {
> uint64_t SizeLimit = 32;
> if (GlobalSize <= SizeLimit)
> - return BytePattern::None();
> - return constantIsRepeatedBytePattern(Init);
> + return nullptr;
> + return llvm::isBytewiseValue(Init);
> }
>
> static void emitStoresForConstant(CodeGenModule &CGM, const VarDecl &D,
> @@ -1081,9 +988,14 @@ static void emitStoresForConstant(CodeGe
> return;
> }
>
> - BytePattern Pattern = shouldUseMemSetToInitialize(constant,
> ConstantSize);
> - if (!Pattern.isNone()) {
> - uint8_t Value = Pattern.isAny() ? 0x00 : Pattern.getValue();
> + llvm::Value *Pattern = shouldUseMemSetToInitialize(constant,
> ConstantSize);
> + if (Pattern) {
> + uint64_t Value = 0x00;
> + if (!isa<llvm::UndefValue>(Pattern)) {
> + const llvm::APInt &AP =
> cast<llvm::ConstantInt>(Pattern)->getValue();
> + assert(AP.getBitWidth() <= 8);
> + Value = AP.getLimitedValue();
> + }
> Builder.CreateMemSet(Loc, llvm::ConstantInt::get(Int8Ty, Value),
> SizeVal,
> isVolatile);
> return;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180921/2bbb9f9d/attachment.html>
More information about the cfe-commits
mailing list