[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / ARM / va_arg.ll
blob57470694b124b9e8e6d3d30f5bf6323476ca7a28
1 ; RUN: llc < %s -mtriple=armv7-none-linux-gnueabi -pre-RA-sched=source | FileCheck %s
2 ; Test that we correctly align elements when using va_arg
4 ; CHECK-LABEL: test1:
5 ; CHECK-NOT: bfc
6 ; CHECK: add    [[REG:(r[0-9]+)|(lr)]], {{(r[0-9]+)|(lr)}}, #7
7 ; CHECK: bic    {{(r[0-9]+)|(lr)}}, [[REG]], #7
8 ; CHECK-NOT: bic
10 define i64 @test1(i32 %i, ...) nounwind optsize {
11 entry:
12   %g = alloca i8*, align 4
13   %g1 = bitcast i8** %g to i8*
14   call void @llvm.va_start(i8* %g1)
15   %0 = va_arg i8** %g, i64
16   call void @llvm.va_end(i8* %g1)
17   ret i64 %0
20 ; CHECK-LABEL: test2:
21 ; CHECK-NOT: bfc
22 ; CHECK: add    [[REG:(r[0-9]+)|(lr)]], {{(r[0-9]+)|(lr)}}, #7
23 ; CHECK: bic    {{(r[0-9]+)|(lr)}}, [[REG]], #7
24 ; CHECK-NOT:    bic
25 ; CHECK: bx     lr
27 define double @test2(i32 %a, i32* %b, ...) nounwind optsize {
28 entry:
29   %ap = alloca i8*, align 4                       ; <i8**> [#uses=3]
30   %ap1 = bitcast i8** %ap to i8*                  ; <i8*> [#uses=2]
31   call void @llvm.va_start(i8* %ap1)
32   %0 = va_arg i8** %ap, i32                       ; <i32> [#uses=0]
33   store i32 %0, i32* %b
34   %1 = va_arg i8** %ap, double                    ; <double> [#uses=1]
35   call void @llvm.va_end(i8* %ap1)
36   ret double %1
40 declare void @llvm.va_start(i8*) nounwind
42 declare void @llvm.va_end(i8*) nounwind