llvm/test/CodeGen/X86/bool-zext.ll
Hans Wennborg 7dfc3433f3 [X86] Don't zero/sign-extend i1, i8, or i16 return values to 32 bits (PR22532)
This matches GCC and MSVC's behaviour, and saves on code size.

We were already not extending i1 return values on x86_64 after r127766. This
takes that patch further by applying it to x86 target as well, and also for i8
and i16.

The ABI docs have been unclear about the required behaviour here. The new i386
psABI [1] clearly states (Table 2.4, page 14) that i1, i8, and i16 return
vales do not need to be extended beyond 8 bits. The x86_64 ABI doc is being
updated to say the same [2].

Differential Revision: http://reviews.llvm.org/D16907

 [1]. https://01.org/sites/default/files/file_attach/intel386-psabi-1.0.pdf
 [2]. https://groups.google.com/d/msg/x86-64-abi/E8O33onbnGQ/_RFWw_ixDQAJ

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260133 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-08 19:34:30 +00:00

57 lines
1.3 KiB
LLVM

; RUN: llc < %s -mtriple=i686-unknown-linux-gnu | FileCheck %s -check-prefix=X86
; RUN: llc < %s -mtriple=x86_64-apple-darwin10 | FileCheck %s -check-prefix=X64
; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck %s -check-prefix=WIN64
; Check that the argument gets zero-extended before calling.
; X86-LABEL: bar1
; X86: movzbl
; X86: calll
; X64-LABEL: bar1
; X64: movzbl
; X64: jmp
; WIN64-LABEL: bar1
; WIN64: movzbl
; WIN64: callq
define void @bar1(i1 zeroext %v1) nounwind ssp {
entry:
%conv = zext i1 %v1 to i32
%call = tail call i32 (...) @foo1(i32 %conv) nounwind
ret void
}
; Check that on x86-64 the arguments are simply forwarded.
; X64-LABEL: bar2
; X64-NOT: movzbl
; X64: jmp
; WIN64-LABEL: bar2
; WIN64-NOT: movzbl
; WIN64: callq
define void @bar2(i8 zeroext %v1) nounwind ssp {
entry:
%conv = zext i8 %v1 to i32
%call = tail call i32 (...) @foo1(i32 %conv) nounwind
ret void
}
; Check that i1 return values are not zero-extended.
; X86-LABEL: bar3
; X86: call
; X86-NEXT: {{add|pop}}
; X86-NEXT: ret
; X64-LABEL: bar3
; X64: call
; X64-NEXT: {{add|pop}}
; X64-NEXT: ret
; WIN64-LABEL: bar3
; WIN64: call
; WIN64-NEXT: {{add|pop}}
; WIN64-NEXT: ret
define zeroext i1 @bar3() nounwind ssp {
entry:
%call = call i1 @foo2() nounwind
ret i1 %call
}
declare i32 @foo1(...)
declare zeroext i1 @foo2()