| ; 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 | |
| } |