OSDN Git Service

[CallSiteSplitting] Refactor creating callsites.
authorFlorian Hahn <florian.hahn@arm.com>
Wed, 13 Dec 2017 03:05:20 +0000 (03:05 +0000)
committerFlorian Hahn <florian.hahn@arm.com>
Wed, 13 Dec 2017 03:05:20 +0000 (03:05 +0000)
commitbb04a0eeec2a9f4612de6a723e7372a9669c5986
treec3af41626496f015b5e65ba28e9e6433bd3df7d4
parentfa621d294f1c22db4000724c910d66c278386aaf
[CallSiteSplitting] Refactor creating callsites.

Summary:
This change makes the call site creation more general if any of the
arguments is predicated on a condition in the call site's predecessors.

If we find a callsite, that potentially can be split, we collect the set
of conditions for the call site's predecessors (currently only 2
predecessors are allowed). To do that, we traverse each predecessor's
predecessors as long as it only has single predecessors and record the
condition, if it is relevant to the call site. For each condition, we
also check if the condition is taken or not. In case it is not taken,
we record the inverse predicate.

We use the recorded conditions to create the new call sites and split
the basic block.

This has 2 benefits: (1) it is slightly easier to see what is going on
(IMO) and (2) we can easily extend it to handle more complex control
flow.

Reviewers: davidxl, junbuml

Reviewed By: junbuml

Subscribers: llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@320547 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/Scalar/CallSiteSplitting.cpp
test/Transforms/CallSiteSplitting/callsite-split-or-phi.ll