1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-linux-unknown | FileCheck %s --check-prefix=CHECK-64 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-linux-unknown | FileCheck %s --check-prefix=CHECK-32 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; Test that a large stack offset uses a single add/sub instruction to 5*9880d681SAndroid Build Coastguard Worker; adjust the stack pointer. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine void @foo() nounwind { 8*9880d681SAndroid Build Coastguard Worker; CHECK-64-LABEL: foo: 9*9880d681SAndroid Build Coastguard Worker; CHECK-64: movabsq $50000000{{..}}, %rax 10*9880d681SAndroid Build Coastguard Worker; CHECK-64-NEXT: subq %rax, %rsp 11*9880d681SAndroid Build Coastguard Worker; CHECK-64-NOT: subq $2147483647, %rsp 12*9880d681SAndroid Build Coastguard Worker; CHECK-64: movabsq $50000000{{..}}, [[RAX:%r..]] 13*9880d681SAndroid Build Coastguard Worker; CHECK-64-NEXT: addq [[RAX]], %rsp 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker; CHECK-32-LABEL: foo: 16*9880d681SAndroid Build Coastguard Worker; CHECK-32: movl $50000000{{..}}, %eax 17*9880d681SAndroid Build Coastguard Worker; CHECK-32-NEXT: subl %eax, %esp 18*9880d681SAndroid Build Coastguard Worker; CHECK-32-NOT: subl $2147483647, %esp 19*9880d681SAndroid Build Coastguard Worker; CHECK-32: movl $50000000{{..}}, [[EAX:%e..]] 20*9880d681SAndroid Build Coastguard Worker; CHECK-32-NEXT: addl [[EAX]], %esp 21*9880d681SAndroid Build Coastguard Worker %1 = alloca [5000000000 x i8], align 16 22*9880d681SAndroid Build Coastguard Worker %2 = getelementptr inbounds [5000000000 x i8], [5000000000 x i8]* %1, i32 0, i32 0 23*9880d681SAndroid Build Coastguard Worker call void @bar(i8* %2) 24*9880d681SAndroid Build Coastguard Worker ret void 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; Verify that we do not clobber the return value. 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine i32 @foo2() nounwind { 30*9880d681SAndroid Build Coastguard Worker; CHECK-64-LABEL: foo2: 31*9880d681SAndroid Build Coastguard Worker; CHECK-64: movl $10, %eax 32*9880d681SAndroid Build Coastguard Worker; CHECK-64-NOT: movabsq ${{.*}}, %rax 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; CHECK-32-LABEL: foo2: 35*9880d681SAndroid Build Coastguard Worker; CHECK-32: movl $10, %eax 36*9880d681SAndroid Build Coastguard Worker; CHECK-32-NOT: movl ${{.*}}, %eax 37*9880d681SAndroid Build Coastguard Worker %1 = alloca [5000000000 x i8], align 16 38*9880d681SAndroid Build Coastguard Worker %2 = getelementptr inbounds [5000000000 x i8], [5000000000 x i8]* %1, i32 0, i32 0 39*9880d681SAndroid Build Coastguard Worker call void @bar(i8* %2) 40*9880d681SAndroid Build Coastguard Worker ret i32 10 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker; Verify that we do not clobber EAX when using inreg attribute 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdefine i32 @foo3(i32 inreg %x) nounwind { 46*9880d681SAndroid Build Coastguard Worker; CHECK-64-LABEL: foo3: 47*9880d681SAndroid Build Coastguard Worker; CHECK-64: movabsq $50000000{{..}}, %rax 48*9880d681SAndroid Build Coastguard Worker; CHECK-64-NEXT: subq %rax, %rsp 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; CHECK-32-LABEL: foo3: 51*9880d681SAndroid Build Coastguard Worker; CHECK-32: subl $2147483647, %esp 52*9880d681SAndroid Build Coastguard Worker; CHECK-32-NOT: movl ${{.*}}, %eax 53*9880d681SAndroid Build Coastguard Worker %1 = alloca [5000000000 x i8], align 16 54*9880d681SAndroid Build Coastguard Worker %2 = getelementptr inbounds [5000000000 x i8], [5000000000 x i8]* %1, i32 0, i32 0 55*9880d681SAndroid Build Coastguard Worker call void @bar(i8* %2) 56*9880d681SAndroid Build Coastguard Worker ret i32 %x 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdeclare void @bar(i8*) 60