[PATCH] D61843: [DAGCombine] Match a pattern where a wide type scalar value is stored by several narrow stores

Qing Shan Zhang via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun May 12 20:59:05 PDT 2019


steven.zhang created this revision.
steven.zhang added reviewers: jsji, nemanjai, kbarton, RKSimon, apilipenko, filcab, hfinkel.
Herald added a subscriber: hiraditya.
Herald added a project: LLVM.

This opportunity is found from spec 2017 557.xz_r. And it is used by the sha encrypt/decrypt.  See sha-2/sha512.c

  static void store64(u64 x, unsigned char* y)
  {
      for(int i = 0; i != 8; ++i)
          y[i] = (x >> ((7-i) * 8)) & 255;
  }
  
  static u64 load64(const unsigned char* y)
  {
      u64 res = 0;
      for(int i = 0; i != 8; ++i)
          res |= (u64)(y[i]) << ((7-i) * 8);
      return res;
  }

The load64 has been implemented by https://reviews.llvm.org/D26149
This patch is trying to implement the store pattern.

Match a pattern where a wide type scalar value is stored by several narrow
stores. Fold it into a single store or a BSWAP and a store if the targets
supports it.

Assuming little endian target:
i8 *p = ...
i32 val = ...
p[0] = (val >> 0) & 0xFF;
p[1] = (val >> 8) & 0xFF;
p[2] = (val >> 16) & 0xFF;
p[3] = (val >> 24) & 0xFF;

>
=

*((i32)p) = val;

i8 *p = ...
i32 val = ...
p[0] = (val >> 24) & 0xFF;
p[1] = (val >> 16) & 0xFF;
p[2] = (val >> 8) & 0xFF;
p[3] = (val >> 0) & 0xFF;

>
=

*((i32)p) = BSWAP(val);


https://reviews.llvm.org/D61843

Files:
  llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
  llvm/test/CodeGen/PowerPC/store-combine.ll
  llvm/test/CodeGen/SystemZ/codegenprepare-splitstore.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D61843.199199.patch
Type: text/x-patch
Size: 27052 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190513/d4a55df5/attachment.bin>


More information about the llvm-commits mailing list