Eliminate the first have of the optimization which eliminates BRCOND

when the condition is constant. This optimization shouldn't be
necessary, because codegen shouldn't be able to find dead control
paths that the IR-level optimizer can't find. And it's undesirable,
because it encourages bugpoint to leave "br i1 false" branches
in its output. And it wasn't updating the CFG.

I updated all the tests I could, but some tests are too reduced
and I wasn't able to meaningfully preserve them.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106748 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dan Gohman 2010-06-24 15:04:11 +00:00
parent 9e4f243de7
commit 102f3851bb
9 changed files with 7 additions and 294 deletions

View File

@ -3047,9 +3047,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
break;
case ISD::BRCOND:
if (N2C) {
if (N2C->getZExtValue()) // Unconditional branch
return getNode(ISD::BR, DL, MVT::Other, N1, N3);
else
if (!N2C->getZExtValue()) // Unconditional branch
return N1; // Never-taken branch
}
break;

View File

@ -1,21 +0,0 @@
; RUN: llc < %s -march=ppc64 -enable-ppc64-regscavenger
@.str242 = external constant [3 x i8] ; <[3 x i8]*> [#uses=1]
define fastcc void @ParseContent(i8* %buf, i32 %bufsize) {
entry:
%items = alloca [10000 x i8*], align 16 ; <[10000 x i8*]*> [#uses=0]
%tmp86 = add i32 0, -1 ; <i32> [#uses=1]
br i1 false, label %cond_true94, label %cond_next99
cond_true94: ; preds = %entry
%tmp98 = call i32 (i8*, ...)* @printf( i8* getelementptr ([3 x i8]* @.str242, i32 0, i32 0), i8* null ) ; <i32> [#uses=0]
%tmp20971 = icmp sgt i32 %tmp86, 0 ; <i1> [#uses=1]
br i1 %tmp20971, label %bb101, label %bb212
cond_next99: ; preds = %entry
ret void
bb101: ; preds = %cond_true94
ret void
bb212: ; preds = %cond_true94
ret void
}
declare i32 @printf(i8*, ...)

View File

@ -25,10 +25,7 @@ entry:
; CHECK: ldr.w r9, [r7, #28]
%xgaps.i = alloca [32 x %union.rec*], align 4 ; <[32 x %union.rec*]*> [#uses=0]
%ycomp.i = alloca [32 x %union.rec*], align 4 ; <[32 x %union.rec*]*> [#uses=0]
br i1 false, label %bb, label %bb20
bb: ; preds = %entry
unreachable
br label %bb20
bb20: ; preds = %entry
switch i32 undef, label %bb1287 [

View File

@ -15,14 +15,14 @@ bb77: ; preds = %entry, %entry
%tmp99 = udiv i64 0, 0 ; <i64> [#uses=1]
%tmp = load i8* null ; <i8> [#uses=1]
%tmp114 = icmp eq i64 0, 0 ; <i1> [#uses=1]
br i1 %tmp114, label %cond_true115, label %cond_next136
br label %cond_true115
bb84: ; preds = %entry
ret void
cond_true115: ; preds = %bb77
%tmp118 = load i8* null ; <i8> [#uses=1]
br i1 false, label %cond_next129, label %cond_true120
br label %cond_true120
cond_true120: ; preds = %cond_true115
%tmp127 = udiv i8 %tmp, %tmp118 ; <i8> [#uses=1]
@ -30,7 +30,7 @@ cond_true120: ; preds = %cond_true115
br label %cond_next129
cond_next129: ; preds = %cond_true120, %cond_true115
%iftmp.30.0 = phi i64 [ %tmp127.upgrd.1, %cond_true120 ], [ 0, %cond_true115 ] ; <i64> [#uses=1]
%iftmp.30.0 = phi i64 [ %tmp127.upgrd.1, %cond_true120 ] ; <i64> [#uses=1]
%tmp132 = icmp eq i64 %iftmp.30.0, %tmp99 ; <i1> [#uses=1]
br i1 %tmp132, label %cond_false148, label %cond_next136

View File

@ -9,10 +9,7 @@ cond_next127: ; preds = %cond_next391, %entry
%tmp149 = mul i32 0, %v.1 ; <i32> [#uses=0]
%tmp254 = and i32 0, 15 ; <i32> [#uses=1]
%tmp256 = and i32 0, 15 ; <i32> [#uses=2]
br i1 false, label %cond_true267, label %cond_next391
cond_true267: ; preds = %cond_next127
ret i16 0
br label %cond_next391
cond_next391: ; preds = %cond_next127
%tmp393 = load i32* %ss, align 4 ; <i32> [#uses=1]

View File

@ -1,68 +0,0 @@
; RUN: llc < %s -march=x86 -x86-asm-syntax=att | grep movl | count 2
; RUN: llc < %s -march=x86 -x86-asm-syntax=att | not grep movb
%struct.double_int = type { i64, i64 }
%struct.tree_common = type <{ i8, [3 x i8] }>
%struct.tree_int_cst = type { %struct.tree_common, %struct.double_int }
%struct.tree_node = type { %struct.tree_int_cst }
@tree_code_type = external constant [0 x i32] ; <[0 x i32]*> [#uses=1]
define i32 @simple_cst_equal(%struct.tree_node* %t1, %struct.tree_node* %t2) nounwind {
entry:
%tmp2526 = bitcast %struct.tree_node* %t1 to i32* ; <i32*> [#uses=1]
br i1 false, label %UnifiedReturnBlock, label %bb21
bb21: ; preds = %entry
%tmp27 = load i32* %tmp2526, align 4 ; <i32> [#uses=1]
%tmp29 = and i32 %tmp27, 255 ; <i32> [#uses=3]
%tmp2930 = trunc i32 %tmp29 to i8 ; <i8> [#uses=1]
%tmp37 = load i32* null, align 4 ; <i32> [#uses=1]
%tmp39 = and i32 %tmp37, 255 ; <i32> [#uses=2]
%tmp3940 = trunc i32 %tmp39 to i8 ; <i8> [#uses=1]
%tmp43 = add i32 %tmp29, -3 ; <i32> [#uses=1]
%tmp44 = icmp ult i32 %tmp43, 3 ; <i1> [#uses=1]
br i1 %tmp44, label %bb47.split, label %bb76
bb47.split: ; preds = %bb21
ret i32 0
bb76: ; preds = %bb21
br i1 false, label %bb82, label %bb146.split
bb82: ; preds = %bb76
%tmp94 = getelementptr [0 x i32]* @tree_code_type, i32 0, i32 %tmp39 ; <i32*> [#uses=1]
%tmp95 = load i32* %tmp94, align 4 ; <i32> [#uses=1]
%tmp9596 = trunc i32 %tmp95 to i8 ; <i8> [#uses=1]
%tmp98 = add i8 %tmp9596, -4 ; <i8> [#uses=1]
%tmp99 = icmp ugt i8 %tmp98, 5 ; <i1> [#uses=1]
br i1 %tmp99, label %bb102, label %bb106
bb102: ; preds = %bb82
ret i32 0
bb106: ; preds = %bb82
ret i32 0
bb146.split: ; preds = %bb76
%tmp149 = icmp eq i8 %tmp2930, %tmp3940 ; <i1> [#uses=1]
br i1 %tmp149, label %bb153, label %UnifiedReturnBlock
bb153: ; preds = %bb146.split
switch i32 %tmp29, label %UnifiedReturnBlock [
i32 0, label %bb155
i32 1, label %bb187
]
bb155: ; preds = %bb153
ret i32 0
bb187: ; preds = %bb153
%tmp198 = icmp eq %struct.tree_node* %t1, %t2 ; <i1> [#uses=1]
br i1 %tmp198, label %bb201, label %UnifiedReturnBlock
bb201: ; preds = %bb187
ret i32 0
UnifiedReturnBlock: ; preds = %bb187, %bb153, %bb146.split, %entry
ret i32 0
}

View File

@ -1,160 +0,0 @@
; RUN: llc < %s -relocation-model=pic -disable-fp-elim -mtriple=i386-apple-darwin -stats |& grep asm-printer | grep 41
; RUN: llc < %s -relocation-model=pic -disable-fp-elim -mtriple=i386-apple-darwin | FileCheck %s
%struct.XXDActiveTextureTargets = type { i64, i64, i64, i64, i64, i64 }
%struct.XXDAlphaTest = type { float, i16, i8, i8 }
%struct.XXDArrayRange = type { i8, i8, i8, i8 }
%struct.XXDBlendMode = type { i16, i16, i16, i16, %struct.XXTColor4, i16, i16, i8, i8, i8, i8 }
%struct.XXDClearColor = type { double, %struct.XXTColor4, %struct.XXTColor4, float, i32 }
%struct.XXDClipPlane = type { i32, [6 x %struct.XXTColor4] }
%struct.XXDColorBuffer = type { i16, i8, i8, [8 x i16], i8, i8, i8, i8 }
%struct.XXDColorMatrix = type { [16 x float]*, %struct.XXDImagingCC }
%struct.XXDConvolution = type { %struct.XXTColor4, %struct.XXDImagingCC, i16, i16, [0 x i32], float*, i32, i32 }
%struct.XXDDepthTest = type { i16, i16, i8, i8, i8, i8, double, double }
%struct.XXDFixedFunction = type { %struct.YYToken* }
%struct.XXDFogMode = type { %struct.XXTColor4, float, float, float, float, float, i16, i16, i16, i8, i8 }
%struct.XXDHintMode = type { i16, i16, i16, i16, i16, i16, i16, i16, i16, i16 }
%struct.XXDHistogram = type { %struct.XXTFixedColor4*, i32, i16, i8, i8 }
%struct.XXDImagingCC = type { { float, float }, { float, float }, { float, float }, { float, float } }
%struct.XXDImagingSubset = type { %struct.XXDConvolution, %struct.XXDConvolution, %struct.XXDConvolution, %struct.XXDColorMatrix, %struct.XXDMinmax, %struct.XXDHistogram, %struct.XXDImagingCC, %struct.XXDImagingCC, %struct.XXDImagingCC, %struct.XXDImagingCC, i32, [0 x i32] }
%struct.XXDLight = type { %struct.XXTColor4, %struct.XXTColor4, %struct.XXTColor4, %struct.XXTColor4, %struct.XXTCoord3, float, float, float, float, float, %struct.XXTCoord3, float, %struct.XXTCoord3, float, %struct.XXTCoord3, float, float, float, float, float }
%struct.XXDLightModel = type { %struct.XXTColor4, [8 x %struct.XXDLight], [2 x %struct.XXDMaterial], i32, i16, i16, i16, i8, i8, i8, i8, i8, i8 }
%struct.XXDLightProduct = type { %struct.XXTColor4, %struct.XXTColor4, %struct.XXTColor4 }
%struct.XXDLineMode = type { float, i32, i16, i16, i8, i8, i8, i8 }
%struct.XXDLogicOp = type { i16, i8, i8 }
%struct.XXDMaskMode = type { i32, [3 x i32], i8, i8, i8, i8, i8, i8, i8, i8 }
%struct.XXDMaterial = type { %struct.XXTColor4, %struct.XXTColor4, %struct.XXTColor4, %struct.XXTColor4, float, float, float, float, [8 x %struct.XXDLightProduct], %struct.XXTColor4, [8 x i32] }
%struct.XXDMinmax = type { %struct.XXDMinmaxTable*, i16, i8, i8, [0 x i32] }
%struct.XXDMinmaxTable = type { %struct.XXTColor4, %struct.XXTColor4 }
%struct.XXDMultisample = type { float, i8, i8, i8, i8, i8, i8, i8, i8 }
%struct.XXDPipelineProgramState = type { i8, i8, i8, i8, [0 x i32], %struct.XXTColor4* }
%struct.XXDPixelMap = type { i32*, float*, float*, float*, float*, float*, float*, float*, float*, i32*, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }
%struct.XXDPixelMode = type { float, float, %struct.XXDPixelStore, %struct.XXDPixelTransfer, %struct.XXDPixelMap, %struct.XXDImagingSubset, i32, i32 }
%struct.XXDPixelPack = type { i32, i32, i32, i32, i32, i32, i32, i32, i8, i8, i8, i8 }
%struct.XXDPixelStore = type { %struct.XXDPixelPack, %struct.XXDPixelPack }
%struct.XXDPixelTransfer = type { float, float, float, float, float, float, float, float, float, float, i32, i32, float, float, float, float, float, float, float, float, float, float, float, float }
%struct.XXDPointMode = type { float, float, float, float, %struct.XXTCoord3, float, i8, i8, i8, i8, i16, i16, i32, i16, i16 }
%struct.XXDPolygonMode = type { [128 x i8], float, float, i16, i16, i16, i16, i8, i8, i8, i8, i8, i8, i8, i8 }
%struct.XXDRegisterCombiners = type { i8, i8, i8, i8, i32, [2 x %struct.XXTColor4], [8 x %struct.XXDRegisterCombinersPerStageState], %struct.XXDRegisterCombinersFinalStageState }
%struct.XXDRegisterCombinersFinalStageState = type { i8, i8, i8, i8, [7 x %struct.XXDRegisterCombinersPerVariableState] }
%struct.XXDRegisterCombinersPerPortionState = type { [4 x %struct.XXDRegisterCombinersPerVariableState], i8, i8, i8, i8, i16, i16, i16, i16, i16, i16 }
%struct.XXDRegisterCombinersPerStageState = type { [2 x %struct.XXDRegisterCombinersPerPortionState], [2 x %struct.XXTColor4] }
%struct.XXDRegisterCombinersPerVariableState = type { i16, i16, i16, i16 }
%struct.XXDScissorTest = type { %struct.XXTFixedColor4, i8, i8, i8, i8 }
%struct.XXDState = type <{ i16, i16, i16, i16, i32, i32, [256 x %struct.XXTColor4], [128 x %struct.XXTColor4], %struct.XXDViewport, %struct.XXDTransform, %struct.XXDLightModel, %struct.XXDActiveTextureTargets, %struct.XXDAlphaTest, %struct.XXDBlendMode, %struct.XXDClearColor, %struct.XXDColorBuffer, %struct.XXDDepthTest, %struct.XXDArrayRange, %struct.XXDFogMode, %struct.XXDHintMode, %struct.XXDLineMode, %struct.XXDLogicOp, %struct.XXDMaskMode, %struct.XXDPixelMode, %struct.XXDPointMode, %struct.XXDPolygonMode, %struct.XXDScissorTest, i32, %struct.XXDStencilTest, [8 x %struct.XXDTextureMode], [16 x %struct.XXDTextureImageMode], %struct.XXDArrayRange, [8 x %struct.XXDTextureCoordGen], %struct.XXDClipPlane, %struct.XXDMultisample, %struct.XXDRegisterCombiners, %struct.XXDArrayRange, %struct.XXDArrayRange, [3 x %struct.XXDPipelineProgramState], %struct.XXDArrayRange, %struct.XXDTransformFeedback, i32*, %struct.XXDFixedFunction, [3 x i32], [2 x i32] }>
%struct.XXDStencilTest = type { [3 x { i32, i32, i16, i16, i16, i16 }], i32, [4 x i8] }
%struct.XXDTextureCoordGen = type { { i16, i16, %struct.XXTColor4, %struct.XXTColor4 }, { i16, i16, %struct.XXTColor4, %struct.XXTColor4 }, { i16, i16, %struct.XXTColor4, %struct.XXTColor4 }, { i16, i16, %struct.XXTColor4, %struct.XXTColor4 }, i8, i8, i8, i8 }
%struct.XXDTextureImageMode = type { float }
%struct.XXDTextureMode = type { %struct.XXTColor4, i32, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, float, float, i16, i16, i16, i16, i16, i16, [4 x i16], i8, i8, i8, i8, [3 x float], [4 x float], float, float }
%struct.XXDTextureRec = type opaque
%struct.XXDTransform = type <{ [24 x [16 x float]], [24 x [16 x float]], [16 x float], float, float, float, float, float, i8, i8, i8, i8, i32, i32, i32, i16, i16, i8, i8, i8, i8, i32 }>
%struct.XXDTransformFeedback = type { i8, i8, i8, i8, [0 x i32], [16 x i32], [16 x i32] }
%struct.XXDViewport = type { float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, double, double, i32, i32, i32, i32, float, float, float, float }
%struct.XXTColor4 = type { float, float, float, float }
%struct.XXTCoord3 = type { float, float, float }
%struct.XXTFixedColor4 = type { i32, i32, i32, i32 }
%struct.XXVMTextures = type { [16 x %struct.XXDTextureRec*] }
%struct.XXVMVPContext = type { i32 }
%struct.XXVMVPStack = type { i32, i32 }
%struct.YYToken = type { { i16, i16, i32 } }
%struct._XXVMConstants = type { <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, float, float, float, float, float, float, float, float, float, float, float, float, [256 x float], [4096 x i8], [8 x float], [48 x float], [128 x float], [528 x i8], { void (i8*, i8*, i32, i8*)*, float (float)*, float (float)*, float (float)*, i32 (float)* } }
@llvm.used = appending global [1 x i8*] [ i8* bitcast (void (%struct.XXDState*, <4 x float>*, <4 x float>**, %struct._XXVMConstants*, %struct.YYToken*, %struct.XXVMVPContext*, %struct.XXVMTextures*, %struct.XXVMVPStack*, <4 x float>*, <4 x float>*, <4 x float>*, <4 x float>*, <4 x float>*, <4 x float>*, <4 x float>*, <4 x float>*, [4 x <4 x float>]*, i32*, <4 x i32>*, i64)* @t to i8*) ], section "llvm.metadata" ; <[1 x i8*]*> [#uses=0]
define void @t(%struct.XXDState* %gldst, <4 x float>* %prgrm, <4 x float>** %buffs, %struct._XXVMConstants* %cnstn, %struct.YYToken* %pstrm, %struct.XXVMVPContext* %vmctx, %struct.XXVMTextures* %txtrs, %struct.XXVMVPStack* %vpstk, <4 x float>* %atr0, <4 x float>* %atr1, <4 x float>* %atr2, <4 x float>* %atr3, <4 x float>* %vtx0, <4 x float>* %vtx1, <4 x float>* %vtx2, <4 x float>* %vtx3, [4 x <4 x float>]* %tmpGbl, i32* %oldMsk, <4 x i32>* %adrGbl, i64 %key_token) nounwind {
entry:
; CHECK: t:
%0 = trunc i64 %key_token to i32 ; <i32> [#uses=1]
%1 = getelementptr %struct.YYToken* %pstrm, i32 %0 ; <%struct.YYToken*> [#uses=5]
br label %bb1132
bb51: ; preds = %bb1132
; CHECK: .align 4
; CHECK: xorl %ecx, %ecx
; CHECK: andl $7
%2 = getelementptr %struct.YYToken* %1, i32 %operation.0.rec, i32 0, i32 0 ; <i16*> [#uses=1]
%3 = load i16* %2, align 1 ; <i16> [#uses=3]
%4 = lshr i16 %3, 6 ; <i16> [#uses=1]
%5 = trunc i16 %4 to i8 ; <i8> [#uses=1]
%6 = zext i8 %5 to i32 ; <i32> [#uses=1]
%7 = trunc i16 %3 to i8 ; <i8> [#uses=1]
%8 = and i8 %7, 7 ; <i8> [#uses=1]
%mask5556 = zext i8 %8 to i32 ; <i32> [#uses=3]
%.sum1324 = add i32 %mask5556, 2 ; <i32> [#uses=1]
%.rec = add i32 %operation.0.rec, %.sum1324 ; <i32> [#uses=1]
%9 = bitcast %struct.YYToken* %operation.0 to i32* ; <i32*> [#uses=1]
%10 = load i32* %9, align 1 ; <i32> [#uses=1]
%11 = lshr i32 %10, 16 ; <i32> [#uses=2]
%12 = trunc i32 %11 to i8 ; <i8> [#uses=1]
%13 = and i8 %12, 1 ; <i8> [#uses=1]
%14 = lshr i16 %3, 15 ; <i16> [#uses=1]
%15 = trunc i16 %14 to i8 ; <i8> [#uses=1]
%16 = or i8 %13, %15 ; <i8> [#uses=1]
%17 = icmp eq i8 %16, 0 ; <i1> [#uses=1]
br i1 %17, label %bb94, label %bb75
bb75: ; preds = %bb51
%18 = getelementptr %struct.YYToken* %1, i32 0, i32 0, i32 0 ; <i16*> [#uses=1]
%19 = load i16* %18, align 4 ; <i16> [#uses=1]
%20 = load i16* null, align 2 ; <i16> [#uses=1]
%21 = zext i16 %19 to i64 ; <i64> [#uses=1]
%22 = zext i16 %20 to i64 ; <i64> [#uses=1]
%23 = shl i64 %22, 16 ; <i64> [#uses=1]
%.ins1177 = or i64 %23, %21 ; <i64> [#uses=1]
%.ins1175 = or i64 %.ins1177, 0 ; <i64> [#uses=1]
%24 = and i32 %11, 1 ; <i32> [#uses=1]
%.neg1333 = sub i32 %mask5556, %24 ; <i32> [#uses=1]
%.neg1335 = sub i32 %.neg1333, 0 ; <i32> [#uses=1]
%25 = sub i32 %.neg1335, 0 ; <i32> [#uses=1]
br label %bb94
bb94: ; preds = %bb75, %bb51
%extraToken.0 = phi i64 [ %.ins1175, %bb75 ], [ %extraToken.1, %bb51 ] ; <i64> [#uses=1]
%argCount.0 = phi i32 [ %25, %bb75 ], [ %mask5556, %bb51 ] ; <i32> [#uses=1]
%operation.0.sum1392 = add i32 %operation.0.rec, 1 ; <i32> [#uses=2]
%26 = getelementptr %struct.YYToken* %1, i32 %operation.0.sum1392, i32 0, i32 0 ; <i16*> [#uses=1]
%27 = load i16* %26, align 4 ; <i16> [#uses=1]
%28 = getelementptr %struct.YYToken* %1, i32 %operation.0.sum1392, i32 0, i32 1 ; <i16*> [#uses=1]
%29 = load i16* %28, align 2 ; <i16> [#uses=1]
store i16 %27, i16* null, align 8
store i16 %29, i16* null, align 2
br i1 false, label %bb1132, label %bb110
bb110: ; preds = %bb94
switch i32 %6, label %bb1078 [
i32 30, label %bb960
i32 32, label %bb801
i32 38, label %bb809
i32 78, label %bb1066
]
bb801: ; preds = %bb110
unreachable
bb809: ; preds = %bb110
unreachable
bb960: ; preds = %bb110
%30 = icmp eq i32 %argCount.0, 1 ; <i1> [#uses=1]
br i1 %30, label %bb962, label %bb965
bb962: ; preds = %bb960
unreachable
bb965: ; preds = %bb960
unreachable
bb1066: ; preds = %bb110
unreachable
bb1078: ; preds = %bb110
unreachable
bb1132: ; preds = %bb94, %entry
%extraToken.1 = phi i64 [ undef, %entry ], [ %extraToken.0, %bb94 ] ; <i64> [#uses=1]
%operation.0.rec = phi i32 [ 0, %entry ], [ %.rec, %bb94 ] ; <i32> [#uses=4]
%operation.0 = getelementptr %struct.YYToken* %1, i32 %operation.0.rec ; <%struct.YYToken*> [#uses=1]
br i1 false, label %bb1134, label %bb51
bb1134: ; preds = %bb1132
ret void
}

View File

@ -1,29 +0,0 @@
; RUN: llc < %s -march=x86 | not grep mov
%struct.active_line = type { %struct.gs_fixed_point, %struct.gs_fixed_point, i32, i32, i32, %struct.line_segment*, i32, i16, i16, %struct.active_line*, %struct.active_line* }
%struct.gs_fixed_point = type { i32, i32 }
%struct.line_list = type { %struct.active_line*, i32, i16, %struct.active_line*, %struct.active_line*, %struct.active_line*, %struct.active_line, i32 }
%struct.line_segment = type { %struct.line_segment*, %struct.line_segment*, i32, %struct.gs_fixed_point }
%struct.subpath = type { %struct.line_segment*, %struct.line_segment*, i32, %struct.gs_fixed_point, %struct.line_segment*, i32, i32, i8 }
define fastcc void @add_y_list(%struct.subpath* %ppath.0.4.val, i16 signext %tag, %struct.line_list* %ll, i32 %pbox.0.0.1.val, i32 %pbox.0.1.0.val, i32 %pbox.0.1.1.val) nounwind {
entry:
br i1 false, label %return, label %bb
bb: ; preds = %bb280, %entry
%psub.1.reg2mem.0 = phi %struct.subpath* [ %psub.0.reg2mem.0, %bb280 ], [ undef, %entry ] ; <%struct.subpath*> [#uses=1]
%plast.1.reg2mem.0 = phi %struct.line_segment* [ %plast.0.reg2mem.0, %bb280 ], [ undef, %entry ] ; <%struct.line_segment*> [#uses=1]
%prev_dir.0.reg2mem.0 = phi i32 [ %dir.0.reg2mem.0, %bb280 ], [ undef, %entry ] ; <i32> [#uses=1]
br i1 false, label %bb280, label %bb109
bb109: ; preds = %bb
%tmp113 = icmp sgt i32 0, %prev_dir.0.reg2mem.0 ; <i1> [#uses=1]
br i1 %tmp113, label %bb116, label %bb280
bb116: ; preds = %bb109
ret void
bb280: ; preds = %bb109, %bb
%psub.0.reg2mem.0 = phi %struct.subpath* [ null, %bb ], [ %psub.1.reg2mem.0, %bb109 ] ; <%struct.subpath*> [#uses=1]
%plast.0.reg2mem.0 = phi %struct.line_segment* [ null, %bb ], [ %plast.1.reg2mem.0, %bb109 ] ; <%struct.line_segment*> [#uses=1]
%dir.0.reg2mem.0 = phi i32 [ 0, %bb ], [ 0, %bb109 ] ; <i32> [#uses=1]
br i1 false, label %return, label %bb
return: ; preds = %bb280, %entry
ret void
}

View File

@ -39,8 +39,7 @@ bb650: ; preds = %bb650, %bb428
%tmp659 = icmp eq i8 %tmp658, 0 ; <i1> [#uses=1]
br i1 %tmp659, label %bb650, label %bb662
bb662: ; preds = %bb650
%tmp685 = icmp eq %struct.rec* null, null ; <i1> [#uses=1]
br i1 %tmp685, label %bb761, label %bb688
br label %bb761
bb688: ; preds = %bb662
ret void
bb761: ; preds = %bb662