[llvm-commits] [llvm] r78351 - in /llvm/trunk: lib/CodeGen/BranchFolding.cpp test/CodeGen/X86/2009-08-06-branchfolder-crash.ll
Chris Lattner
clattner at apple.com
Thu Aug 6 22:21:28 PDT 2009
On Aug 6, 2009, at 3:56 PM, Dale Johannesen wrote:
Author: johannes
> Date: Thu Aug 6 17:56:40 2009
> New Revision: 78351
> URL: http://llvm.org/viewvc/llvm-project?rev=78351&view=rev
> Log:
> Fix PR 4626, a crash in branch folding after OptimizeBlock
> produced a CFG it wasn't prepared for.
Thanks for fixing this Dale! Please pull the loop out to its own
function, some (related but not exactly the same case) discussion here:
http://llvm.org/docs/CodingStandards.html#hl_predicateloops
-Chris
>
>
> Added:
> llvm/trunk/test/CodeGen/X86/2009-08-06-branchfolder-crash.ll
> Modified:
> llvm/trunk/lib/CodeGen/BranchFolding.cpp
>
> Modified: llvm/trunk/lib/CodeGen/BranchFolding.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/BranchFolding.cpp?rev=78351&r1=78350&r2=78351&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/CodeGen/BranchFolding.cpp (original)
> +++ llvm/trunk/lib/CodeGen/BranchFolding.cpp Thu Aug 6 17:56:40 2009
> @@ -893,8 +893,24 @@
> while (!MBB->pred_empty()) {
> MachineBasicBlock *Pred = *(MBB->pred_end()-1);
> Pred->ReplaceUsesOfBlockWith(MBB, FallThrough);
> + // If this resulted in a predecessor with true and false
> edges
> + // both going to the fallthrough block, clean up;
> + // BranchFolding doesn't like this.
> + MachineBasicBlock::succ_iterator SI = Pred->succ_begin();
> + bool found = false;
> + while (SI != Pred->succ_end()) {
> + if (*SI == FallThrough) {
> + if (!found) {
> + found = true;
> + ++SI;
> + } else {
> + SI = Pred->removeSuccessor(SI);
> + }
> + } else {
> + ++SI;
> + }
> + }
> }
> -
> // If MBB was the target of a jump table, update jump tables
> to go to the
> // fallthrough instead.
> MBB->getParent()->getJumpTableInfo()->
>
> Added: llvm/trunk/test/CodeGen/X86/2009-08-06-branchfolder-crash.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2009-08-06-branchfolder-crash.ll?rev=78351&view=auto
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/test/CodeGen/X86/2009-08-06-branchfolder-crash.ll
> (added)
> +++ llvm/trunk/test/CodeGen/X86/2009-08-06-branchfolder-crash.ll Thu
> Aug 6 17:56:40 2009
> @@ -0,0 +1,90 @@
> +; RUN: llvm-as < %s | llc -O3
> +; PR4626
> +; ModuleID = '<stdin>'
> +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-
> i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-
> f80:32:32"
> +target triple = "i386-pc-linux-gnu"
> + at g_3 = common global i8 0, align 1 ; <i8*> [#uses=2]
> +
> +define signext i8 @safe_mul_func_int16_t_s_s(i32 %_si1, i8 signext
> %_si2) nounwind readnone {
> +entry:
> + %tobool = icmp eq i32 %_si1, 0 ; <i1> [#uses=1]
> + %cmp = icmp sgt i8 %_si2, 0 ; <i1> [#uses=2]
> + %or.cond = or i1 %cmp, %tobool ; <i1> [#uses=1]
> + br i1 %or.cond, label %lor.rhs, label %land.lhs.true3
> +
> +land.lhs.true3: ; preds = %entry
> + %conv5 = sext i8 %_si2 to i32 ; <i32> [#uses=1]
> + %cmp7 = icmp slt i32 %conv5, %_si1 ; <i1> [#uses=1]
> + br i1 %cmp7, label %cond.end, label %lor.rhs
> +
> +lor.rhs: ; preds = %land.lhs.true3, %entry
> + %cmp10.not = icmp slt i32 %_si1, 1 ; <i1> [#uses=1]
> + %or.cond23 = and i1 %cmp, %cmp10.not ; <i1> [#uses=1]
> + br i1 %or.cond23, label %lor.end, label %cond.false
> +
> +lor.end: ; preds = %lor.rhs
> + %tobool19 = icmp ne i8 %_si2, 0 ; <i1> [#uses=2]
> + %lor.ext = zext i1 %tobool19 to i32 ; <i32> [#uses=1]
> + br i1 %tobool19, label %cond.end, label %cond.false
> +
> +cond.false: ; preds = %lor.end, %lor.rhs
> + %conv21 = sext i8 %_si2 to i32 ; <i32> [#uses=1]
> + br label %cond.end
> +
> +cond.end: ; preds = %cond.false, %lor.end, %land.lhs.true3
> + %cond = phi i32 [ %conv21, %cond.false ], [ 1, %land.lhs.true3 ],
> [ %lor.ext, %lor.end ] ; <i32> [#uses=1]
> + %conv22 = trunc i32 %cond to i8 ; <i8> [#uses=1]
> + ret i8 %conv22
> +}
> +
> +define i32 @func_34(i8 signext %p_35) nounwind readonly {
> +entry:
> + %tobool = icmp eq i8 %p_35, 0 ; <i1> [#uses=1]
> + br i1 %tobool, label %lor.lhs.false, label %if.then
> +
> +lor.lhs.false: ; preds = %entry
> + %tmp1 = load i8* @g_3 ; <i8> [#uses=1]
> + %tobool3 = icmp eq i8 %tmp1, 0 ; <i1> [#uses=1]
> + br i1 %tobool3, label %return, label %if.then
> +
> +if.then: ; preds = %lor.lhs.false, %entry
> + %tmp4 = load i8* @g_3 ; <i8> [#uses=1]
> + %conv5 = sext i8 %tmp4 to i32 ; <i32> [#uses=1]
> + ret i32 %conv5
> +
> +return: ; preds = %lor.lhs.false
> + ret i32 0
> +}
> +
> +define void @foo(i32 %p_5) noreturn nounwind {
> +entry:
> + %cmp = icmp sgt i32 %p_5, 0 ; <i1> [#uses=2]
> + %call = tail call i32 @safe() nounwind ; <i32> [#uses=1]
> + %conv1 = trunc i32 %call to i8 ; <i8> [#uses=3]
> + %tobool.i = xor i1 %cmp, true ; <i1> [#uses=3]
> + %cmp.i = icmp sgt i8 %conv1, 0 ; <i1> [#uses=3]
> + %or.cond.i = or i1 %cmp.i, %tobool.i ; <i1> [#uses=1]
> + br i1 %or.cond.i, label %lor.rhs.i, label %land.lhs.true3.i
> +
> +land.lhs.true3.i: ; preds = %entry
> + %xor = zext i1 %cmp to i32 ; <i32> [#uses=1]
> + %conv5.i = sext i8 %conv1 to i32 ; <i32> [#uses=1]
> + %cmp7.i = icmp slt i32 %conv5.i, %xor ; <i1> [#uses=1]
> + %cmp7.i.not = xor i1 %cmp7.i, true ; <i1> [#uses=1]
> + %or.cond23.i = and i1 %cmp.i, %tobool.i ; <i1> [#uses=1]
> + %or.cond = and i1 %cmp7.i.not, %or.cond23.i ; <i1> [#uses=1]
> + br i1 %or.cond, label %lor.end.i, label %for.inc
> +
> +lor.rhs.i: ; preds = %entry
> + %or.cond23.i.old = and i1 %cmp.i, %tobool.i ; <i1> [#uses=1]
> + br i1 %or.cond23.i.old, label %lor.end.i, label %for.inc
> +
> +lor.end.i: ; preds = %lor.rhs.i, %land.lhs.true3.i
> + %tobool19.i = icmp eq i8 %conv1, 0 ; <i1> [#uses=0]
> + br label %for.inc
> +
> +for.inc: ; preds = %for.inc, %lor.end.i, %lor.rhs.i,
> %land.lhs.true3.i
> + br label %for.inc
> +}
> +
> +declare i32 @safe()
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list