1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=armv7-none-linux-gnueabi -pre-RA-sched=source | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; Test that we correctly align elements when using va_arg 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 5*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: bfc 6*9880d681SAndroid Build Coastguard Worker; CHECK: add [[REG:(r[0-9]+)|(lr)]], {{(r[0-9]+)|(lr)}}, #7 7*9880d681SAndroid Build Coastguard Worker; CHECK: bfc [[REG]], #0, #3 8*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: bfc 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdefine i64 @test1(i32 %i, ...) nounwind optsize { 11*9880d681SAndroid Build Coastguard Workerentry: 12*9880d681SAndroid Build Coastguard Worker %g = alloca i8*, align 4 13*9880d681SAndroid Build Coastguard Worker %g1 = bitcast i8** %g to i8* 14*9880d681SAndroid Build Coastguard Worker call void @llvm.va_start(i8* %g1) 15*9880d681SAndroid Build Coastguard Worker %0 = va_arg i8** %g, i64 16*9880d681SAndroid Build Coastguard Worker call void @llvm.va_end(i8* %g1) 17*9880d681SAndroid Build Coastguard Worker ret i64 %0 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 21*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: bfc 22*9880d681SAndroid Build Coastguard Worker; CHECK: add [[REG:(r[0-9]+)|(lr)]], {{(r[0-9]+)|(lr)}}, #7 23*9880d681SAndroid Build Coastguard Worker; CHECK: bfc [[REG]], #0, #3 24*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: bfc 25*9880d681SAndroid Build Coastguard Worker; CHECK: bx lr 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdefine double @test2(i32 %a, i32* %b, ...) nounwind optsize { 28*9880d681SAndroid Build Coastguard Workerentry: 29*9880d681SAndroid Build Coastguard Worker %ap = alloca i8*, align 4 ; <i8**> [#uses=3] 30*9880d681SAndroid Build Coastguard Worker %ap1 = bitcast i8** %ap to i8* ; <i8*> [#uses=2] 31*9880d681SAndroid Build Coastguard Worker call void @llvm.va_start(i8* %ap1) 32*9880d681SAndroid Build Coastguard Worker %0 = va_arg i8** %ap, i32 ; <i32> [#uses=0] 33*9880d681SAndroid Build Coastguard Worker store i32 %0, i32* %b 34*9880d681SAndroid Build Coastguard Worker %1 = va_arg i8** %ap, double ; <double> [#uses=1] 35*9880d681SAndroid Build Coastguard Worker call void @llvm.va_end(i8* %ap1) 36*9880d681SAndroid Build Coastguard Worker ret double %1 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.va_start(i8*) nounwind 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.va_end(i8*) nounwind 43