[ARM] More MVE compare vector splat combines for ANDs
[llvm-complete.git] / test / CodeGen / ARM / hfa-in-contiguous-registers.ll
blobf9ec6e0c645a960d52d46100460cd3bba09800be
1 ; RUN: llc < %s | FileCheck %s
3 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64"
4 target triple = "armv7-none--gnueabihf"
6 %struct.s = type { float, float }
7 %union.t = type { [4 x float] }
9 ; Equivalent C code:
10 ; struct s { float a; float b; };
11 ; float foo(float a, double b, struct s c) { return c.a; }
12 ; Argument allocation:
13 ; a -> s0
14 ; b -> d1
15 ; c -> s4, s5
16 ; s1 is unused
17 ; return in s0
18 define float @test1(float %a, double %b, %struct.s %c) {
19 entry:
20 ; CHECK-LABEL: test1
21 ; CHECK: vmov.f32  s0, s4
22 ; CHECK-NOT: vmov.f32        s0, s1
24   %result = extractvalue %struct.s %c, 0
25   ret float %result
28 ; Equivalent C code:
29 ; union t { float a[4] };
30 ; float foo(float a, double b, union s c) { return c.a[0]; }
31 ; Argument allocation:
32 ; a -> s0
33 ; b -> d1
34 ; c -> s4..s7
35 define float @test2(float %a, double %b, %union.t %c) #0 {
36 entry:
37 ; CHECK-LABEL: test2
38 ; CHECK: vmov.f32  s0, s4
39 ; CHECK-NOT: vmov.f32        s0, s1
41   %result = extractvalue %union.t %c, 0, 0
42   ret float %result
45 ; Equivalent C code:
46 ; struct s { float a; float b; };
47 ; float foo(float a, double b, struct s c, float d) { return d; }
48 ; Argument allocation:
49 ; a -> s0
50 ; b -> d1
51 ; c -> s4, s5
52 ; d -> s1
53 ; return in s0
54 define float @test3(float %a, double %b, %struct.s %c, float %d) {
55 entry:
56 ; CHECK-LABEL: test3
57 ; CHECK: vmov.f32  s0, s1
58 ; CHECK-NOT: vmov.f32        s0, s5
60   ret float %d
63 ; Equivalent C code:
64 ; struct s { float a; float b; };
65 ; float foo(struct s a, struct s b) { return b.b; }
66 ; Argument allocation:
67 ; a -> s0, s1
68 ; b -> s2, s3
69 ; return in s0
70 define float @test4(%struct.s %a, %struct.s %b) {
71 entry:
72 ; CHECK-LABEL: test4
73 ; CHECK: vmov.f32  s0, s3
75   %result = extractvalue %struct.s %b, 1
76   ret float %result
79 ; Equivalent C code:
80 ; struct s { float a; float b; };
81 ; float foo(struct s a, float b, struct s c) { return c.a; }
82 ; Argument allocation:
83 ; a -> s0, s1
84 ; b -> s2
85 ; c -> s3, s4
86 ; return in s0
87 define float @test5(%struct.s %a, float %b, %struct.s %c) {
88 entry:
89 ; CHECK-LABEL: test5
90 ; CHECK: vmov.f32  s0, s3
92   %result = extractvalue %struct.s %c, 0
93   ret float %result