| ; RUN: llc < %s -mtriple=s390x-linux-gnu -argext-abi-check |
| |
| ; Test that it works to pass structs as outgoing call arguments when the |
| ; NoExt attribute is given, either in the call instruction or in the |
| ; prototype of the called function. |
| define void @caller() { |
| call void @bar_Struct_32(i32 noext 123) |
| call void @bar_Struct_16(i16 123) |
| call void @bar_Struct_8(i8 noext 123) |
| ret void |
| } |
| |
| declare void @bar_Struct_32(i32 %Arg) |
| declare void @bar_Struct_16(i16 noext %Arg) |
| declare void @bar_Struct_8(i8 %Arg) |
| |
| ; Test that it works to return values with the NoExt attribute. |
| define noext i8 @callee_NoExtRet_i8() { |
| ret i8 -1 |
| } |
| |
| define noext i16 @callee_NoExtRet_i16() { |
| ret i16 -1 |
| } |
| |
| define noext i32 @callee_NoExtRet_i32() { |
| ret i32 -1 |
| } |
| |
| ; An internal function is not checked for an extension attribute. |
| define internal i32 @callee_NoExtRet_internal(i32 %Arg) { |
| ret i32 %Arg |
| } |
| |
| ; A call to an internal function is ok without argument extension. |
| define void @caller_internal() { |
| call i32 @callee_NoExtRet_internal(i32 0) |
| ret void |
| } |