1 ; RUN: llc < %s | FileCheck %s 2 3 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64" 4 target triple = "armv7-none--gnueabihf" 5 6 %struct.s = type { float, float } 7 %union.t = type { [4 x float] } 8 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 23 24 %result = extractvalue %struct.s %c, 0 25 ret float %result 26 } 27 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 40 41 %result = extractvalue %union.t %c, 0, 0 42 ret float %result 43 } 44 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 59 60 ret float %d 61 } 62 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 74 75 %result = extractvalue %struct.s %b, 1 76 ret float %result 77 } 78 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 91 92 %result = extractvalue %struct.s %c, 0 93 ret float %result 94 } 95