[PATCH] D55604: [AggressiveInstCombine] convert rotate with guard branch into funnel shift (PR34924)
Sanjay Patel via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 17 04:24:55 PST 2018
spatel marked 2 inline comments as done.
spatel added inline comments.
================
Comment at: lib/Transforms/AggressiveInstCombine/AggressiveInstCombine.cpp:148
+ // llvm.fshl.i32(i32 %X, i32 %RotAmt)
+ IRBuilder<> Builder(&Phi);
+ Function *F = Intrinsic::getDeclaration(Phi.getModule(), IID, Phi.getType());
----------------
nikic wrote:
> It looks like this is not the right way to replace a phi. For this test case:
>
> ```
> define i32 @rotl(i32 %a, i32 %b) {
> entry:
> %cmp = icmp eq i32 %b, 0
> br i1 %cmp, label %end, label %rotbb
>
> rotbb:
> %sub = sub i32 32, %b
> %shr = lshr i32 %a, %sub
> %shl = shl i32 %a, %b
> %or = or i32 %shr, %shl
> br label %end
>
> end:
> %cond = phi i32 [ %or, %rotbb ], [ %a, %entry ]
> %other = phi i32 [ 1, %rotbb ], [ 2, %entry ]
> %res = or i32 %cond, %other
> ret i32 %res
> }
> ```
>
> I get:
>
> ```
> PHI nodes not grouped at top of basic block!
> %other = phi i32 [ 1, %rotbb ], [ 2, %entry ]
> label %end
> in function rotl
> LLVM ERROR: Broken function found, compilation aborted!
> ```
>
> Some possible alternatives from `git grep "IRBuilder.*Phi"`:
>
> ```
> lib/Transforms/Instrumentation/GCOVProfiling.cpp: IRBuilder<> BuilderForPhi(&*BB.begin());
> lib/Transforms/Scalar/IndVarSimplify.cpp: IRBuilder<> Builder(&*WidePhi->getParent()->getFirstInsertionPt());
> lib/Transforms/Utils/BypassSlowDivision.cpp: IRBuilder<> Builder(PhiBB, PhiBB->begin());
> ```
Yes, good catch. I'll add a regression test and fix that.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D55604/new/
https://reviews.llvm.org/D55604
More information about the llvm-commits
mailing list