1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -inline -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; Test that bar and bar2 are both inlined throughout and removed. 3*9880d681SAndroid Build Coastguard Worker@A = weak global i32 0 ; <i32*> [#uses=1] 4*9880d681SAndroid Build Coastguard Worker@B = weak global i32 0 ; <i32*> [#uses=1] 5*9880d681SAndroid Build Coastguard Worker@C = weak global i32 0 ; <i32*> [#uses=1] 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine fastcc void @foo(i32 %X) { 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo( 10*9880d681SAndroid Build Coastguard Worker %ALL = alloca i32, align 4 ; <i32*> [#uses=1] 11*9880d681SAndroid Build Coastguard Worker %tmp1 = and i32 %X, 1 ; <i32> [#uses=1] 12*9880d681SAndroid Build Coastguard Worker %tmp1.upgrd.1 = icmp eq i32 %tmp1, 0 ; <i1> [#uses=1] 13*9880d681SAndroid Build Coastguard Worker br i1 %tmp1.upgrd.1, label %cond_next, label %cond_true 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workercond_true: ; preds = %entry 16*9880d681SAndroid Build Coastguard Worker store i32 1, i32* @A 17*9880d681SAndroid Build Coastguard Worker br label %cond_next 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workercond_next: ; preds = %cond_true, %entry 20*9880d681SAndroid Build Coastguard Worker %tmp4 = and i32 %X, 2 ; <i32> [#uses=1] 21*9880d681SAndroid Build Coastguard Worker %tmp4.upgrd.2 = icmp eq i32 %tmp4, 0 ; <i1> [#uses=1] 22*9880d681SAndroid Build Coastguard Worker br i1 %tmp4.upgrd.2, label %cond_next7, label %cond_true5 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workercond_true5: ; preds = %cond_next 25*9880d681SAndroid Build Coastguard Worker store i32 1, i32* @B 26*9880d681SAndroid Build Coastguard Worker br label %cond_next7 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workercond_next7: ; preds = %cond_true5, %cond_next 29*9880d681SAndroid Build Coastguard Worker %tmp10 = and i32 %X, 4 ; <i32> [#uses=1] 30*9880d681SAndroid Build Coastguard Worker %tmp10.upgrd.3 = icmp eq i32 %tmp10, 0 ; <i1> [#uses=1] 31*9880d681SAndroid Build Coastguard Worker br i1 %tmp10.upgrd.3, label %cond_next13, label %cond_true11 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workercond_true11: ; preds = %cond_next7 34*9880d681SAndroid Build Coastguard Worker store i32 1, i32* @C 35*9880d681SAndroid Build Coastguard Worker br label %cond_next13 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workercond_next13: ; preds = %cond_true11, %cond_next7 38*9880d681SAndroid Build Coastguard Worker %tmp16 = and i32 %X, 8 ; <i32> [#uses=1] 39*9880d681SAndroid Build Coastguard Worker %tmp16.upgrd.4 = icmp eq i32 %tmp16, 0 ; <i1> [#uses=1] 40*9880d681SAndroid Build Coastguard Worker br i1 %tmp16.upgrd.4, label %UnifiedReturnBlock, label %cond_true17 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workercond_true17: ; preds = %cond_next13 43*9880d681SAndroid Build Coastguard Worker call void @ext( i32* %ALL ) 44*9880d681SAndroid Build Coastguard Worker ret void 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard WorkerUnifiedReturnBlock: ; preds = %cond_next13 47*9880d681SAndroid Build Coastguard Worker ret void 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @bar( 51*9880d681SAndroid Build Coastguard Workerdefine internal fastcc void @bar(i32 %X) { 52*9880d681SAndroid Build Coastguard Workerentry: 53*9880d681SAndroid Build Coastguard Worker %ALL = alloca i32, align 4 ; <i32*> [#uses=1] 54*9880d681SAndroid Build Coastguard Worker %tmp1 = and i32 %X, 1 ; <i32> [#uses=1] 55*9880d681SAndroid Build Coastguard Worker %tmp1.upgrd.1 = icmp eq i32 %tmp1, 0 ; <i1> [#uses=1] 56*9880d681SAndroid Build Coastguard Worker br i1 %tmp1.upgrd.1, label %cond_next, label %cond_true 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workercond_true: ; preds = %entry 59*9880d681SAndroid Build Coastguard Worker store i32 1, i32* @A 60*9880d681SAndroid Build Coastguard Worker br label %cond_next 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workercond_next: ; preds = %cond_true, %entry 63*9880d681SAndroid Build Coastguard Worker %tmp4 = and i32 %X, 2 ; <i32> [#uses=1] 64*9880d681SAndroid Build Coastguard Worker %tmp4.upgrd.2 = icmp eq i32 %tmp4, 0 ; <i1> [#uses=1] 65*9880d681SAndroid Build Coastguard Worker br i1 %tmp4.upgrd.2, label %cond_next7, label %cond_true5 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workercond_true5: ; preds = %cond_next 68*9880d681SAndroid Build Coastguard Worker store i32 1, i32* @B 69*9880d681SAndroid Build Coastguard Worker br label %cond_next7 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workercond_next7: ; preds = %cond_true5, %cond_next 72*9880d681SAndroid Build Coastguard Worker %tmp10 = and i32 %X, 4 ; <i32> [#uses=1] 73*9880d681SAndroid Build Coastguard Worker %tmp10.upgrd.3 = icmp eq i32 %tmp10, 0 ; <i1> [#uses=1] 74*9880d681SAndroid Build Coastguard Worker br i1 %tmp10.upgrd.3, label %cond_next13, label %cond_true11 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workercond_true11: ; preds = %cond_next7 77*9880d681SAndroid Build Coastguard Worker store i32 1, i32* @C 78*9880d681SAndroid Build Coastguard Worker br label %cond_next13 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workercond_next13: ; preds = %cond_true11, %cond_next7 81*9880d681SAndroid Build Coastguard Worker %tmp16 = and i32 %X, 8 ; <i32> [#uses=1] 82*9880d681SAndroid Build Coastguard Worker %tmp16.upgrd.4 = icmp eq i32 %tmp16, 0 ; <i1> [#uses=1] 83*9880d681SAndroid Build Coastguard Worker br i1 %tmp16.upgrd.4, label %UnifiedReturnBlock, label %cond_true17 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workercond_true17: ; preds = %cond_next13 86*9880d681SAndroid Build Coastguard Worker call void @foo( i32 %X ) 87*9880d681SAndroid Build Coastguard Worker ret void 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard WorkerUnifiedReturnBlock: ; preds = %cond_next13 90*9880d681SAndroid Build Coastguard Worker ret void 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine internal fastcc void @bar2(i32 %X) { 94*9880d681SAndroid Build Coastguard Workerentry: 95*9880d681SAndroid Build Coastguard Worker call void @foo( i32 %X ) 96*9880d681SAndroid Build Coastguard Worker ret void 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdeclare void @ext(i32*) 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerdefine void @test(i32 %X) { 102*9880d681SAndroid Build Coastguard Workerentry: 103*9880d681SAndroid Build Coastguard Worker; CHECK: test 104*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @bar( 105*9880d681SAndroid Build Coastguard Worker tail call fastcc void @bar( i32 %X ) 106*9880d681SAndroid Build Coastguard Worker tail call fastcc void @bar( i32 %X ) 107*9880d681SAndroid Build Coastguard Worker tail call fastcc void @bar2( i32 %X ) 108*9880d681SAndroid Build Coastguard Worker tail call fastcc void @bar2( i32 %X ) 109*9880d681SAndroid Build Coastguard Worker ret void 110*9880d681SAndroid Build Coastguard Worker; CHECK: ret 111*9880d681SAndroid Build Coastguard Worker} 112