Skip to content

Commit

Permalink
[ifcnv] Don't duplicate blocks that contain convergent instructions.
Browse files Browse the repository at this point in the history
It's unsafe to duplicate blocks that contain convergent instructions
during ifcnv.  See the patch for details.

Reviewers: hfinkel

Differential Revision: http://reviews.llvm.org/D17518

llvm-svn: 266404
  • Loading branch information
Justin Lebar committed Apr 15, 2016
1 parent f04e678 commit 7dba2e0
Showing 1 changed file with 31 additions and 1 deletion.
32 changes: 31 additions & 1 deletion llvm/lib/CodeGen/IfConversion.cpp
Expand Up @@ -678,7 +678,37 @@ void IfConverter::ScanInstructions(BBInfo &BBI) {
if (MI.isDebugValue())
continue;

if (MI.isNotDuplicable())
// It's unsafe to duplicate convergent instructions in this context, so set
// BBI.CannotBeCopied to true if MI is convergent. To see why, consider the
// following CFG, which is subject to our "simple" transformation.
//
// BB0 // if (c1) goto BB1; else goto BB2;
// / \
// BB1 |
// | BB2 // if (c2) goto TBB; else goto FBB;
// | / |
// | / |
// TBB |
// | |
// | FBB
// |
// exit
//
// Suppose we want to move TBB's contents up into BB1 and BB2 (in BB1 they'd
// be unconditional, and in BB2, they'd be predicated upon c2), and suppose
// TBB contains a convergent instruction. This is safe iff doing so does
// not add a control-flow dependency to the convergent instruction -- i.e.,
// it's safe iff the set of control flows that leads us to the convergent
// instruction does not get smaller after the transformation.
//
// Originally we executed TBB if c1 || c2. After the transformation, there
// are two copies of TBB's instructions. We get to the first if c1, and we
// get to the second if !c1 && c2.
//
// There are clearly fewer ways to satisfy the condition "c1" than
// "c1 || c2". Since we've shrunk the set of control flows which lead to
// our convergent instruction, the transformation is unsafe.
if (MI.isNotDuplicable() || MI.isConvergent())
BBI.CannotBeCopied = true;

bool isPredicated = TII->isPredicated(MI);
Expand Down

0 comments on commit 7dba2e0

Please sign in to comment.