1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-apple-darwin | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32-n32" 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine i32 @test(i32 %n) nounwind { 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test: 6*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mov 7*9880d681SAndroid Build Coastguard Worker; CHECK: return 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker %0 = icmp eq i32 %n, 1 ; <i1> [#uses=1] 10*9880d681SAndroid Build Coastguard Worker br i1 %0, label %return, label %bb.nph 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerbb.nph: ; preds = %entry 13*9880d681SAndroid Build Coastguard Worker %tmp = add i32 %n, -1 ; <i32> [#uses=1] 14*9880d681SAndroid Build Coastguard Worker br label %bb 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerbb: ; preds = %bb.nph, %bb 17*9880d681SAndroid Build Coastguard Worker %indvar = phi i32 [ 0, %bb.nph ], [ %indvar.next, %bb ] ; <i32> [#uses=1] 18*9880d681SAndroid Build Coastguard Worker %u.05 = phi i64 [ undef, %bb.nph ], [ %ins, %bb ] ; <i64> [#uses=1] 19*9880d681SAndroid Build Coastguard Worker %1 = tail call i32 @f() nounwind ; <i32> [#uses=1] 20*9880d681SAndroid Build Coastguard Worker %tmp4 = zext i32 %1 to i64 ; <i64> [#uses=1] 21*9880d681SAndroid Build Coastguard Worker %mask = and i64 %u.05, -4294967296 ; <i64> [#uses=1] 22*9880d681SAndroid Build Coastguard Worker %ins = or i64 %tmp4, %mask ; <i64> [#uses=2] 23*9880d681SAndroid Build Coastguard Worker tail call void @g(i64 %ins) nounwind 24*9880d681SAndroid Build Coastguard Worker %indvar.next = add i32 %indvar, 1 ; <i32> [#uses=2] 25*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %indvar.next, %tmp ; <i1> [#uses=1] 26*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %return, label %bb 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %bb, %entry 29*9880d681SAndroid Build Coastguard Worker ret i32 undef 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerdefine i32 @test_dead_cycle(i32 %n) nounwind { 33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_dead_cycle: 34*9880d681SAndroid Build Coastguard Worker; CHECK: bl 35*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mov 36*9880d681SAndroid Build Coastguard Worker; CHECK: bl 37*9880d681SAndroid Build Coastguard Workerentry: 38*9880d681SAndroid Build Coastguard Worker %0 = icmp eq i32 %n, 1 ; <i1> [#uses=1] 39*9880d681SAndroid Build Coastguard Worker br i1 %0, label %return, label %bb.nph 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerbb.nph: ; preds = %entry 42*9880d681SAndroid Build Coastguard Worker %tmp = add i32 %n, -1 ; <i32> [#uses=2] 43*9880d681SAndroid Build Coastguard Worker br label %bb 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerbb: ; preds = %bb.nph, %bb2 46*9880d681SAndroid Build Coastguard Worker %indvar = phi i32 [ 0, %bb.nph ], [ %indvar.next, %bb2 ] ; <i32> [#uses=2] 47*9880d681SAndroid Build Coastguard Worker %u.17 = phi i64 [ undef, %bb.nph ], [ %u.0, %bb2 ] ; <i64> [#uses=2] 48*9880d681SAndroid Build Coastguard Worker %tmp9 = sub i32 %tmp, %indvar ; <i32> [#uses=1] 49*9880d681SAndroid Build Coastguard Worker %1 = icmp sgt i32 %tmp9, 1 ; <i1> [#uses=1] 50*9880d681SAndroid Build Coastguard Worker br i1 %1, label %bb1, label %bb2 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %bb 53*9880d681SAndroid Build Coastguard Worker %2 = tail call i32 @f() nounwind ; <i32> [#uses=1] 54*9880d681SAndroid Build Coastguard Worker %tmp6 = zext i32 %2 to i64 ; <i64> [#uses=1] 55*9880d681SAndroid Build Coastguard Worker %mask = and i64 %u.17, -4294967296 ; <i64> [#uses=1] 56*9880d681SAndroid Build Coastguard Worker %ins = or i64 %tmp6, %mask ; <i64> [#uses=1] 57*9880d681SAndroid Build Coastguard Worker tail call void @g(i64 %ins) nounwind 58*9880d681SAndroid Build Coastguard Worker br label %bb2 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerbb2: ; preds = %bb1, %bb 61*9880d681SAndroid Build Coastguard Worker; also check for duplicate induction variables (radar 7645034) 62*9880d681SAndroid Build Coastguard Worker; CHECK: subs r{{.*}}, #1 63*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: subs r{{.*}}, #1 64*9880d681SAndroid Build Coastguard Worker; CHECK: pop 65*9880d681SAndroid Build Coastguard Worker %u.0 = phi i64 [ %ins, %bb1 ], [ %u.17, %bb ] ; <i64> [#uses=2] 66*9880d681SAndroid Build Coastguard Worker %indvar.next = add i32 %indvar, 1 ; <i32> [#uses=2] 67*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %indvar.next, %tmp ; <i1> [#uses=1] 68*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %return, label %bb 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %bb2, %entry 71*9880d681SAndroid Build Coastguard Worker ret i32 undef 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerdeclare i32 @f() 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerdeclare void @g(i64) 77