[llvm-branch-commits] [llvm-branch] r368017 - Merging r367898:

Hans Wennborg via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Aug 6 04:04:11 PDT 2019


Author: hans
Date: Tue Aug  6 04:04:11 2019
New Revision: 368017

URL: http://llvm.org/viewvc/llvm-project?rev=368017&view=rev
Log:
Merging r367898:
------------------------------------------------------------------------
r367898 | evandro | 2019-08-05 20:09:14 +0200 (Mon, 05 Aug 2019) | 22 lines

[AArch64] Expand bcmp() for small block lengths

Patch D56593 by @courbet results in calls to `bcmp()` in some cases, should
the target support the it.  Unless `TTI::MemCmpExpansionOptions()`
is overridden by the target.

In a proprietary benchmark we see a performance drop of about 12% on PNG
compression before this patch, though it passes all tests.

This patch mirrors X86 for AArch64 and initializes
`TTI::MemCmpExpansionOptions()` to then expand calls to `bcmp()` when
appropriate.  No tuning of the parameters was performed, but, at this point,
it's enough to recover the performance drop above.

This problem also exists on ARM.  Once a consensus is reached for AArch64, we
can work to fix ARM as well.

Authors:
- Evandro Menezes (@evandro) <e.menezes at samsung.com>
- Brian Rzycki (@brzycki) <b.rzycki at samsung.com>

Differential revision: https://reviews.llvm.org/D64805
------------------------------------------------------------------------

Added:
    llvm/branches/release_90/test/CodeGen/AArch64/bcmp-inline-small.ll
      - copied unchanged from r367898, llvm/trunk/test/CodeGen/AArch64/bcmp-inline-small.ll
Modified:
    llvm/branches/release_90/   (props changed)
    llvm/branches/release_90/lib/Target/AArch64/AArch64ISelLowering.cpp
    llvm/branches/release_90/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
    llvm/branches/release_90/lib/Target/AArch64/AArch64TargetTransformInfo.h

Propchange: llvm/branches/release_90/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Aug  6 04:04:11 2019
@@ -1,3 +1,3 @@
 /llvm/branches/Apple/Pertwee:110850,110961
 /llvm/branches/type-system-rewrite:133420-134817
-/llvm/trunk:155241,366431,366481,366487,366527,366570,366660,366868,366925,367030,367062,367124,367215,367292,367304,367306,367314,367340-367341,367394,367396,367398,367417,367662,367753,367846-367847,367941,368004
+/llvm/trunk:155241,366431,366481,366487,366527,366570,366660,366868,366925,367030,367062,367124,367215,367292,367304,367306,367314,367340-367341,367394,367396,367398,367417,367662,367753,367846-367847,367898,367941,368004

Modified: llvm/branches/release_90/lib/Target/AArch64/AArch64ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_90/lib/Target/AArch64/AArch64ISelLowering.cpp?rev=368017&r1=368016&r2=368017&view=diff
==============================================================================
--- llvm/branches/release_90/lib/Target/AArch64/AArch64ISelLowering.cpp (original)
+++ llvm/branches/release_90/lib/Target/AArch64/AArch64ISelLowering.cpp Tue Aug  6 04:04:11 2019
@@ -606,6 +606,10 @@ AArch64TargetLowering::AArch64TargetLowe
 
   MaxStoresPerMemmoveOptSize = MaxStoresPerMemmove = 4;
 
+  MaxLoadsPerMemcmpOptSize = 4;
+  MaxLoadsPerMemcmp = Subtarget->requiresStrictAlign()
+                      ? MaxLoadsPerMemcmpOptSize : 8;
+
   setStackPointerRegisterToSaveRestore(AArch64::SP);
 
   setSchedulingPreference(Sched::Hybrid);

Modified: llvm/branches/release_90/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_90/lib/Target/AArch64/AArch64TargetTransformInfo.cpp?rev=368017&r1=368016&r2=368017&view=diff
==============================================================================
--- llvm/branches/release_90/lib/Target/AArch64/AArch64TargetTransformInfo.cpp (original)
+++ llvm/branches/release_90/lib/Target/AArch64/AArch64TargetTransformInfo.cpp Tue Aug  6 04:04:11 2019
@@ -618,6 +618,19 @@ int AArch64TTIImpl::getCmpSelInstrCost(u
   return BaseT::getCmpSelInstrCost(Opcode, ValTy, CondTy, I);
 }
 
+AArch64TTIImpl::TTI::MemCmpExpansionOptions
+AArch64TTIImpl::enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const {
+  TTI::MemCmpExpansionOptions Options;
+  Options.AllowOverlappingLoads = !ST->requiresStrictAlign();
+  Options.MaxNumLoads = TLI->getMaxExpandSizeMemcmp(OptSize);
+  Options.NumLoadsPerBlock = Options.MaxNumLoads;
+  // TODO: Though vector loads usually perform well on AArch64, in some targets
+  // they may wake up the FP unit, which raises the power consumption.  Perhaps
+  // they could be used with no holds barred (-O3).
+  Options.LoadSizes = {8, 4, 2, 1};
+  return Options;
+}
+
 int AArch64TTIImpl::getMemoryOpCost(unsigned Opcode, Type *Ty,
                                     unsigned Alignment, unsigned AddressSpace,
                                     const Instruction *I) {

Modified: llvm/branches/release_90/lib/Target/AArch64/AArch64TargetTransformInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_90/lib/Target/AArch64/AArch64TargetTransformInfo.h?rev=368017&r1=368016&r2=368017&view=diff
==============================================================================
--- llvm/branches/release_90/lib/Target/AArch64/AArch64TargetTransformInfo.h (original)
+++ llvm/branches/release_90/lib/Target/AArch64/AArch64TargetTransformInfo.h Tue Aug  6 04:04:11 2019
@@ -130,6 +130,9 @@ public:
   int getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
                          const Instruction *I = nullptr);
 
+  TTI::MemCmpExpansionOptions enableMemCmpExpansion(bool OptSize,
+                                                    bool IsZeroCmp) const;
+
   int getMemoryOpCost(unsigned Opcode, Type *Src, unsigned Alignment,
                       unsigned AddressSpace, const Instruction *I = nullptr);
 




More information about the llvm-branch-commits mailing list