HomePhabricator

[PowerPC] Don't make it as pre-inc candidate if displacement isn't 4's multiple…

Description

[PowerPC] Don't make it as pre-inc candidate if displacement isn't 4's multiple for i64 pre-inc load/store

For the below case, pre-inc prep think it's a good candidate to use pre-inc for the bucket, but 64bit integer load/store update (pre-inc) instruction on Power requires the displacement field should be DS-form (4's multiple). Since it can't satisfy the constraint, we have to do some fix ups later. As below, the original load/stores could be well-form, it makes things worse.

unsigned long long result = 0;
unsigned long long foo(char *p, unsigned long long n) {

for (unsigned long long i = 0; i < n; i++) {
  unsigned long long x1 = *(unsigned long long *)(p - 50000 + i);
  unsigned long long x2 = *(unsigned long long *)(p - 61024 + i);
  unsigned long long x3 = *(unsigned long long *)(p - 62048 + i);
  unsigned long long x4 = *(unsigned long long *)(p - 64096 + i);
  result *= x1 * x2 * x3 * x4;
}
return result;

}

Patch by jedilyn(Kewen Lin).

Differential Revision: https://reviews.llvm.org/D48813
--This line, and those below, will be ignored--

M lib/Target/PowerPC/PPCLoopPreIncPrep.cpp
A test/CodeGen/PowerPC/preincprep-i64-check.ll