1*c24f2171SOliver Stannard; RUN: llc < %s | FileCheck %s 2*c24f2171SOliver Stannard 3*c24f2171SOliver Stannardtarget datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64" 4*c24f2171SOliver Stannardtarget triple = "armv7-none--gnueabihf" 5*c24f2171SOliver Stannard 6*c24f2171SOliver Stannard%struct.s = type { float, float } 7*c24f2171SOliver Stannard%union.t = type { [4 x float] } 8*c24f2171SOliver Stannard 9*c24f2171SOliver Stannard; Equivalent C code: 10*c24f2171SOliver Stannard; struct s { float a; float b; }; 11*c24f2171SOliver Stannard; float foo(float a, double b, struct s c) { return c.a; } 12*c24f2171SOliver Stannard; Argument allocation: 13*c24f2171SOliver Stannard; a -> s0 14*c24f2171SOliver Stannard; b -> d1 15*c24f2171SOliver Stannard; c -> s4, s5 16*c24f2171SOliver Stannard; s1 is unused 17*c24f2171SOliver Stannard; return in s0 18*c24f2171SOliver Stannarddefine float @test1(float %a, double %b, %struct.s %c) { 19*c24f2171SOliver Stannardentry: 20*c24f2171SOliver Stannard; CHECK-LABEL: test1 21*c24f2171SOliver Stannard; CHECK: vmov.f32 s0, s4 22*c24f2171SOliver Stannard; CHECK-NOT: vmov.f32 s0, s1 23*c24f2171SOliver Stannard 24*c24f2171SOliver Stannard %result = extractvalue %struct.s %c, 0 25*c24f2171SOliver Stannard ret float %result 26*c24f2171SOliver Stannard} 27*c24f2171SOliver Stannard 28*c24f2171SOliver Stannard; Equivalent C code: 29*c24f2171SOliver Stannard; union t { float a[4] }; 30*c24f2171SOliver Stannard; float foo(float a, double b, union s c) { return c.a[0]; } 31*c24f2171SOliver Stannard; Argument allocation: 32*c24f2171SOliver Stannard; a -> s0 33*c24f2171SOliver Stannard; b -> d1 34*c24f2171SOliver Stannard; c -> s4..s7 35*c24f2171SOliver Stannarddefine float @test2(float %a, double %b, %union.t %c) #0 { 36*c24f2171SOliver Stannardentry: 37*c24f2171SOliver Stannard; CHECK-LABEL: test2 38*c24f2171SOliver Stannard; CHECK: vmov.f32 s0, s4 39*c24f2171SOliver Stannard; CHECK-NOT: vmov.f32 s0, s1 40*c24f2171SOliver Stannard 41*c24f2171SOliver Stannard %result = extractvalue %union.t %c, 0, 0 42*c24f2171SOliver Stannard ret float %result 43*c24f2171SOliver Stannard} 44*c24f2171SOliver Stannard 45*c24f2171SOliver Stannard; Equivalent C code: 46*c24f2171SOliver Stannard; struct s { float a; float b; }; 47*c24f2171SOliver Stannard; float foo(float a, double b, struct s c, float d) { return d; } 48*c24f2171SOliver Stannard; Argument allocation: 49*c24f2171SOliver Stannard; a -> s0 50*c24f2171SOliver Stannard; b -> d1 51*c24f2171SOliver Stannard; c -> s4, s5 52*c24f2171SOliver Stannard; d -> s1 53*c24f2171SOliver Stannard; return in s0 54*c24f2171SOliver Stannarddefine float @test3(float %a, double %b, %struct.s %c, float %d) { 55*c24f2171SOliver Stannardentry: 56*c24f2171SOliver Stannard; CHECK-LABEL: test3 57*c24f2171SOliver Stannard; CHECK: vmov.f32 s0, s1 58*c24f2171SOliver Stannard; CHECK-NOT: vmov.f32 s0, s5 59*c24f2171SOliver Stannard 60*c24f2171SOliver Stannard ret float %d 61*c24f2171SOliver Stannard} 62*c24f2171SOliver Stannard 63*c24f2171SOliver Stannard; Equivalent C code: 64*c24f2171SOliver Stannard; struct s { float a; float b; }; 65*c24f2171SOliver Stannard; float foo(struct s a, struct s b) { return b.b; } 66*c24f2171SOliver Stannard; Argument allocation: 67*c24f2171SOliver Stannard; a -> s0, s1 68*c24f2171SOliver Stannard; b -> s2, s3 69*c24f2171SOliver Stannard; return in s0 70*c24f2171SOliver Stannarddefine float @test4(%struct.s %a, %struct.s %b) { 71*c24f2171SOliver Stannardentry: 72*c24f2171SOliver Stannard; CHECK-LABEL: test4 73*c24f2171SOliver Stannard; CHECK: vmov.f32 s0, s3 74*c24f2171SOliver Stannard 75*c24f2171SOliver Stannard %result = extractvalue %struct.s %b, 1 76*c24f2171SOliver Stannard ret float %result 77*c24f2171SOliver Stannard} 78*c24f2171SOliver Stannard 79*c24f2171SOliver Stannard; Equivalent C code: 80*c24f2171SOliver Stannard; struct s { float a; float b; }; 81*c24f2171SOliver Stannard; float foo(struct s a, float b, struct s c) { return c.a; } 82*c24f2171SOliver Stannard; Argument allocation: 83*c24f2171SOliver Stannard; a -> s0, s1 84*c24f2171SOliver Stannard; b -> s2 85*c24f2171SOliver Stannard; c -> s3, s4 86*c24f2171SOliver Stannard; return in s0 87*c24f2171SOliver Stannarddefine float @test5(%struct.s %a, float %b, %struct.s %c) { 88*c24f2171SOliver Stannardentry: 89*c24f2171SOliver Stannard; CHECK-LABEL: test5 90*c24f2171SOliver Stannard; CHECK: vmov.f32 s0, s3 91*c24f2171SOliver Stannard 92*c24f2171SOliver Stannard %result = extractvalue %struct.s %c, 0 93*c24f2171SOliver Stannard ret float %result 94*c24f2171SOliver Stannard} 95