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