339 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=cannonlake | FileCheck %s3 4; These test cases demonstrate cases where vpermt2/vpermi2 could benefit from being commuted.5 6declare <16 x i32> @llvm.x86.avx512.mask.vpermi2var.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)7 8define <16 x i32>@test_int_x86_avx512_mask_vpermi2var_d_512(<16 x i32> %x0, <16 x i32> %x1, ptr %x2p) {9; CHECK-LABEL: test_int_x86_avx512_mask_vpermi2var_d_512:10; CHECK: ## %bb.0:11; CHECK-NEXT: vpermt2d (%rdi), %zmm1, %zmm012; CHECK-NEXT: retq13 %x2 = load <16 x i32>, ptr %x2p14 %res = call <16 x i32> @llvm.x86.avx512.mask.vpermi2var.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 -1)15 ret <16 x i32> %res16}17 18declare <8 x double> @llvm.x86.avx512.mask.vpermi2var.pd.512(<8 x double>, <8 x i64>, <8 x double>, i8)19 20define <8 x double>@test_int_x86_avx512_mask_vpermi2var_pd_512(<8 x double> %x0, <8 x i64> %x1, <8 x double> %x2) {21; CHECK-LABEL: test_int_x86_avx512_mask_vpermi2var_pd_512:22; CHECK: ## %bb.0:23; CHECK-NEXT: vpermt2pd %zmm2, %zmm1, %zmm024; CHECK-NEXT: retq25 %res = call <8 x double> @llvm.x86.avx512.mask.vpermi2var.pd.512(<8 x double> %x0, <8 x i64> %x1, <8 x double> %x2, i8 -1)26 ret <8 x double> %res27}28 29declare <16 x float> @llvm.x86.avx512.mask.vpermi2var.ps.512(<16 x float>, <16 x i32>, <16 x float>, i16)30 31define <16 x float>@test_int_x86_avx512_mask_vpermi2var_ps_512(<16 x float> %x0, <16 x i32> %x1, <16 x float> %x2) {32; CHECK-LABEL: test_int_x86_avx512_mask_vpermi2var_ps_512:33; CHECK: ## %bb.0:34; CHECK-NEXT: vpermt2ps %zmm2, %zmm1, %zmm035; CHECK-NEXT: retq36 %res = call <16 x float> @llvm.x86.avx512.mask.vpermi2var.ps.512(<16 x float> %x0, <16 x i32> %x1, <16 x float> %x2, i16 -1)37 ret <16 x float> %res38}39 40declare <8 x i64> @llvm.x86.avx512.mask.vpermi2var.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)41 42define <8 x i64>@test_int_x86_avx512_mask_vpermi2var_q_512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2) {43; CHECK-LABEL: test_int_x86_avx512_mask_vpermi2var_q_512:44; CHECK: ## %bb.0:45; CHECK-NEXT: vpermt2q %zmm2, %zmm1, %zmm046; CHECK-NEXT: retq47 %res = call <8 x i64> @llvm.x86.avx512.mask.vpermi2var.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 -1)48 ret <8 x i64> %res49}50 51declare <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)52 53define <16 x i32>@test_int_x86_avx512_maskz_vpermt2var_d_512(<16 x i32> %x0, <16 x i32> %x1, ptr %x2p, i16 %x3) {54; CHECK-LABEL: test_int_x86_avx512_maskz_vpermt2var_d_512:55; CHECK: ## %bb.0:56; CHECK-NEXT: kmovd %esi, %k157; CHECK-NEXT: vpermi2d (%rdi), %zmm1, %zmm0 {%k1} {z}58; CHECK-NEXT: retq59 %x2 = load <16 x i32>, ptr %x2p60 %res = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3)61 ret <16 x i32> %res62}63 64declare <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64>, <8 x double>, <8 x double>, i8)65 66define <8 x double>@test_int_x86_avx512_maskz_vpermt2var_pd_512(<8 x i64> %x0, <8 x double> %x1, ptr %x2ptr, i8 %x3) {67; CHECK-LABEL: test_int_x86_avx512_maskz_vpermt2var_pd_512:68; CHECK: ## %bb.0:69; CHECK-NEXT: kmovd %esi, %k170; CHECK-NEXT: vpermi2pd (%rdi){1to8}, %zmm1, %zmm0 {%k1} {z}71; CHECK-NEXT: retq72 %x2s = load double, ptr %x2ptr73 %x2ins = insertelement <8 x double> undef, double %x2s, i32 074 %x2 = shufflevector <8 x double> %x2ins, <8 x double> undef, <8 x i32> zeroinitializer75 %res = call <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64> %x0, <8 x double> %x1, <8 x double> %x2, i8 %x3)76 ret <8 x double> %res77}78 79declare <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32>, <16 x float>, <16 x float>, i16)80 81define <16 x float>@test_int_x86_avx512_maskz_vpermt2var_ps_512(<16 x i32> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3) {82; CHECK-LABEL: test_int_x86_avx512_maskz_vpermt2var_ps_512:83; CHECK: ## %bb.0:84; CHECK-NEXT: kmovd %edi, %k185; CHECK-NEXT: vpermi2ps %zmm2, %zmm1, %zmm0 {%k1} {z}86; CHECK-NEXT: retq87 %res = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3)88 ret <16 x float> %res89}90 91 92declare <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)93 94define <8 x i64>@test_int_x86_avx512_maskz_vpermt2var_q_512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3) {95; CHECK-LABEL: test_int_x86_avx512_maskz_vpermt2var_q_512:96; CHECK: ## %bb.0:97; CHECK-NEXT: kmovd %edi, %k198; CHECK-NEXT: vpermi2q %zmm2, %zmm1, %zmm0 {%k1} {z}99; CHECK-NEXT: retq100 %res = call <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3)101 ret <8 x i64> %res102}103 104declare <16 x i32> @llvm.x86.avx512.mask.vpermt2var.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)105 106define <16 x i32>@test_int_x86_avx512_mask_vpermt2var_d_512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2) {107; CHECK-LABEL: test_int_x86_avx512_mask_vpermt2var_d_512:108; CHECK: ## %bb.0:109; CHECK-NEXT: vpermi2d %zmm2, %zmm1, %zmm0110; CHECK-NEXT: retq111 %res = call <16 x i32> @llvm.x86.avx512.mask.vpermt2var.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 -1)112 ret <16 x i32> %res113}114 115declare <4 x i32> @llvm.x86.avx512.mask.vpermt2var.d.128(<4 x i32>, <4 x i32>, <4 x i32>, i8)116 117define <4 x i32>@test_int_x86_avx512_mask_vpermt2var_d_128(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2) {118; CHECK-LABEL: test_int_x86_avx512_mask_vpermt2var_d_128:119; CHECK: ## %bb.0:120; CHECK-NEXT: vpermi2d %xmm2, %xmm1, %xmm0121; CHECK-NEXT: retq122 %res = call <4 x i32> @llvm.x86.avx512.mask.vpermt2var.d.128(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, i8 -1)123 ret <4 x i32> %res124}125 126declare <4 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.128(<4 x i32>, <4 x i32>, <4 x i32>, i8)127 128define <4 x i32>@test_int_x86_avx512_maskz_vpermt2var_d_128(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, i8 %x3) {129; CHECK-LABEL: test_int_x86_avx512_maskz_vpermt2var_d_128:130; CHECK: ## %bb.0:131; CHECK-NEXT: kmovd %edi, %k1132; CHECK-NEXT: vpermi2d %xmm2, %xmm1, %xmm0 {%k1} {z}133; CHECK-NEXT: retq134 %res = call <4 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.128(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, i8 %x3)135 ret <4 x i32> %res136}137 138define <4 x i32>@test_int_x86_avx512_maskz_vpermt2var_d_128_broadcast(<4 x i32> %x0, <4 x i32> %x1, ptr %x2ptr, i8 %x3) {139; CHECK-LABEL: test_int_x86_avx512_maskz_vpermt2var_d_128_broadcast:140; CHECK: ## %bb.0:141; CHECK-NEXT: kmovd %esi, %k1142; CHECK-NEXT: vpermi2d (%rdi){1to4}, %xmm1, %xmm0 {%k1} {z}143; CHECK-NEXT: retq144 %x2s = load i32, ptr %x2ptr145 %x2ins = insertelement <4 x i32> undef, i32 %x2s, i32 0146 %x2 = shufflevector <4 x i32> %x2ins, <4 x i32> undef, <4 x i32> zeroinitializer147 %res = call <4 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.128(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, i8 %x3)148 ret <4 x i32> %res149}150 151declare <8 x i32> @llvm.x86.avx512.mask.vpermt2var.d.256(<8 x i32>, <8 x i32>, <8 x i32>, i8)152 153define <8 x i32>@test_int_x86_avx512_mask_vpermt2var_d_256(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2) {154; CHECK-LABEL: test_int_x86_avx512_mask_vpermt2var_d_256:155; CHECK: ## %bb.0:156; CHECK-NEXT: vpermi2d %ymm2, %ymm1, %ymm0157; CHECK-NEXT: retq158 %res = call <8 x i32> @llvm.x86.avx512.mask.vpermt2var.d.256(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, i8 -1)159 ret <8 x i32> %res160}161 162declare <8 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.256(<8 x i32>, <8 x i32>, <8 x i32>, i8)163 164define <8 x i32>@test_int_x86_avx512_maskz_vpermt2var_d_256(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, i8 %x3) {165; CHECK-LABEL: test_int_x86_avx512_maskz_vpermt2var_d_256:166; CHECK: ## %bb.0:167; CHECK-NEXT: kmovd %edi, %k1168; CHECK-NEXT: vpermi2d %ymm2, %ymm1, %ymm0 {%k1} {z}169; CHECK-NEXT: retq170 %res = call <8 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.256(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, i8 %x3)171 ret <8 x i32> %res172}173 174declare <2 x double> @llvm.x86.avx512.mask.vpermi2var.pd.128(<2 x double>, <2 x i64>, <2 x double>, i8)175 176define <2 x double>@test_int_x86_avx512_mask_vpermi2var_pd_128(<2 x double> %x0, <2 x i64> %x1, <2 x double> %x2) {177; CHECK-LABEL: test_int_x86_avx512_mask_vpermi2var_pd_128:178; CHECK: ## %bb.0:179; CHECK-NEXT: vpermt2pd %xmm2, %xmm1, %xmm0180; CHECK-NEXT: retq181 %res = call <2 x double> @llvm.x86.avx512.mask.vpermi2var.pd.128(<2 x double> %x0, <2 x i64> %x1, <2 x double> %x2, i8 -1)182 ret <2 x double> %res183}184 185declare <4 x double> @llvm.x86.avx512.mask.vpermi2var.pd.256(<4 x double>, <4 x i64>, <4 x double>, i8)186 187define <4 x double>@test_int_x86_avx512_mask_vpermi2var_pd_256(<4 x double> %x0, <4 x i64> %x1, <4 x double> %x2) {188; CHECK-LABEL: test_int_x86_avx512_mask_vpermi2var_pd_256:189; CHECK: ## %bb.0:190; CHECK-NEXT: vpermt2pd %ymm2, %ymm1, %ymm0191; CHECK-NEXT: retq192 %res = call <4 x double> @llvm.x86.avx512.mask.vpermi2var.pd.256(<4 x double> %x0, <4 x i64> %x1, <4 x double> %x2, i8 -1)193 ret <4 x double> %res194}195 196declare <4 x float> @llvm.x86.avx512.mask.vpermi2var.ps.128(<4 x float>, <4 x i32>, <4 x float>, i8)197 198define <4 x float>@test_int_x86_avx512_mask_vpermi2var_ps_128(<4 x float> %x0, <4 x i32> %x1, <4 x float> %x2) {199; CHECK-LABEL: test_int_x86_avx512_mask_vpermi2var_ps_128:200; CHECK: ## %bb.0:201; CHECK-NEXT: vpermt2ps %xmm2, %xmm1, %xmm0202; CHECK-NEXT: retq203 %res = call <4 x float> @llvm.x86.avx512.mask.vpermi2var.ps.128(<4 x float> %x0, <4 x i32> %x1, <4 x float> %x2, i8 -1)204 ret <4 x float> %res205}206 207declare <8 x float> @llvm.x86.avx512.mask.vpermi2var.ps.256(<8 x float>, <8 x i32>, <8 x float>, i8)208 209define <8 x float>@test_int_x86_avx512_mask_vpermi2var_ps_256(<8 x float> %x0, <8 x i32> %x1, <8 x float> %x2) {210; CHECK-LABEL: test_int_x86_avx512_mask_vpermi2var_ps_256:211; CHECK: ## %bb.0:212; CHECK-NEXT: vpermt2ps %ymm2, %ymm1, %ymm0213; CHECK-NEXT: retq214 %res = call <8 x float> @llvm.x86.avx512.mask.vpermi2var.ps.256(<8 x float> %x0, <8 x i32> %x1, <8 x float> %x2, i8 -1)215 ret <8 x float> %res216}217 218define <8 x float>@test_int_x86_avx512_mask_vpermi2var_ps_256_load(<8 x float> %x0, <8 x i32> %x1, ptr %x2p) {219; CHECK-LABEL: test_int_x86_avx512_mask_vpermi2var_ps_256_load:220; CHECK: ## %bb.0:221; CHECK-NEXT: vpermt2ps (%rdi), %ymm1, %ymm0222; CHECK-NEXT: retq223 %x2 = load <8 x float>, ptr %x2p224 %res = call <8 x float> @llvm.x86.avx512.mask.vpermi2var.ps.256(<8 x float> %x0, <8 x i32> %x1, <8 x float> %x2, i8 -1)225 ret <8 x float> %res226}227 228define <8 x float>@test_int_x86_avx512_mask_vpermi2var_ps_256_broadcast(<8 x float> %x0, <8 x i32> %x1, ptr %x2ptr) {229; CHECK-LABEL: test_int_x86_avx512_mask_vpermi2var_ps_256_broadcast:230; CHECK: ## %bb.0:231; CHECK-NEXT: vpermt2ps (%rdi){1to8}, %ymm1, %ymm0232; CHECK-NEXT: retq233 %x2s = load float, ptr %x2ptr234 %x2ins = insertelement <8 x float> undef, float %x2s, i32 0235 %x2 = shufflevector <8 x float> %x2ins, <8 x float> undef, <8 x i32> zeroinitializer236 %res = call <8 x float> @llvm.x86.avx512.mask.vpermi2var.ps.256(<8 x float> %x0, <8 x i32> %x1, <8 x float> %x2, i8 -1)237 ret <8 x float> %res238}239 240declare <16 x i8> @llvm.x86.avx512.mask.vpermi2var.qi.128(<16 x i8>, <16 x i8>, <16 x i8>, i16)241 242define <16 x i8>@test_int_x86_avx512_mask_vpermi2var_qi_128(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %x2) {243; CHECK-LABEL: test_int_x86_avx512_mask_vpermi2var_qi_128:244; CHECK: ## %bb.0:245; CHECK-NEXT: vpermt2b %xmm2, %xmm1, %xmm0246; CHECK-NEXT: retq247 %res = call <16 x i8> @llvm.x86.avx512.mask.vpermi2var.qi.128(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %x2, i16 -1)248 ret <16 x i8> %res249}250 251declare <32 x i8> @llvm.x86.avx512.mask.vpermi2var.qi.256(<32 x i8>, <32 x i8>, <32 x i8>, i32)252 253define <32 x i8>@test_int_x86_avx512_mask_vpermi2var_qi_256(<32 x i8> %x0, <32 x i8> %x1, <32 x i8> %x2) {254; CHECK-LABEL: test_int_x86_avx512_mask_vpermi2var_qi_256:255; CHECK: ## %bb.0:256; CHECK-NEXT: vpermt2b %ymm2, %ymm1, %ymm0257; CHECK-NEXT: retq258 %res = call <32 x i8> @llvm.x86.avx512.mask.vpermi2var.qi.256(<32 x i8> %x0, <32 x i8> %x1, <32 x i8> %x2, i32 -1)259 ret <32 x i8> %res260}261 262declare <16 x i8> @llvm.x86.avx512.mask.vpermt2var.qi.128(<16 x i8>, <16 x i8>, <16 x i8>, i16)263 264define <16 x i8>@test_int_x86_avx512_mask_vpermt2var_qi_128(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %x2) {265; CHECK-LABEL: test_int_x86_avx512_mask_vpermt2var_qi_128:266; CHECK: ## %bb.0:267; CHECK-NEXT: vpermi2b %xmm2, %xmm1, %xmm0268; CHECK-NEXT: retq269 %res = call <16 x i8> @llvm.x86.avx512.mask.vpermt2var.qi.128(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %x2, i16 -1)270 ret <16 x i8> %res271}272 273define <16 x i8>@test_int_x86_avx512_mask_vpermt2var_qi_128_load(<16 x i8> %x0, <16 x i8> %x1, ptr %x2p) {274; CHECK-LABEL: test_int_x86_avx512_mask_vpermt2var_qi_128_load:275; CHECK: ## %bb.0:276; CHECK-NEXT: vpermi2b (%rdi), %xmm1, %xmm0277; CHECK-NEXT: retq278 %x2 = load <16 x i8>, ptr %x2p279 %res = call <16 x i8> @llvm.x86.avx512.mask.vpermt2var.qi.128(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %x2, i16 -1)280 ret <16 x i8> %res281}282 283declare <32 x i8> @llvm.x86.avx512.mask.vpermt2var.qi.256(<32 x i8>, <32 x i8>, <32 x i8>, i32)284 285define <32 x i8>@test_int_x86_avx512_mask_vpermt2var_qi_256(<32 x i8> %x0, <32 x i8> %x1, <32 x i8> %x2) {286; CHECK-LABEL: test_int_x86_avx512_mask_vpermt2var_qi_256:287; CHECK: ## %bb.0:288; CHECK-NEXT: vpermi2b %ymm2, %ymm1, %ymm0289; CHECK-NEXT: retq290 %res = call <32 x i8> @llvm.x86.avx512.mask.vpermt2var.qi.256(<32 x i8> %x0, <32 x i8> %x1, <32 x i8> %x2, i32 -1)291 ret <32 x i8> %res292}293 294declare <16 x i8> @llvm.x86.avx512.maskz.vpermt2var.qi.128(<16 x i8>, <16 x i8>, <16 x i8>, i16)295 296define <16 x i8>@test_int_x86_avx512_maskz_vpermt2var_qi_128(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %x2, i16 %x3) {297; CHECK-LABEL: test_int_x86_avx512_maskz_vpermt2var_qi_128:298; CHECK: ## %bb.0:299; CHECK-NEXT: kmovd %edi, %k1300; CHECK-NEXT: vpermi2b %xmm2, %xmm1, %xmm0 {%k1} {z}301; CHECK-NEXT: retq302 %res = call <16 x i8> @llvm.x86.avx512.maskz.vpermt2var.qi.128(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %x2, i16 %x3)303 ret <16 x i8> %res304}305 306define <16 x i8>@test_int_x86_avx512_maskz_vpermt2var_qi_128_load(<16 x i8> %x0, <16 x i8> %x1, ptr %x2p, i16 %x3) {307; CHECK-LABEL: test_int_x86_avx512_maskz_vpermt2var_qi_128_load:308; CHECK: ## %bb.0:309; CHECK-NEXT: kmovd %esi, %k1310; CHECK-NEXT: vpermi2b (%rdi), %xmm1, %xmm0 {%k1} {z}311; CHECK-NEXT: retq312 %x2 = load <16 x i8>, ptr %x2p313 %res = call <16 x i8> @llvm.x86.avx512.maskz.vpermt2var.qi.128(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %x2, i16 %x3)314 ret <16 x i8> %res315}316 317declare <32 x i8> @llvm.x86.avx512.maskz.vpermt2var.qi.256(<32 x i8>, <32 x i8>, <32 x i8>, i32)318 319define <32 x i8>@test_int_x86_avx512_maskz_vpermt2var_qi_256(<32 x i8> %x0, <32 x i8> %x1, <32 x i8> %x2, i32 %x3) {320; CHECK-LABEL: test_int_x86_avx512_maskz_vpermt2var_qi_256:321; CHECK: ## %bb.0:322; CHECK-NEXT: kmovd %edi, %k1323; CHECK-NEXT: vpermi2b %ymm2, %ymm1, %ymm0 {%k1} {z}324; CHECK-NEXT: retq325 %res = call <32 x i8> @llvm.x86.avx512.maskz.vpermt2var.qi.256(<32 x i8> %x0, <32 x i8> %x1, <32 x i8> %x2, i32 %x3)326 ret <32 x i8> %res327}328 329define <32 x i8>@test_int_x86_avx512_maskz_vpermt2var_qi_256_load(<32 x i8> %x0, <32 x i8> %x1, ptr %x2p, i32 %x3) {330; CHECK-LABEL: test_int_x86_avx512_maskz_vpermt2var_qi_256_load:331; CHECK: ## %bb.0:332; CHECK-NEXT: kmovd %esi, %k1333; CHECK-NEXT: vpermi2b (%rdi), %ymm1, %ymm0 {%k1} {z}334; CHECK-NEXT: retq335 %x2 = load <32 x i8>, ptr %x2p336 %res = call <32 x i8> @llvm.x86.avx512.maskz.vpermt2var.qi.256(<32 x i8> %x0, <32 x i8> %x1, <32 x i8> %x2, i32 %x3)337 ret <32 x i8> %res338}339