From fddc50266b80b03da6d0489f3c313ba3042459a2 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 22 Apr 2008 07:05:46 +0000 Subject: Teach jump threading to thread through blocks like: br (and X, phi(Y, Z, false)), label L1, label L2 This triggers once on 252.eon and 6 times on 176.gcc. Blocks in question often look like this: bb262: ; preds = %bb261, %bb248 %iftmp.251.0 = phi i1 [ true, %bb261 ], [ false, %bb248 ] ; [#uses=4] %tmp270 = icmp eq %struct.rtx_def* %tmp.0.i, null ; [#uses=1] %bothcond = or i1 %iftmp.251.0, %tmp270 ; [#uses=1] br i1 %bothcond, label %bb288, label %bb273 In this case, it is clear that it doesn't matter if tmp.0.i is null when coming from bb261. When coming from bb248, it is all that matters. Another random example: check_asm_operands.exit: ; preds = %check_asm_operands.exit.thr_comm, %bb30.i, %bb12.i, %bb6.i413 %tmp.0.i420 = phi i1 [ true, %bb6.i413 ], [ true, %bb12.i ], [ true, %bb30.i ], [ false, %check_asm_operands.exit.thr_comm ; [#uses=1] call void @llvm.stackrestore( i8* %savedstack ) nounwind %tmp4389 = icmp eq i32 %added_sets_1.0, 0 ; [#uses=1] %tmp4394 = icmp eq i32 %added_sets_2.0, 0 ; [#uses=1] %bothcond80 = and i1 %tmp4389, %tmp4394 ; [#uses=1] %bothcond81 = and i1 %bothcond80, %tmp.0.i420 ; [#uses=1] br i1 %bothcond81, label %bb4398, label %bb4397 Here is the case from 252.eon: bb290.i.i: ; preds = %bb23.i57.i.i, %bb8.i39.i.i, %bb100.i.i, %bb100.i.i, %bb85.i.i110 %myEOF.1.i.i = phi i1 [ true, %bb100.i.i ], [ true, %bb100.i.i ], [ true, %bb85.i.i110 ], [ true, %bb8.i39.i.i ], [ false, %bb23.i57.i.i ] ; [#uses=2] %i.4.i.i = phi i32 [ %i.1.i.i, %bb85.i.i110 ], [ %i.0.i.i, %bb100.i.i ], [ %i.0.i.i, %bb100.i.i ], [ %i.3.i.i, %bb8.i39.i.i ], [ %i.3.i.i, %bb23.i57.i.i ] ; [#uses=3] %tmp292.i.i = load i8* %tmp16.i.i100, align 1 ; [#uses=1] %tmp293.not.i.i = icmp ne i8 %tmp292.i.i, 0 ; [#uses=1] %bothcond.i.i = and i1 %tmp293.not.i.i, %myEOF.1.i.i ; [#uses=1] br i1 %bothcond.i.i, label %bb202.i.i, label %bb301.i.i Factoring out 3 common predecessors. On the path from any blocks other than bb23.i57.i.i, the load and compare are dead. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50096 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Transforms/JumpThreading/and-cond.ll | 32 +++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 test/Transforms/JumpThreading/and-cond.ll (limited to 'test/Transforms') diff --git a/test/Transforms/JumpThreading/and-cond.ll b/test/Transforms/JumpThreading/and-cond.ll new file mode 100644 index 0000000..b01c4ba --- /dev/null +++ b/test/Transforms/JumpThreading/and-cond.ll @@ -0,0 +1,32 @@ +; RUN: llvm-as < %s | opt -jump-threading -mem2reg -instcombine -simplifycfg | llvm-dis | grep {ret i32 %v1} +; There should be no uncond branches left. +; RUN: llvm-as < %s | opt -jump-threading -mem2reg -instcombine -simplifycfg | llvm-dis | not grep {br label} + +declare i32 @f1() +declare i32 @f2() +declare void @f3() + +define i32 @test(i1 %cond, i1 %cond2) { + br i1 %cond, label %T1, label %F1 + +T1: + %v1 = call i32 @f1() + br label %Merge + +F1: + %v2 = call i32 @f2() + br label %Merge + +Merge: + %A = phi i1 [true, %T1], [false, %F1] + %B = phi i32 [%v1, %T1], [%v2, %F1] + %C = and i1 %A, %cond2 + br i1 %C, label %T2, label %F2 + +T2: + call void @f3() + ret i32 %B + +F2: + ret i32 %B +} -- cgit v1.1