1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -mtriple=x86_64-unknown-unknown -S | FileCheck %s 3 4declare i32 @llvm.x86.tbm.bextri.u32(i32, i32) nounwind readnone 5declare i64 @llvm.x86.tbm.bextri.u64(i64, i64) nounwind readnone 6declare i32 @llvm.x86.bmi.bextr.32(i32, i32) nounwind readnone 7declare i64 @llvm.x86.bmi.bextr.64(i64, i64) nounwind readnone 8declare i32 @llvm.x86.bmi.bzhi.32(i32, i32) nounwind readnone 9declare i64 @llvm.x86.bmi.bzhi.64(i64, i64) nounwind readnone 10declare i32 @llvm.x86.bmi.pext.32(i32, i32) nounwind readnone 11declare i64 @llvm.x86.bmi.pext.64(i64, i64) nounwind readnone 12declare i32 @llvm.x86.bmi.pdep.32(i32, i32) nounwind readnone 13declare i64 @llvm.x86.bmi.pdep.64(i64, i64) nounwind readnone 14 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 %1 22} 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 0 27; 28 %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 %a, i32 1) 29 ret i32 %1 30} 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 0 35; 36 %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 %a, i32 288) 37 ret i32 %1 38} 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 %1 47} 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 0 52; 53 %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 %a, i64 1) 54 ret i64 %1 55} 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 0 60; 61 %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 %a, i64 320) 62 ret i64 %1 63} 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 57005 68; 69 %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 3735928559, i32 4112) ; extract bits 31:16 from 0xDEADBEEF 70 ret i32 %1 71} 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 233495534 76; 77 %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 3735928559, i32 8196) ; extract bits 35:4 from 0xDEADBEEF 78 ret i32 %1 79} 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 233495534 84; 85 %1 = tail call i32 @llvm.x86.tbm.bextri.u32(i32 3735928559, i32 16388) ; extract bits 67:4 from 0xDEADBEEF 86 ret i32 %1 87} 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 57005 92; 93 %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 3735928559, i64 4112) ; extract bits 31:16 from 0xDEADBEEF 94 ret i64 %1 95} 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 233495534 100; 101 %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 3735928559, i64 16388) ; extract bits 67:4 from 0xDEADBEEF 102 ret i64 %1 103} 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 233495534 108; 109 %1 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 3735928559, i64 32772) ; extract bits 131:4 from 0xDEADBEEF 110 ret i64 %1 111} 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 %1 120} 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 0 125; 126 %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 %a, i32 1) 127 ret i32 %1 128} 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 0 133; 134 %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 %a, i32 288) 135 ret i32 %1 136} 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 %1 145} 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 0 150; 151 %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 %a, i64 1) 152 ret i64 %1 153} 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 0 158; 159 %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 %a, i64 320) 160 ret i64 %1 161} 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 57005 166; 167 %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 3735928559, i32 4112) ; extract bits 31:16 from 0xDEADBEEF 168 ret i32 %1 169} 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 233495534 174; 175 %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 3735928559, i32 8196) ; extract bits 35:4 from 0xDEADBEEF 176 ret i32 %1 177} 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 233495534 182; 183 %1 = tail call i32 @llvm.x86.bmi.bextr.32(i32 3735928559, i32 16388) ; extract bits 67:4 from 0xDEADBEEF 184 ret i32 %1 185} 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 57005 190; 191 %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 3735928559, i64 4112) ; extract bits 31:16 from 0xDEADBEEF 192 ret i64 %1 193} 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 233495534 198; 199 %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 3735928559, i64 16388) ; extract bits 67:4 from 0xDEADBEEF 200 ret i64 %1 201} 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 233495534 206; 207 %1 = tail call i64 @llvm.x86.bmi.bextr.64(i64 3735928559, i64 32772) ; extract bits 131:4 from 0xDEADBEEF 208 ret i64 %1 209} 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 %1 218} 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 0 223; 224 %1 = tail call i32 @llvm.x86.bmi.bzhi.32(i32 %a, i32 0) 225 ret i32 %1 226} 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 %1 234} 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 1 239; 240 %1 = tail call i32 @llvm.x86.bmi.bzhi.32(i32 5, i32 1) 241 ret i32 %1 242} 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 %1 251} 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 0 256; 257 %1 = tail call i64 @llvm.x86.bmi.bzhi.64(i64 %a, i64 0) 258 ret i64 %1 259} 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 %1 267} 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 1 272; 273 %1 = tail call i64 @llvm.x86.bmi.bzhi.64(i64 5, i64 1) 274 ret i64 %1 275} 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 0 280; 281 %1 = tail call i32 @llvm.x86.bmi.pext.32(i32 %x, i32 0) 282 ret i32 %1 283} 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 0 288; 289 %1 = tail call i64 @llvm.x86.bmi.pext.64(i64 %x, i64 0) 290 ret i64 %1 291} 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 %x 296; 297 %1 = tail call i32 @llvm.x86.bmi.pext.32(i32 %x, i32 -1) 298 ret i32 %1 299} 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 %x 304; 305 %1 = tail call i64 @llvm.x86.bmi.pext.64(i64 %x, i64 -1) 306 ret i64 %1 307} 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, 1 312; CHECK-NEXT: %2 = and i32 %1, 3 313; CHECK-NEXT: ret i32 %2 314; 315 %1 = tail call i32 @llvm.x86.bmi.pext.32(i32 %x, i32 6) 316 ret i32 %1 317} 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, 1 322; CHECK-NEXT: %2 = and i64 %1, 3 323; CHECK-NEXT: ret i64 %2 324; 325 %1 = tail call i64 @llvm.x86.bmi.pext.64(i64 %x, i64 6) 326 ret i64 %1 327} 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 30001 333; 334 %1 = tail call i32 @llvm.x86.bmi.pext.32(i32 1985229328, i32 4042322160) 335 ret i32 %1 336} 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 1966210489 341; 342 %1 = tail call i64 @llvm.x86.bmi.pext.64(i64 8526495043095935640, i64 -1085102592571150096) 343 ret i64 %1 344} 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 30224 349; 350 %1 = tail call i32 @llvm.x86.bmi.pext.32(i32 1985229328, i32 4278190335) 351 ret i32 %1 352} 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 1980816570 357; 358 %1 = tail call i64 @llvm.x86.bmi.pext.64(i64 8526495043095935640, i64 -72056498804490496) 359 ret i64 %1 360} 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 0 365; 366 %1 = tail call i32 @llvm.x86.bmi.pdep.32(i32 %x, i32 0) 367 ret i32 %1 368} 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 0 373; 374 %1 = tail call i64 @llvm.x86.bmi.pdep.64(i64 %x, i64 0) 375 ret i64 %1 376} 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 %x 381; 382 %1 = tail call i32 @llvm.x86.bmi.pdep.32(i32 %x, i32 -1) 383 ret i32 %1 384} 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 %x 389; 390 %1 = tail call i64 @llvm.x86.bmi.pdep.64(i64 %x, i64 -1) 391 ret i64 %1 392} 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, 2 397; CHECK-NEXT: %2 = and i32 %1, 12 398; CHECK-NEXT: ret i32 %2 399; 400 %1 = tail call i32 @llvm.x86.bmi.pdep.32(i32 %x, i32 12) 401 ret i32 %1 402} 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, 2 407; CHECK-NEXT: %2 = and i64 %1, 12 408; CHECK-NEXT: ret i64 %2 409; 410 %1 = tail call i64 @llvm.x86.bmi.pdep.64(i64 %x, i64 12) 411 ret i64 %1 412} 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 807407616 418; 419 %1 = tail call i32 @llvm.x86.bmi.pdep.32(i32 1985229328, i32 4042322160) 420 ret i32 %1 421} 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 -1089641583808049024 426; 427 %1 = tail call i64 @llvm.x86.bmi.pdep.64(i64 8526495043095935640, i64 -1085102592571150096) 428 ret i64 %1 429} 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 838860816 434; 435 %1 = tail call i32 @llvm.x86.bmi.pdep.32(i32 1985229328, i32 4278190335) 436 ret i32 %1 437} 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 -144114243170822144 442; 443 %1 = tail call i64 @llvm.x86.bmi.pdep.64(i64 8526495043095935640, i64 -72056498804490496) 444 ret i64 %1 445} 446