1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-apple-ios -relocation-model=pic -mcpu=cortex-a8 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Do not move the umull above previous call which would require use of 4*9880d681SAndroid Build Coastguard Worker; more callee-saved registers and introduce copies. 5*9880d681SAndroid Build Coastguard Worker; rdar://9329627 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker%struct.FF = type { i32 (i32*)*, i32 (i32*, i32*, i32, i32, i32, i32)*, i32 (i32, i32, i8*)*, void ()*, i32 (i32, i8*, i32*)*, i32 ()* } 8*9880d681SAndroid Build Coastguard Worker%struct.BD = type { %struct.BD*, i32, i32, i32, i32, i64, i32 (%struct.BD*, i8*, i64, i32)*, i32 (%struct.BD*, i8*, i32, i32)*, i32 (%struct.BD*, i8*, i64, i32)*, i32 (%struct.BD*, i8*, i32, i32)*, i32 (%struct.BD*, i64, i32)*, [16 x i8], i64, i64 } 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker@FuncPtr = external hidden unnamed_addr global %struct.FF* 11*9880d681SAndroid Build Coastguard Worker@.str1 = external hidden unnamed_addr constant [6 x i8], align 4 12*9880d681SAndroid Build Coastguard Worker@G = external unnamed_addr global i32 13*9880d681SAndroid Build Coastguard Worker@.str2 = external hidden unnamed_addr constant [58 x i8], align 4 14*9880d681SAndroid Build Coastguard Worker@.str3 = external hidden unnamed_addr constant [58 x i8], align 4 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdefine i32 @test() nounwind optsize ssp { 17*9880d681SAndroid Build Coastguard Workerentry: 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test: 19*9880d681SAndroid Build Coastguard Worker; CHECK: push 20*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: push 21*9880d681SAndroid Build Coastguard Worker %block_size = alloca i32, align 4 22*9880d681SAndroid Build Coastguard Worker %block_count = alloca i32, align 4 23*9880d681SAndroid Build Coastguard Worker %index_cache = alloca i32, align 4 24*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %index_cache, align 4 25*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* @G, align 4 26*9880d681SAndroid Build Coastguard Worker %tmp1 = call i32 @bar(i32 0, i32 0, i32 %tmp) nounwind 27*9880d681SAndroid Build Coastguard Worker switch i32 %tmp1, label %bb8 [ 28*9880d681SAndroid Build Coastguard Worker i32 0, label %bb 29*9880d681SAndroid Build Coastguard Worker i32 536870913, label %bb4 30*9880d681SAndroid Build Coastguard Worker i32 536870914, label %bb6 31*9880d681SAndroid Build Coastguard Worker ] 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerbb: 34*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32* @G, align 4 35*9880d681SAndroid Build Coastguard Worker %tmp4 = icmp eq i32 %tmp2, 0 36*9880d681SAndroid Build Coastguard Worker br i1 %tmp4, label %bb1, label %bb8 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerbb1: 39*9880d681SAndroid Build Coastguard Worker; CHECK: %bb1 40*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: umull 41*9880d681SAndroid Build Coastguard Worker; CHECK: bl _Get 42*9880d681SAndroid Build Coastguard Worker; CHECK: umull 43*9880d681SAndroid Build Coastguard Worker; CHECK: bl _foo 44*9880d681SAndroid Build Coastguard Worker %tmp5 = load i32, i32* %block_size, align 4 45*9880d681SAndroid Build Coastguard Worker %tmp6 = load i32, i32* %block_count, align 4 46*9880d681SAndroid Build Coastguard Worker %tmp7 = call %struct.FF* @Get() nounwind 47*9880d681SAndroid Build Coastguard Worker store %struct.FF* %tmp7, %struct.FF** @FuncPtr, align 4 48*9880d681SAndroid Build Coastguard Worker %tmp10 = zext i32 %tmp6 to i64 49*9880d681SAndroid Build Coastguard Worker %tmp11 = zext i32 %tmp5 to i64 50*9880d681SAndroid Build Coastguard Worker %tmp12 = mul nsw i64 %tmp10, %tmp11 51*9880d681SAndroid Build Coastguard Worker %tmp13 = call i32 @foo(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str1, i32 0, i32 0), i64 %tmp12, i32 %tmp5) nounwind 52*9880d681SAndroid Build Coastguard Worker br label %bb8 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerbb4: 55*9880d681SAndroid Build Coastguard Worker ret i32 0 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerbb6: 58*9880d681SAndroid Build Coastguard Worker ret i32 1 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerbb8: 61*9880d681SAndroid Build Coastguard Worker ret i32 -1 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerdeclare i32 @printf(i8*, ...) 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerdeclare %struct.FF* @Get() 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdeclare i32 @foo(i8*, i64, i32) 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerdeclare i32 @bar(i32, i32, i32) 71