| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -fast-isel -fast-isel-abort=3 < %s | FileCheck %s |
| |
| declare { i32, i32 } @get_i32s() |
| |
| define i32 @call_get_i32s() nounwind { |
| ; CHECK-LABEL: call_get_i32s: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: pushq %rax |
| ; CHECK-NEXT: callq get_i32s@PLT |
| ; CHECK-NEXT: addl %edx, %eax |
| ; CHECK-NEXT: popq %rcx |
| ; CHECK-NEXT: retq |
| %res = call { i32, i32 } @get_i32s() |
| %res.0 = extractvalue { i32, i32 } %res, 0 |
| %res.1 = extractvalue { i32, i32 } %res, 1 |
| %add = add i32 %res.0, %res.1 |
| ret i32 %add |
| } |
| |
| declare { ptr, ptr } @get_ptrs() |
| |
| define i64 @call_get_ptrs() nounwind { |
| ; CHECK-LABEL: call_get_ptrs: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: pushq %rax |
| ; CHECK-NEXT: callq get_ptrs@PLT |
| ; CHECK-NEXT: subq %rdx, %rax |
| ; CHECK-NEXT: popq %rcx |
| ; CHECK-NEXT: retq |
| %res = call { ptr, ptr } @get_ptrs() |
| %res.0 = extractvalue { ptr, ptr } %res, 0 |
| %res.1 = extractvalue { ptr, ptr } %res, 1 |
| %res.0.addr = ptrtoaddr ptr %res.0 to i64 |
| %res.1.addr = ptrtoaddr ptr %res.1 to i64 |
| %sub = sub i64 %res.0.addr, %res.1.addr |
| ret i64 %sub |
| } |
| |
| declare { i64, i1 } @get_i64_and_bool() |
| |
| define i64 @call_get_i64_and_bool() nounwind { |
| ; CHECK-LABEL: call_get_i64_and_bool: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: pushq %rax |
| ; CHECK-NEXT: callq get_i64_and_bool@PLT |
| ; CHECK-NEXT: andb $1, %dl |
| ; CHECK-NEXT: movzbl %dl, %ecx |
| ; CHECK-NEXT: addq %rcx, %rax |
| ; CHECK-NEXT: popq %rcx |
| ; CHECK-NEXT: retq |
| %res = call { i64, i1 } @get_i64_and_bool() |
| %res.0 = extractvalue { i64, i1 } %res, 0 |
| %res.1 = extractvalue { i64, i1 } %res, 1 |
| %res.1.ext = zext i1 %res.1 to i64 |
| %add = add i64 %res.0, %res.1.ext |
| ret i64 %add |
| } |