1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f | FileCheck %s 3 4define i64 @split_assertzext(ptr %x) nounwind { 5; CHECK-LABEL: split_assertzext: 6; CHECK: # %bb.0: 7; CHECK-NEXT: pushq %rax 8; CHECK-NEXT: callq test@PLT 9; CHECK-NEXT: vextracti32x4 $3, %zmm1, %xmm0 10; CHECK-NEXT: vpextrq $1, %xmm0, %rax 11; CHECK-NEXT: popq %rcx 12; CHECK-NEXT: vzeroupper 13; CHECK-NEXT: retq 14 %e = call <16 x i64> @test(), !range !0, !noundef !{} 15 %d = extractelement <16 x i64> %e, i32 15 16 ret i64 %d 17} 18 19define i64 @widen_assertzext(ptr %x) nounwind { 20; CHECK-LABEL: widen_assertzext: 21; CHECK: # %bb.0: 22; CHECK-NEXT: pushq %rax 23; CHECK-NEXT: callq test2@PLT 24; CHECK-NEXT: movb $127, %al 25; CHECK-NEXT: kmovw %eax, %k1 26; CHECK-NEXT: vpexpandq %zmm0, %zmm0 {%k1} {z} 27; CHECK-NEXT: vextracti32x4 $3, %zmm0, %xmm0 28; CHECK-NEXT: vmovq %xmm0, %rax 29; CHECK-NEXT: popq %rcx 30; CHECK-NEXT: vzeroupper 31; CHECK-NEXT: retq 32 %e = call <7 x i64> @test2(), !range !0, !noundef !{} 33 %d = extractelement <7 x i64> %e, i32 6 34 ret i64 %d 35} 36 37define i64 @widen_assertzext_range_attr(ptr %x) nounwind { 38; CHECK-LABEL: widen_assertzext_range_attr: 39; CHECK: # %bb.0: 40; CHECK-NEXT: pushq %rax 41; CHECK-NEXT: callq test2@PLT 42; CHECK-NEXT: movb $127, %al 43; CHECK-NEXT: kmovw %eax, %k1 44; CHECK-NEXT: vpexpandq %zmm0, %zmm0 {%k1} {z} 45; CHECK-NEXT: vextracti32x4 $3, %zmm0, %xmm0 46; CHECK-NEXT: vmovq %xmm0, %rax 47; CHECK-NEXT: popq %rcx 48; CHECK-NEXT: vzeroupper 49; CHECK-NEXT: retq 50 %e = call noundef range(i64 0, 2) <7 x i64> @test2() 51 %d = extractelement <7 x i64> %e, i32 6 52 ret i64 %d 53} 54 55declare <16 x i64> @test() 56declare <7 x i64> @test2() 57!0 = !{ i64 0, i64 2 } 58