[ARM] Cortex-M4 schedule additions
[llvm-complete.git] / test / CodeGen / ARM / no-tail-call.ll
blob5a5d43c28714ed97edc494ca09de948c4054b267
1 ; RUN: llc < %s -O0 -o - | FileCheck %s
2 target datalayout = "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3 target triple = "armv7s-apple-ios7"
5 %foo = type <{ %Sf }>
6 %Sf = type <{ float }>
8 declare float @llvm.ceil.f32(float) 
10 ; Check that we are not emitting a tail call for the last call to ceil.
11 ; This function returns three different results.
12 ; CHECK-LABEL: func1:
13 ; CHECK-NOT: b _ceilf
14 ; CHECK: pop
15 define { float, float, float } @func1() {
16 entry:
17   %0 = alloca %foo, align 4
18   %1 = alloca %foo, align 4
19   %2 = alloca %foo, align 4
20   %.native = getelementptr inbounds %foo, %foo* %0, i32 0, i32 0
21   %.native.value = getelementptr inbounds %Sf, %Sf* %.native, i32 0, i32 0
22   store float 0.000000e+00, float* %.native.value, align 4
23   %.native1 = getelementptr inbounds %foo, %foo* %1, i32 0, i32 0
24   %.native1.value = getelementptr inbounds %Sf, %Sf* %.native1, i32 0, i32 0
25   store float 1.000000e+00, float* %.native1.value, align 4
26   %.native2 = getelementptr inbounds %foo, %foo* %2, i32 0, i32 0
27   %.native2.value = getelementptr inbounds %Sf, %Sf* %.native2, i32 0, i32 0
28   store float 5.000000e+00, float* %.native2.value, align 4
29   br i1 true, label %3, label %4
31 ; <label>:3                                       ; preds = %entry
32   %.native4 = getelementptr inbounds %foo, %foo* %1, i32 0, i32 0
33   %.native4.value = getelementptr inbounds %Sf, %Sf* %.native4, i32 0, i32 0
34   store float 2.000000e+00, float* %.native4.value, align 4
35   br label %4
37 ; <label>:4                                       ; preds = %3, %entry
38   %5 = call float @llvm.ceil.f32(float 5.000000e+00)
39   %.native3 = getelementptr inbounds %foo, %foo* %1, i32 0, i32 0
40   %.native3.value = getelementptr inbounds %Sf, %Sf* %.native3, i32 0, i32 0
41   %6 = load float, float* %.native3.value, align 4
42   %7 = call float @llvm.ceil.f32(float %6)
43   %8 = insertvalue { float, float, float } { float 0.000000e+00, float undef, float undef }, float %5, 1
44   %9 = insertvalue { float, float, float } %8, float %7, 2
45   ret { float, float, float } %9
48 ; Check that we are not emitting a tail call for the last call to ceil.
49 ; This function returns two different results.
50 ; CHECK-LABEL: func2:
51 ; CHECK-NOT: b _ceilf
52 ; CHECK: pop
53 define { float, float } @func2() {
54 entry:
55   %0 = alloca %foo, align 4
56   %1 = alloca %foo, align 4
57   %2 = alloca %foo, align 4
58   %.native = getelementptr inbounds %foo, %foo* %0, i32 0, i32 0
59   %.native.value = getelementptr inbounds %Sf, %Sf* %.native, i32 0, i32 0
60   store float 0.000000e+00, float* %.native.value, align 4
61   %.native1 = getelementptr inbounds %foo, %foo* %1, i32 0, i32 0
62   %.native1.value = getelementptr inbounds %Sf, %Sf* %.native1, i32 0, i32 0
63   store float 1.000000e+00, float* %.native1.value, align 4
64   %.native2 = getelementptr inbounds %foo, %foo* %2, i32 0, i32 0
65   %.native2.value = getelementptr inbounds %Sf, %Sf* %.native2, i32 0, i32 0
66   store float 5.000000e+00, float* %.native2.value, align 4
67   br i1 true, label %3, label %4
69 ; <label>:3                                       ; preds = %entry
70   %.native4 = getelementptr inbounds %foo, %foo* %1, i32 0, i32 0
71   %.native4.value = getelementptr inbounds %Sf, %Sf* %.native4, i32 0, i32 0
72   store float 2.000000e+00, float* %.native4.value, align 4
73   br label %4
75 ; <label>:4                                       ; preds = %3, %entry
76   %5 = call float @llvm.ceil.f32(float 5.000000e+00)
77   %.native3 = getelementptr inbounds %foo, %foo* %1, i32 0, i32 0
78   %.native3.value = getelementptr inbounds %Sf, %Sf* %.native3, i32 0, i32 0
79   %6 = load float, float* %.native3.value, align 4
80   %7 = call float @llvm.ceil.f32(float %6)
81   %8 = insertvalue { float, float } { float 0.000000e+00, float undef }, float %7, 1
82   ret { float, float } %8