diff --git a/llvm/test/Transforms/ArgumentPromotion/byval.ll b/llvm/test/Transforms/ArgumentPromotion/byval.ll --- a/llvm/test/Transforms/ArgumentPromotion/byval.ll +++ b/llvm/test/Transforms/ArgumentPromotion/byval.ll @@ -7,6 +7,10 @@ define internal void @f(%struct.ss* byval %b) nounwind { entry: +; CHECK-LABEL: define internal void @f(i32 %b.0, i64 %b.1) +; CHECK: alloca %struct.ss{{$}} +; CHECK: store i32 %b.0 +; CHECK: store i64 %b.1 %tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0 %tmp1 = load i32, i32* %tmp, align 4 %tmp2 = add i32 %tmp1, 1 @@ -14,13 +18,13 @@ ret void } -; CHECK-LABEL: define internal void @f(i32 %b.0, i64 %b.1) -; CHECK: alloca %struct.ss{{$}} -; CHECK: store i32 %b.0 -; CHECK: store i64 %b.1 - define internal void @g(%struct.ss* byval align 32 %b) nounwind { entry: + +; CHECK-LABEL: define internal void @g(i32 %b.0, i64 %b.1) +; CHECK: alloca %struct.ss, align 32 +; CHECK: store i32 %b.0 +; CHECK: store i64 %b.1 %tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0 %tmp1 = load i32, i32* %tmp, align 4 %tmp2 = add i32 %tmp1, 1 @@ -28,13 +32,19 @@ ret void } -; CHECK-LABEL: define internal void @g(i32 %b.0, i64 %b.1) -; CHECK: alloca %struct.ss, align 32 -; CHECK: store i32 %b.0 -; CHECK: store i64 %b.1 +define internal void @h([2 x i32]* byval %b) nounwind { +entry: +; Even if we do not access the first element we can promote this array. + %tmp = getelementptr [2 x i32], [2 x i32]* %b, i32 0, i32 1 + %tmp1 = load i32, i32* %tmp, align 4 + %tmp2 = add i32 %tmp1, 1 + store i32 %tmp2, i32* %tmp, align 4 + ret void +} define i32 @main() nounwind { entry: + %A = alloca [2 x i32] %S = alloca %struct.ss %tmp1 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 0 store i32 1, i32* %tmp1, align 8 @@ -42,6 +52,10 @@ store i64 2, i64* %tmp4, align 4 call void @f(%struct.ss* byval %S) nounwind call void @g(%struct.ss* byval %S) nounwind +; Verify we unpack the byval array. +; FIXME: this sould be: call void @h(i32 %{{[a-zA-Z._0-9]*}}, i32 %{{[a-zA-Z._0-9]*}}) +; CHECK: call void @h([2 x i32]* byval %A) + call void @h([2 x i32]* byval %A) nounwind ret i32 0 }