| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 |
| ; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s |
| |
| declare i64 @returns_i64() |
| |
| define i64 @call_range_nonzero_lo() nounwind { |
| ; CHECK-LABEL: call_range_nonzero_lo: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: pushq %rax |
| ; CHECK-NEXT: callq returns_i64@PLT |
| ; CHECK-NEXT: andq $-8, %rax |
| ; CHECK-NEXT: popq %rcx |
| ; CHECK-NEXT: retq |
| %v = call range(i64 1, 2305843009213693952) i64 @returns_i64() |
| %r = and i64 %v, 2305843009213693944 |
| ret i64 %r |
| } |
| |
| define i64 @call_range_zero_lo() nounwind { |
| ; CHECK-LABEL: call_range_zero_lo: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: pushq %rax |
| ; CHECK-NEXT: callq returns_i64@PLT |
| ; CHECK-NEXT: andl $-8, %eax |
| ; CHECK-NEXT: popq %rcx |
| ; CHECK-NEXT: retq |
| %v = call range(i64 0, 256) i64 @returns_i64() |
| %r = and i64 %v, 248 |
| ret i64 %r |
| } |
| |
| define i64 @call_range_narrow() nounwind { |
| ; CHECK-LABEL: call_range_narrow: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: pushq %rax |
| ; CHECK-NEXT: callq returns_i64@PLT |
| ; CHECK-NEXT: andl $-8, %eax |
| ; CHECK-NEXT: popq %rcx |
| ; CHECK-NEXT: retq |
| %v = call range(i64 100, 256) i64 @returns_i64() |
| %r = and i64 %v, 248 |
| ret i64 %r |
| } |
| |
| ; Negative tests |
| |
| define i64 @call_no_range() nounwind { |
| ; CHECK-LABEL: call_no_range: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: pushq %rax |
| ; CHECK-NEXT: callq returns_i64@PLT |
| ; CHECK-NEXT: movabsq $2305843009213693944, %rcx # imm = 0x1FFFFFFFFFFFFFF8 |
| ; CHECK-NEXT: andq %rcx, %rax |
| ; CHECK-NEXT: popq %rcx |
| ; CHECK-NEXT: retq |
| %v = call i64 @returns_i64() |
| %r = and i64 %v, 2305843009213693944 |
| ret i64 %r |
| } |
| |
| define i64 @call_wrapped_range() nounwind { |
| ; CHECK-LABEL: call_wrapped_range: |
| ; CHECK: # %bb.0: |
| ; CHECK-NEXT: pushq %rax |
| ; CHECK-NEXT: callq returns_i64@PLT |
| ; CHECK-NEXT: movabsq $2305843009213693944, %rcx # imm = 0x1FFFFFFFFFFFFFF8 |
| ; CHECK-NEXT: andq %rcx, %rax |
| ; CHECK-NEXT: popq %rcx |
| ; CHECK-NEXT: retq |
| %v = call range(i64 -100, 100) i64 @returns_i64() |
| %r = and i64 %v, 2305843009213693944 |
| ret i64 %r |
| } |