446 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -mtriple=x86_64-unknown-unknown -S | FileCheck %s3 4declare i32 @llvm.x86.tbm.bextri.u32(i32, i32) nounwind readnone5declare i64 @llvm.x86.tbm.bextri.u64(i64, i64) nounwind readnone6declare i32 @llvm.x86.bmi.bextr.32(i32, i32) nounwind readnone7declare i64 @llvm.x86.bmi.bextr.64(i64, i64) nounwind readnone8declare i32 @llvm.x86.bmi.bzhi.32(i32, i32) nounwind readnone9declare i64 @llvm.x86.bmi.bzhi.64(i64, i64) nounwind readnone10declare i32 @llvm.x86.bmi.pext.32(i32, i32) nounwind readnone11declare i64 @llvm.x86.bmi.pext.64(i64, i64) nounwind readnone12declare i32 @llvm.x86.bmi.pdep.32(i32, i32) nounwind readnone13declare i64 @llvm.x86.bmi.pdep.64(i64, i64) nounwind readnone14 15define i32 @test_x86_tbm_bextri_u32(i32 %a) nounwind readnone {16; CHECK-LABEL: @test_x86_tbm_bextri_u32(17; CHECK-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.x86.tbm.bextri.u32(i32 [[A:%.*]], i32 1296)18; CHECK-NEXT: ret i32 [[TMP1]]19;20 %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 %a, i32 1296)21 ret i32 %122}23 24define i32 @test_x86_tbm_bextri_u32_zero_length(i32 %a) nounwind readnone {25; CHECK-LABEL: @test_x86_tbm_bextri_u32_zero_length(26; CHECK-NEXT: ret i32 027;28 %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 %a, i32 1)29 ret i32 %130}31 32define i32 @test_x86_tbm_bextri_u32_large_shift(i32 %a) nounwind readnone {33; CHECK-LABEL: @test_x86_tbm_bextri_u32_large_shift(34; CHECK-NEXT: ret i32 035;36 %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 %a, i32 288)37 ret i32 %138}39 40define i64 @test_x86_tbm_bextri_u64(i64 %a) nounwind readnone {41; CHECK-LABEL: @test_x86_tbm_bextri_u64(42; CHECK-NEXT: [[TMP1:%.*]] = tail call i64 @llvm.x86.tbm.bextri.u64(i64 [[A:%.*]], i64 1312)43; CHECK-NEXT: ret i64 [[TMP1]]44;45 %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 %a, i64 1312)46 ret i64 %147}48 49define i64 @test_x86_tbm_bextri_u64_zero_length(i64 %a) nounwind readnone {50; CHECK-LABEL: @test_x86_tbm_bextri_u64_zero_length(51; CHECK-NEXT: ret i64 052;53 %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 %a, i64 1)54 ret i64 %155}56 57define i64 @test_x86_tbm_bextri_u64_large_shift(i64 %a) nounwind readnone {58; CHECK-LABEL: @test_x86_tbm_bextri_u64_large_shift(59; CHECK-NEXT: ret i64 060;61 %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 %a, i64 320)62 ret i64 %163}64 65define i32 @test_x86_tbm_bextri_u32_constfold() nounwind readnone {66; CHECK-LABEL: @test_x86_tbm_bextri_u32_constfold(67; CHECK-NEXT: ret i32 5700568;69 %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 3735928559, i32 4112) ; extract bits 31:16 from 0xDEADBEEF70 ret i32 %171}72 73define i32 @test_x86_tbm_bextri_u32_constfold2() nounwind readnone {74; CHECK-LABEL: @test_x86_tbm_bextri_u32_constfold2(75; CHECK-NEXT: ret i32 23349553476;77 %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 3735928559, i32 8196) ; extract bits 35:4 from 0xDEADBEEF78 ret i32 %179}80 81define i32 @test_x86_tbm_bextri_u32_constfold3() nounwind readnone {82; CHECK-LABEL: @test_x86_tbm_bextri_u32_constfold3(83; CHECK-NEXT: ret i32 23349553484;85 %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 3735928559, i32 16388) ; extract bits 67:4 from 0xDEADBEEF86 ret i32 %187}88 89define i64 @test_x86_tbm_bextri_u64_constfold() nounwind readnone {90; CHECK-LABEL: @test_x86_tbm_bextri_u64_constfold(91; CHECK-NEXT: ret i64 5700592;93 %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 3735928559, i64 4112) ; extract bits 31:16 from 0xDEADBEEF94 ret i64 %195}96 97define i64 @test_x86_tbm_bextri_u64_constfold2() nounwind readnone {98; CHECK-LABEL: @test_x86_tbm_bextri_u64_constfold2(99; CHECK-NEXT: ret i64 233495534100;101 %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 3735928559, i64 16388) ; extract bits 67:4 from 0xDEADBEEF102 ret i64 %1103}104 105define i64 @test_x86_tbm_bextri_u64_constfold3() nounwind readnone {106; CHECK-LABEL: @test_x86_tbm_bextri_u64_constfold3(107; CHECK-NEXT: ret i64 233495534108;109 %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 3735928559, i64 32772) ; extract bits 131:4 from 0xDEADBEEF110 ret i64 %1111}112 113define i32 @test_x86_bmi_bextri_32(i32 %a) nounwind readnone {114; CHECK-LABEL: @test_x86_bmi_bextri_32(115; CHECK-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.x86.bmi.bextr.32(i32 [[A:%.*]], i32 1296)116; CHECK-NEXT: ret i32 [[TMP1]]117;118 %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 %a, i32 1296)119 ret i32 %1120}121 122define i32 @test_x86_bmi_bextri_32_zero_length(i32 %a) nounwind readnone {123; CHECK-LABEL: @test_x86_bmi_bextri_32_zero_length(124; CHECK-NEXT: ret i32 0125;126 %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 %a, i32 1)127 ret i32 %1128}129 130define i32 @test_x86_bmi_bextri_32_large_shift(i32 %a) nounwind readnone {131; CHECK-LABEL: @test_x86_bmi_bextri_32_large_shift(132; CHECK-NEXT: ret i32 0133;134 %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 %a, i32 288)135 ret i32 %1136}137 138define i64 @test_x86_bmi_bextri_64(i64 %a) nounwind readnone {139; CHECK-LABEL: @test_x86_bmi_bextri_64(140; CHECK-NEXT: [[TMP1:%.*]] = tail call i64 @llvm.x86.bmi.bextr.64(i64 [[A:%.*]], i64 1312)141; CHECK-NEXT: ret i64 [[TMP1]]142;143 %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 %a, i64 1312)144 ret i64 %1145}146 147define i64 @test_x86_bmi_bextri_64_zero_length(i64 %a) nounwind readnone {148; CHECK-LABEL: @test_x86_bmi_bextri_64_zero_length(149; CHECK-NEXT: ret i64 0150;151 %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 %a, i64 1)152 ret i64 %1153}154 155define i64 @test_x86_bmi_bextri_64_large_shift(i64 %a) nounwind readnone {156; CHECK-LABEL: @test_x86_bmi_bextri_64_large_shift(157; CHECK-NEXT: ret i64 0158;159 %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 %a, i64 320)160 ret i64 %1161}162 163define i32 @test_x86_bmi_bextri_32_constfold() nounwind readnone {164; CHECK-LABEL: @test_x86_bmi_bextri_32_constfold(165; CHECK-NEXT: ret i32 57005166;167 %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 3735928559, i32 4112) ; extract bits 31:16 from 0xDEADBEEF168 ret i32 %1169}170 171define i32 @test_x86_bmi_bextri_32_constfold2() nounwind readnone {172; CHECK-LABEL: @test_x86_bmi_bextri_32_constfold2(173; CHECK-NEXT: ret i32 233495534174;175 %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 3735928559, i32 8196) ; extract bits 35:4 from 0xDEADBEEF176 ret i32 %1177}178 179define i32 @test_x86_bmi_bextri_32_constfold3() nounwind readnone {180; CHECK-LABEL: @test_x86_bmi_bextri_32_constfold3(181; CHECK-NEXT: ret i32 233495534182;183 %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 3735928559, i32 16388) ; extract bits 67:4 from 0xDEADBEEF184 ret i32 %1185}186 187define i64 @test_x86_bmi_bextri_64_constfold() nounwind readnone {188; CHECK-LABEL: @test_x86_bmi_bextri_64_constfold(189; CHECK-NEXT: ret i64 57005190;191 %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 3735928559, i64 4112) ; extract bits 31:16 from 0xDEADBEEF192 ret i64 %1193}194 195define i64 @test_x86_bmi_bextri_64_constfold2() nounwind readnone {196; CHECK-LABEL: @test_x86_bmi_bextri_64_constfold2(197; CHECK-NEXT: ret i64 233495534198;199 %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 3735928559, i64 16388) ; extract bits 67:4 from 0xDEADBEEF200 ret i64 %1201}202 203define i64 @test_x86_bmi_bextri_64_constfold3() nounwind readnone {204; CHECK-LABEL: @test_x86_bmi_bextri_64_constfold3(205; CHECK-NEXT: ret i64 233495534206;207 %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 3735928559, i64 32772) ; extract bits 131:4 from 0xDEADBEEF208 ret i64 %1209}210 211define i32 @test_x86_bmi_bzhi_32(i32 %a) nounwind readnone {212; CHECK-LABEL: @test_x86_bmi_bzhi_32(213; CHECK-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.x86.bmi.bzhi.32(i32 [[A:%.*]], i32 31)214; CHECK-NEXT: ret i32 [[TMP1]]215;216 %1 = tail call i32 @llvm.x86.bmi.bzhi.32(i32 %a, i32 31)217 ret i32 %1218}219 220define i32 @test_x86_bmi_bzhi_32_zero(i32 %a) nounwind readnone {221; CHECK-LABEL: @test_x86_bmi_bzhi_32_zero(222; CHECK-NEXT: ret i32 0223;224 %1 = tail call i32 @llvm.x86.bmi.bzhi.32(i32 %a, i32 0)225 ret i32 %1226}227 228define i32 @test_x86_bmi_bzhi_32_max(i32 %a) nounwind readnone {229; CHECK-LABEL: @test_x86_bmi_bzhi_32_max(230; CHECK-NEXT: ret i32 [[A:%.*]]231;232 %1 = tail call i32 @llvm.x86.bmi.bzhi.32(i32 %a, i32 32)233 ret i32 %1234}235 236define i32 @test_x86_bmi_bzhi_32_constfold() nounwind readnone {237; CHECK-LABEL: @test_x86_bmi_bzhi_32_constfold(238; CHECK-NEXT: ret i32 1239;240 %1 = tail call i32 @llvm.x86.bmi.bzhi.32(i32 5, i32 1)241 ret i32 %1242}243 244define i64 @test_x86_bmi_bzhi_64(i64 %a) nounwind readnone {245; CHECK-LABEL: @test_x86_bmi_bzhi_64(246; CHECK-NEXT: [[TMP1:%.*]] = tail call i64 @llvm.x86.bmi.bzhi.64(i64 [[A:%.*]], i64 63)247; CHECK-NEXT: ret i64 [[TMP1]]248;249 %1 = tail call i64 @llvm.x86.bmi.bzhi.64(i64 %a, i64 63)250 ret i64 %1251}252 253define i64 @test_x86_bmi_bzhi_64_zero(i64 %a) nounwind readnone {254; CHECK-LABEL: @test_x86_bmi_bzhi_64_zero(255; CHECK-NEXT: ret i64 0256;257 %1 = tail call i64 @llvm.x86.bmi.bzhi.64(i64 %a, i64 0)258 ret i64 %1259}260 261define i64 @test_x86_bmi_bzhi_64_max(i64 %a) nounwind readnone {262; CHECK-LABEL: @test_x86_bmi_bzhi_64_max(263; CHECK-NEXT: ret i64 [[A:%.*]]264;265 %1 = tail call i64 @llvm.x86.bmi.bzhi.64(i64 %a, i64 64)266 ret i64 %1267}268 269define i64 @test_x86_bmi_bzhi_64_constfold() nounwind readnone {270; CHECK-LABEL: @test_x86_bmi_bzhi_64_constfold(271; CHECK-NEXT: ret i64 1272;273 %1 = tail call i64 @llvm.x86.bmi.bzhi.64(i64 5, i64 1)274 ret i64 %1275}276 277define i32 @test_x86_pext_32_zero_mask(i32 %x) nounwind readnone {278; CHECK-LABEL: @test_x86_pext_32_zero_mask(279; CHECK-NEXT: ret i32 0280;281 %1 = tail call i32 @llvm.x86.bmi.pext.32(i32 %x, i32 0)282 ret i32 %1283}284 285define i64 @test_x86_pext_64_zero_mask(i64 %x) nounwind readnone {286; CHECK-LABEL: @test_x86_pext_64_zero_mask(287; CHECK-NEXT: ret i64 0288;289 %1 = tail call i64 @llvm.x86.bmi.pext.64(i64 %x, i64 0)290 ret i64 %1291}292 293define i32 @test_x86_pext_32_allones_mask(i32 %x) nounwind readnone {294; CHECK-LABEL: @test_x86_pext_32_allones_mask(295; CHECK-NEXT: ret i32 %x296;297 %1 = tail call i32 @llvm.x86.bmi.pext.32(i32 %x, i32 -1)298 ret i32 %1299}300 301define i64 @test_x86_pext_64_allones_mask(i64 %x) nounwind readnone {302; CHECK-LABEL: @test_x86_pext_64_allones_mask(303; CHECK-NEXT: ret i64 %x304;305 %1 = tail call i64 @llvm.x86.bmi.pext.64(i64 %x, i64 -1)306 ret i64 %1307}308 309define i32 @test_x86_pext_32_shifted_mask(i32 %x) nounwind readnone {310; CHECK-LABEL: @test_x86_pext_32_shifted_mask(311; CHECK-NEXT: %1 = lshr i32 %x, 1312; CHECK-NEXT: %2 = and i32 %1, 3313; CHECK-NEXT: ret i32 %2314;315 %1 = tail call i32 @llvm.x86.bmi.pext.32(i32 %x, i32 6)316 ret i32 %1317}318 319define i64 @test_x86_pext_64_shifted_mask(i64 %x) nounwind readnone {320; CHECK-LABEL: @test_x86_pext_64_shifted_mask(321; CHECK-NEXT: %1 = lshr i64 %x, 1322; CHECK-NEXT: %2 = and i64 %1, 3323; CHECK-NEXT: ret i64 %2324;325 %1 = tail call i64 @llvm.x86.bmi.pext.64(i64 %x, i64 6)326 ret i64 %1327}328 329 330define i32 @test_x86_pext_32_constant_fold() nounwind readnone {331; CHECK-LABEL: @test_x86_pext_32_constant_fold(332; CHECK-NEXT: ret i32 30001333;334 %1 = tail call i32 @llvm.x86.bmi.pext.32(i32 1985229328, i32 4042322160)335 ret i32 %1336}337 338define i64 @test_x86_pext_64_constant_fold() nounwind readnone {339; CHECK-LABEL: @test_x86_pext_64_constant_fold(340; CHECK-NEXT: ret i64 1966210489341;342 %1 = tail call i64 @llvm.x86.bmi.pext.64(i64 8526495043095935640, i64 -1085102592571150096)343 ret i64 %1344}345 346define i32 @test_x86_pext_32_constant_fold_2() nounwind readnone {347; CHECK-LABEL: @test_x86_pext_32_constant_fold_2(348; CHECK-NEXT: ret i32 30224349;350 %1 = tail call i32 @llvm.x86.bmi.pext.32(i32 1985229328, i32 4278190335)351 ret i32 %1352}353 354define i64 @test_x86_pext_64_constant_fold_2() nounwind readnone {355; CHECK-LABEL: @test_x86_pext_64_constant_fold_2(356; CHECK-NEXT: ret i64 1980816570357;358 %1 = tail call i64 @llvm.x86.bmi.pext.64(i64 8526495043095935640, i64 -72056498804490496)359 ret i64 %1360}361 362define i32 @test_x86_pdep_32_zero_mask(i32 %x) nounwind readnone {363; CHECK-LABEL: @test_x86_pdep_32_zero_mask(364; CHECK-NEXT: ret i32 0365;366 %1 = tail call i32 @llvm.x86.bmi.pdep.32(i32 %x, i32 0)367 ret i32 %1368}369 370define i64 @test_x86_pdep_64_zero_mask(i64 %x) nounwind readnone {371; CHECK-LABEL: @test_x86_pdep_64_zero_mask(372; CHECK-NEXT: ret i64 0373;374 %1 = tail call i64 @llvm.x86.bmi.pdep.64(i64 %x, i64 0)375 ret i64 %1376}377 378define i32 @test_x86_pdep_32_allones_mask(i32 %x) nounwind readnone {379; CHECK-LABEL: @test_x86_pdep_32_allones_mask(380; CHECK-NEXT: ret i32 %x381;382 %1 = tail call i32 @llvm.x86.bmi.pdep.32(i32 %x, i32 -1)383 ret i32 %1384}385 386define i64 @test_x86_pdep_64_allones_mask(i64 %x) nounwind readnone {387; CHECK-LABEL: @test_x86_pdep_64_allones_mask(388; CHECK-NEXT: ret i64 %x389;390 %1 = tail call i64 @llvm.x86.bmi.pdep.64(i64 %x, i64 -1)391 ret i64 %1392}393 394define i32 @test_x86_pdep_32_shifted_mask(i32 %x) nounwind readnone {395; CHECK-LABEL: @test_x86_pdep_32_shifted_mask(396; CHECK-NEXT: %1 = shl i32 %x, 2397; CHECK-NEXT: %2 = and i32 %1, 12398; CHECK-NEXT: ret i32 %2399;400 %1 = tail call i32 @llvm.x86.bmi.pdep.32(i32 %x, i32 12)401 ret i32 %1402}403 404define i64 @test_x86_pdep_64_shifted_mask(i64 %x) nounwind readnone {405; CHECK-LABEL: @test_x86_pdep_64_shifted_mask(406; CHECK-NEXT: %1 = shl i64 %x, 2407; CHECK-NEXT: %2 = and i64 %1, 12408; CHECK-NEXT: ret i64 %2409;410 %1 = tail call i64 @llvm.x86.bmi.pdep.64(i64 %x, i64 12)411 ret i64 %1412}413 414 415define i32 @test_x86_pdep_32_constant_fold() nounwind readnone {416; CHECK-LABEL: @test_x86_pdep_32_constant_fold(417; CHECK-NEXT: ret i32 807407616418;419 %1 = tail call i32 @llvm.x86.bmi.pdep.32(i32 1985229328, i32 4042322160)420 ret i32 %1421}422 423define i64 @test_x86_pdep_64_constant_fold() nounwind readnone {424; CHECK-LABEL: @test_x86_pdep_64_constant_fold(425; CHECK-NEXT: ret i64 -1089641583808049024426;427 %1 = tail call i64 @llvm.x86.bmi.pdep.64(i64 8526495043095935640, i64 -1085102592571150096)428 ret i64 %1429}430 431define i32 @test_x86_pdep_32_constant_fold_2() nounwind readnone {432; CHECK-LABEL: @test_x86_pdep_32_constant_fold_2(433; CHECK-NEXT: ret i32 838860816434;435 %1 = tail call i32 @llvm.x86.bmi.pdep.32(i32 1985229328, i32 4278190335)436 ret i32 %1437}438 439define i64 @test_x86_pdep_64_constant_fold_2() nounwind readnone {440; CHECK-LABEL: @test_x86_pdep_64_constant_fold_2(441; CHECK-NEXT: ret i64 -144114243170822144442;443 %1 = tail call i64 @llvm.x86.bmi.pdep.64(i64 8526495043095935640, i64 -72056498804490496)444 ret i64 %1445}446