OSDN Git Service

Fix the issue that ComputeValueKnownInPredecessors only handles the case when
authorWei Mi <wmi@google.com>
Tue, 1 May 2018 14:47:24 +0000 (14:47 +0000)
committerWei Mi <wmi@google.com>
Tue, 1 May 2018 14:47:24 +0000 (14:47 +0000)
commitdeb49e5e4e71b2a98736a0bdc9663de47074495c
treee6a4bccffcb2c6964676ba920bcc6f78e606f490
parent019918ff9b867840e8eb4b0d6c061d05a242437e
Fix the issue that ComputeValueKnownInPredecessors only handles the case when
phi is on lhs of a comparison op.

For the following testcase,
L1:

  %t0 = add i32 %m, 7
  %t3 = icmp eq i32* %t2, null
  br i1 %t3, label %L3, label %L2

L2:

  %t4 = load i32, i32* %t2, align 4
  br label %L3

L3:

  %t5 = phi i32 [ %t0, %L1 ], [ %t4, %L2 ]
  %t6 = icmp eq i32 %t0, %t5
  br i1 %t6, label %L4, label %L5

We know if we go through the path L1 --> L3, %t6 should always be true. However
currently, if the rhs of the eq comparison is phi, JumpThreading fails to
evaluate %t6 to true. And we know that Instcombine cannot guarantee always
canonicalizing phi to the left hand side of the comparison operation according
to the operand priority comparison mechanism in instcombine. The patch handles
the case when rhs of the comparison op is a phi.

Differential Revision: https://reviews.llvm.org/D46275

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@331266 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/Scalar/JumpThreading.cpp
test/Other/pr32085.ll
test/Transforms/JumpThreading/phi-known.ll