[LLVMdev] Transformations + Re-definitions in SSA + SSAUpdater
Manish Gupta
manishg at cs.ucsd.edu
Fri Sep 5 14:53:52 PDT 2014
Hi All,
I am transforming LLVM IR, by adding new BasicBlocks. The new BasicBlock
is called based on some condition say *%re.def.bb <http://re.def.bb>*. If
the condition* %re.def.bb <http://re.def.bb>* is true I re-define some SSA
variables in new BB *re.def.true* ow. I copy old instructions in
*re.def.false* basicblock. The SSA needs to be updated for all the
successors basic-blocks because of this re-definitions. I am tying to
explain the problem using an example below:
*ORIGINAL BB:*
if.end: ; preds = %if.end, %entry
%j.07 = phi i32 [ %shl, %if.end ], [ 1, %entry ]
%i.06 = phi i32 [ %inc, %if.end ], [ 0, %entry ]
%shl = shl i32 %j.07, 1
%inc = add nsw i32 %i.06, 1
%cmp = icmp sgt i32 %i.06, 13
%cmp1 = icmp sgt i32 %shl, %val
%or.cond = or i1 %cmp, %cmp1
br i1 %or.cond, label %for.end, label %if.end
%for.end: ...
*TRANSFORMATION:*
if.end: ; preds = %orig.brInst,
%entry
%j.07 = phi i32 [ %shl, %orig.brInst ], [ 1, %entry ]
%i.06 = phi i32 [ %inc, %orig.brInst ], [ 0, %entry ]
....
* %re.def.bb <http://re.def.bb> = call i1 (i32, i64, ...)* isCond()*
* br i1 %re.def.bb <http://re.def.bb>, label %re.def.true, label
%re.def.false*
*re.def.false**:*
//Original Code ; preds = %if.end
%shl = shl i32 %j.07, 1
%inc = add nsw i32 %i.06, 1
%cmp = icmp sgt i32 %i.06, 13
%cmp1 = icmp sgt i32 %shl, %val
%or.cond = or i1 %cmp, %cmp1
* br label %orig.brInst*
*re.def.true**:*
* //re-definitions of %shl, %inc, %or.cond*
* %4 = re-define(%shl)*
* %5 = re-define(%inc)*
* %6 = re-define(%or.cond)*
*orig.brInst:*
br i1 %or.cond, label %for.end, label %if.end
%for.end: ...
Code added by transformation is highlight above. And it is not complete yet
as phinodes are messed up. *orig.brInst* is the branch instruction from
original code. Which should execute the same way to keep the control flow
intact. To fix the phinodes I used SSAUpdater class the same way
instruction sink function is using it in LICM.
SSAUpdate:
*Step 1:* Add one more def. available for %inc, %shl and %or.cond using
AddAvailableValue in new BasicBlock *myCond.true.*
SSA.AddAvailableValue(*myCond.true:*, NewDefInsts(shl));
SSA.AddAvailableValue(*myCond.true:*, NewDefInsts(inc));
SSA.AddAvailableValue(*myCond.true:*, NewDefInsts(or.cond));
*Step 2:* Rewrite all the uses of %shl, %inc %or.cond to update SSA/PHI
nodes
SSA.RewriteUseAfterInsertions(Users of %shl);
SSA.RewriteUseAfterInsertions(Users of %inc);
SSA.RewriteUseAfterInsertions(Users of %or.cond);
This adds some phi nodes but they are not correct.
RewriteUseAfterInsertions is not able to update existing PHINodes in if.end
BasicBlock. Any leads on how to fix it. Am I going the right direction or
is there some other way as well.
Thanks!
Manish
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140905/c068149b/attachment.html>
More information about the llvm-dev
mailing list