; RUN: llc < %s | FileCheck %s target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64" target triple = "armv7-none--gnueabihf" %struct.s = type { float, float } %union.t = type { [4 x float] } ; Equivalent C code: ; struct s { float a; float b; }; ; float foo(float a, double b, struct s c) { return c.a; } ; Argument allocation: ; a -> s0 ; b -> d1 ; c -> s4, s5 ; s1 is unused ; return in s0 define float @test1(float %a, double %b, %struct.s %c) { entry: ; CHECK-LABEL: test1 ; CHECK: vmov.f32 s0, s4 ; CHECK-NOT: vmov.f32 s0, s1 %result = extractvalue %struct.s %c, 0 ret float %result } ; Equivalent C code: ; union t { float a[4] }; ; float foo(float a, double b, union s c) { return c.a[0]; } ; Argument allocation: ; a -> s0 ; b -> d1 ; c -> s4..s7 define float @test2(float %a, double %b, %union.t %c) #0 { entry: ; CHECK-LABEL: test2 ; CHECK: vmov.f32 s0, s4 ; CHECK-NOT: vmov.f32 s0, s1 %result = extractvalue %union.t %c, 0, 0 ret float %result } ; Equivalent C code: ; struct s { float a; float b; }; ; float foo(float a, double b, struct s c, float d) { return d; } ; Argument allocation: ; a -> s0 ; b -> d1 ; c -> s4, s5 ; d -> s1 ; return in s0 define float @test3(float %a, double %b, %struct.s %c, float %d) { entry: ; CHECK-LABEL: test3 ; CHECK: vmov.f32 s0, s1 ; CHECK-NOT: vmov.f32 s0, s5 ret float %d } ; Equivalent C code: ; struct s { float a; float b; }; ; float foo(struct s a, struct s b) { return b.b; } ; Argument allocation: ; a -> s0, s1 ; b -> s2, s3 ; return in s0 define float @test4(%struct.s %a, %struct.s %b) { entry: ; CHECK-LABEL: test4 ; CHECK: vmov.f32 s0, s3 %result = extractvalue %struct.s %b, 1 ret float %result } ; Equivalent C code: ; struct s { float a; float b; }; ; float foo(struct s a, float b, struct s c) { return c.a; } ; Argument allocation: ; a -> s0, s1 ; b -> s2 ; c -> s3, s4 ; return in s0 define float @test5(%struct.s %a, float %b, %struct.s %c) { entry: ; CHECK-LABEL: test5 ; CHECK: vmov.f32 s0, s3 %result = extractvalue %struct.s %c, 0 ret float %result }