]> granicus.if.org Git - llvm/commit
[GVN] Recommit the patch "Add phi-translate support in scalarpre".
authorWei Mi <wmi@google.com>
Mon, 26 Jun 2017 18:16:10 +0000 (18:16 +0000)
committerWei Mi <wmi@google.com>
Mon, 26 Jun 2017 18:16:10 +0000 (18:16 +0000)
commit71d7c09ce8b90a3c899068803a24f67fe887836c
treeced097172f74fabfb03217e22cdaa2c14e5be796
parent8e828b87b2da64499a5b1d2dc22c3dd0071e69bc
[GVN] Recommit the patch "Add phi-translate support in scalarpre".

The recommit fixes three bugs: The first one is to use CurrentBlock instead of
PREInstr's Parent as param of performScalarPREInsertion because the Parent
of a clone instruction may be uninitialized. The second one is stop PRE when
CurrentBlock to its predecessor is a backedge and an operand of CurInst is
defined inside of CurrentBlock. The same value defined inside of loop in last
iteration can not be regarded as available. The third one is an out-of-bound
array access in a flipped if guard.

Right now scalarpre doesn't have phi-translate support, so it will miss some
simple pre opportunities. Like the following testcase, current scalarpre cannot
recognize the last "a * b" is fully redundent because a and b used by the last
"a * b" expr are both defined by phis.

long a[100], b[100], g1, g2, g3;
__attribute__((pure)) long goo();

void foo(long a, long b, long c, long d) {

  g1 = a * b;
  if (__builtin_expect(g2 > 3, 0)) {
    a = c;
    b = d;
    g2 = a * b;
  }
  g3 = a * b;      // fully redundant.

}

The patch adds phi-translate support in scalarpre. This is only a temporary
solution before the newpre based on newgvn is available.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306313 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Transforms/Scalar/GVN.h
lib/Transforms/Scalar/GVN.cpp
test/Transforms/GVN/PRE/phi-translate-2.ll [new file with mode: 0644]
test/Transforms/GVN/PRE/pre-gep-load.ll
test/Transforms/GVN/PRE/pre-load.ll