diff options
Diffstat (limited to 'test/CodeGen/X86/avx512-rotate.ll')
| -rw-r--r-- | test/CodeGen/X86/avx512-rotate.ll | 71 |
1 files changed, 50 insertions, 21 deletions
diff --git a/test/CodeGen/X86/avx512-rotate.ll b/test/CodeGen/X86/avx512-rotate.ll index 98fa67ad793d9..203092e88d31e 100644 --- a/test/CodeGen/X86/avx512-rotate.ll +++ b/test/CodeGen/X86/avx512-rotate.ll @@ -7,11 +7,14 @@ declare <16 x i32> @llvm.x86.avx512.mask.prorv.d.512(<16 x i32>, <16 x i32>, <16 declare <8 x i64> @llvm.x86.avx512.mask.prolv.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8) declare <8 x i64> @llvm.x86.avx512.mask.prorv.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8) +declare <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8) +declare <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16) + ; Tests showing replacement of variable rotates with immediate splat versions. define <16 x i32> @test_splat_rol_v16i32(<16 x i32> %x0, <16 x i32> %x1, i16 %x2) { ; KNL-LABEL: test_splat_rol_v16i32: -; KNL: # BB#0: +; KNL: # %bb.0: ; KNL-NEXT: kmovw %edi, %k1 ; KNL-NEXT: vprold $5, %zmm0, %zmm1 {%k1} ; KNL-NEXT: vprold $5, %zmm0, %zmm2 {%k1} {z} @@ -21,7 +24,7 @@ define <16 x i32> @test_splat_rol_v16i32(<16 x i32> %x0, <16 x i32> %x1, i16 %x2 ; KNL-NEXT: retq ; ; SKX-LABEL: test_splat_rol_v16i32: -; SKX: # BB#0: +; SKX: # %bb.0: ; SKX-NEXT: kmovd %edi, %k1 ; SKX-NEXT: vprold $5, %zmm0, %zmm1 {%k1} ; SKX-NEXT: vprold $5, %zmm0, %zmm2 {%k1} {z} @@ -39,7 +42,7 @@ define <16 x i32> @test_splat_rol_v16i32(<16 x i32> %x0, <16 x i32> %x1, i16 %x2 define <8 x i64>@test_splat_rol_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) { ; KNL-LABEL: test_splat_rol_v8i64: -; KNL: # BB#0: +; KNL: # %bb.0: ; KNL-NEXT: kmovw %edi, %k1 ; KNL-NEXT: vprolq $5, %zmm0, %zmm1 {%k1} ; KNL-NEXT: vprolq $5, %zmm0, %zmm2 {%k1} {z} @@ -49,7 +52,7 @@ define <8 x i64>@test_splat_rol_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) { ; KNL-NEXT: retq ; ; SKX-LABEL: test_splat_rol_v8i64: -; SKX: # BB#0: +; SKX: # %bb.0: ; SKX-NEXT: kmovd %edi, %k1 ; SKX-NEXT: vprolq $5, %zmm0, %zmm1 {%k1} ; SKX-NEXT: vprolq $5, %zmm0, %zmm2 {%k1} {z} @@ -67,7 +70,7 @@ define <8 x i64>@test_splat_rol_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) { define <16 x i32> @test_splat_ror_v16i32(<16 x i32> %x0, <16 x i32> %x1, i16 %x2) { ; KNL-LABEL: test_splat_ror_v16i32: -; KNL: # BB#0: +; KNL: # %bb.0: ; KNL-NEXT: kmovw %edi, %k1 ; KNL-NEXT: vprord $5, %zmm0, %zmm1 {%k1} ; KNL-NEXT: vprord $5, %zmm0, %zmm2 {%k1} {z} @@ -77,7 +80,7 @@ define <16 x i32> @test_splat_ror_v16i32(<16 x i32> %x0, <16 x i32> %x1, i16 %x2 ; KNL-NEXT: retq ; ; SKX-LABEL: test_splat_ror_v16i32: -; SKX: # BB#0: +; SKX: # %bb.0: ; SKX-NEXT: kmovd %edi, %k1 ; SKX-NEXT: vprord $5, %zmm0, %zmm1 {%k1} ; SKX-NEXT: vprord $5, %zmm0, %zmm2 {%k1} {z} @@ -95,7 +98,7 @@ define <16 x i32> @test_splat_ror_v16i32(<16 x i32> %x0, <16 x i32> %x1, i16 %x2 define <8 x i64>@test_splat_ror_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) { ; KNL-LABEL: test_splat_ror_v8i64: -; KNL: # BB#0: +; KNL: # %bb.0: ; KNL-NEXT: kmovw %edi, %k1 ; KNL-NEXT: vprorq $5, %zmm0, %zmm1 {%k1} ; KNL-NEXT: vprorq $5, %zmm0, %zmm2 {%k1} {z} @@ -105,7 +108,7 @@ define <8 x i64>@test_splat_ror_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) { ; KNL-NEXT: retq ; ; SKX-LABEL: test_splat_ror_v8i64: -; SKX: # BB#0: +; SKX: # %bb.0: ; SKX-NEXT: kmovd %edi, %k1 ; SKX-NEXT: vprorq $5, %zmm0, %zmm1 {%k1} ; SKX-NEXT: vprorq $5, %zmm0, %zmm2 {%k1} {z} @@ -125,7 +128,7 @@ define <8 x i64>@test_splat_ror_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) { define <16 x i32> @test_splat_bounds_rol_v16i32(<16 x i32> %x0, <16 x i32> %x1, i16 %x2) { ; KNL-LABEL: test_splat_bounds_rol_v16i32: -; KNL: # BB#0: +; KNL: # %bb.0: ; KNL-NEXT: kmovw %edi, %k1 ; KNL-NEXT: vprold $1, %zmm0, %zmm1 {%k1} ; KNL-NEXT: vprold $31, %zmm0, %zmm2 {%k1} {z} @@ -135,7 +138,7 @@ define <16 x i32> @test_splat_bounds_rol_v16i32(<16 x i32> %x0, <16 x i32> %x1, ; KNL-NEXT: retq ; ; SKX-LABEL: test_splat_bounds_rol_v16i32: -; SKX: # BB#0: +; SKX: # %bb.0: ; SKX-NEXT: kmovd %edi, %k1 ; SKX-NEXT: vprold $1, %zmm0, %zmm1 {%k1} ; SKX-NEXT: vprold $31, %zmm0, %zmm2 {%k1} {z} @@ -153,7 +156,7 @@ define <16 x i32> @test_splat_bounds_rol_v16i32(<16 x i32> %x0, <16 x i32> %x1, define <8 x i64>@test_splat_bounds_rol_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) { ; KNL-LABEL: test_splat_bounds_rol_v8i64: -; KNL: # BB#0: +; KNL: # %bb.0: ; KNL-NEXT: kmovw %edi, %k1 ; KNL-NEXT: vprolq $62, %zmm0, %zmm1 {%k1} ; KNL-NEXT: vprolq $1, %zmm0, %zmm2 {%k1} {z} @@ -163,7 +166,7 @@ define <8 x i64>@test_splat_bounds_rol_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x ; KNL-NEXT: retq ; ; SKX-LABEL: test_splat_bounds_rol_v8i64: -; SKX: # BB#0: +; SKX: # %bb.0: ; SKX-NEXT: kmovd %edi, %k1 ; SKX-NEXT: vprolq $62, %zmm0, %zmm1 {%k1} ; SKX-NEXT: vprolq $1, %zmm0, %zmm2 {%k1} {z} @@ -181,7 +184,7 @@ define <8 x i64>@test_splat_bounds_rol_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x define <16 x i32> @test_splat_bounds_ror_v16i32(<16 x i32> %x0, <16 x i32> %x1, i16 %x2) { ; KNL-LABEL: test_splat_bounds_ror_v16i32: -; KNL: # BB#0: +; KNL: # %bb.0: ; KNL-NEXT: kmovw %edi, %k1 ; KNL-NEXT: vprord $1, %zmm0, %zmm1 {%k1} ; KNL-NEXT: vprord $31, %zmm0, %zmm2 {%k1} {z} @@ -191,7 +194,7 @@ define <16 x i32> @test_splat_bounds_ror_v16i32(<16 x i32> %x0, <16 x i32> %x1, ; KNL-NEXT: retq ; ; SKX-LABEL: test_splat_bounds_ror_v16i32: -; SKX: # BB#0: +; SKX: # %bb.0: ; SKX-NEXT: kmovd %edi, %k1 ; SKX-NEXT: vprord $1, %zmm0, %zmm1 {%k1} ; SKX-NEXT: vprord $31, %zmm0, %zmm2 {%k1} {z} @@ -209,7 +212,7 @@ define <16 x i32> @test_splat_bounds_ror_v16i32(<16 x i32> %x0, <16 x i32> %x1, define <8 x i64>@test_splat_bounds_ror_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) { ; KNL-LABEL: test_splat_bounds_ror_v8i64: -; KNL: # BB#0: +; KNL: # %bb.0: ; KNL-NEXT: kmovw %edi, %k1 ; KNL-NEXT: vprorq $62, %zmm0, %zmm1 {%k1} ; KNL-NEXT: vprorq $1, %zmm0, %zmm2 {%k1} {z} @@ -219,7 +222,7 @@ define <8 x i64>@test_splat_bounds_ror_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x ; KNL-NEXT: retq ; ; SKX-LABEL: test_splat_bounds_ror_v8i64: -; SKX: # BB#0: +; SKX: # %bb.0: ; SKX-NEXT: kmovd %edi, %k1 ; SKX-NEXT: vprorq $62, %zmm0, %zmm1 {%k1} ; SKX-NEXT: vprorq $1, %zmm0, %zmm2 {%k1} {z} @@ -236,21 +239,47 @@ define <8 x i64>@test_splat_bounds_ror_v8i64(<8 x i64> %x0, <8 x i64> %x1, i8 %x } ; Constant folding +; We also test with a target shuffle so that this can't be constant folded upon creation, it must +; wait until the target shuffle has been constant folded in combineX86ShufflesRecursively. define <8 x i64> @test_fold_rol_v8i64() { ; CHECK-LABEL: test_fold_rol_v8i64: -; CHECK: # BB#0: +; CHECK: # %bb.0: ; CHECK-NEXT: vmovaps {{.*#+}} zmm0 = [1,2,4,9223372036854775808,2,4611686018427387904,9223372036854775808,9223372036854775808] ; CHECK-NEXT: retq %res = call <8 x i64> @llvm.x86.avx512.mask.prolv.q.512(<8 x i64> <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>, <8 x i64> <i64 0, i64 1, i64 2, i64 63, i64 65, i64 65534, i64 65535, i64 -1>, <8 x i64> zeroinitializer, i8 -1) ret <8 x i64> %res } +define <16 x i32> @test_fold_rol_v16i32(<16 x i32> %x0, <16 x i32> %x1) { +; CHECK-LABEL: test_fold_rol_v16i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vpbroadcastd {{.*#+}} zmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] +; CHECK-NEXT: vprolvd {{.*}}(%rip), %zmm0, %zmm0 +; CHECK-NEXT: retq + %res0 = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>, <16 x i32> zeroinitializer, i16 -1) + %res1 = call <16 x i32> @llvm.x86.avx512.mask.prolv.d.512(<16 x i32> %res0, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>, <16 x i32> zeroinitializer, i16 -1) + ret <16 x i32> %res1 +} + define <8 x i64> @test_fold_ror_v8i64() { ; CHECK-LABEL: test_fold_ror_v8i64: -; CHECK: # BB#0: -; CHECK-NEXT: vmovaps {{.*#+}} zmm0 = [1,9223372036854775808,4611686018427387904,2,9223372036854775808,4,2,2] +; CHECK: # %bb.0: +; CHECK-NEXT: vpbroadcastq {{.*#+}} zmm0 = [1,1,1,1,1,1,1,1] +; CHECK-NEXT: vprorvq {{.*}}(%rip), %zmm0, %zmm0 ; CHECK-NEXT: retq - %res = call <8 x i64> @llvm.x86.avx512.mask.prorv.q.512(<8 x i64> <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>, <8 x i64> <i64 0, i64 1, i64 2, i64 63, i64 65, i64 65534, i64 65535, i64 -1>, <8 x i64> zeroinitializer, i8 -1) - ret <8 x i64> %res + %res0 = call <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64> <i64 undef, i64 6, i64 5, i64 4, i64 3, i64 2, i64 1, i64 0>, <8 x i64> <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>, <8 x i64> zeroinitializer, i8 -1) + %res1 = call <8 x i64> @llvm.x86.avx512.mask.prorv.q.512(<8 x i64> %res0, <8 x i64> <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7>, <8 x i64> zeroinitializer, i8 -1) + ret <8 x i64> %res1 +} + +define <16 x i32> @test_fold_ror_v16i32(<16 x i32> %x0, <16 x i32> %x1) { +; CHECK-LABEL: test_fold_ror_v16i32: +; CHECK: # %bb.0: +; CHECK-NEXT: vpbroadcastd {{.*#+}} zmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] +; CHECK-NEXT: vprorvd {{.*}}(%rip), %zmm0, %zmm0 +; CHECK-NEXT: retq + %res0 = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>, <16 x i32> zeroinitializer, i16 -1) + %res1 = call <16 x i32> @llvm.x86.avx512.mask.prorv.d.512(<16 x i32> %res0, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>, <16 x i32> zeroinitializer, i16 -1) + ret <16 x i32> %res1 } |
