1012 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- -mattr=avx2 | FileCheck %s3 4define i8 @or_lshr_commute0(i8 %x0, i8 %x1, i8 %y, i8 %z) {5; CHECK-LABEL: or_lshr_commute0:6; CHECK: # %bb.0:7; CHECK-NEXT: movl %ecx, %eax8; CHECK-NEXT: movl %edx, %ecx9; CHECK-NEXT: orl %esi, %edi10; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx11; CHECK-NEXT: shrb %cl, %dil12; CHECK-NEXT: orb %dil, %al13; CHECK-NEXT: # kill: def $al killed $al killed $eax14; CHECK-NEXT: retq15 %sh1 = lshr i8 %x0, %y16 %sh2 = lshr i8 %x1, %y17 %logic = or i8 %sh1, %z18 %r = or i8 %logic, %sh219 ret i8 %r20}21 22define i32 @or_lshr_commute1(i32 %x0, i32 %x1, i32 %y, i32 %z) {23; CHECK-LABEL: or_lshr_commute1:24; CHECK: # %bb.0:25; CHECK-NEXT: movl %ecx, %eax26; CHECK-NEXT: movl %edx, %ecx27; CHECK-NEXT: orl %esi, %edi28; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx29; CHECK-NEXT: shrl %cl, %edi30; CHECK-NEXT: orl %edi, %eax31; CHECK-NEXT: retq32 %sh1 = lshr i32 %x0, %y33 %sh2 = lshr i32 %x1, %y34 %logic = or i32 %z, %sh135 %r = or i32 %logic, %sh236 ret i32 %r37}38 39define <8 x i16> @or_lshr_commute2(<8 x i16> %x0, <8 x i16> %x1, <8 x i16> %y, <8 x i16> %z) {40; CHECK-LABEL: or_lshr_commute2:41; CHECK: # %bb.0:42; CHECK-NEXT: vpor %xmm1, %xmm0, %xmm043; CHECK-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero44; CHECK-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero45; CHECK-NEXT: vpsrlvd %ymm1, %ymm0, %ymm046; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm147; CHECK-NEXT: vpackusdw %xmm1, %xmm0, %xmm048; CHECK-NEXT: vpor %xmm3, %xmm0, %xmm049; CHECK-NEXT: vzeroupper50; CHECK-NEXT: retq51 %sh1 = lshr <8 x i16> %x0, %y52 %sh2 = lshr <8 x i16> %x1, %y53 %logic = or <8 x i16> %sh1, %z54 %r = or <8 x i16> %sh2, %logic55 ret <8 x i16> %r56}57 58define <2 x i64> @or_lshr_commute3(<2 x i64> %x0, <2 x i64> %x1, <2 x i64> %y, <2 x i64> %z) {59; CHECK-LABEL: or_lshr_commute3:60; CHECK: # %bb.0:61; CHECK-NEXT: vpor %xmm1, %xmm0, %xmm062; CHECK-NEXT: vpsrlvq %xmm2, %xmm0, %xmm063; CHECK-NEXT: vpor %xmm3, %xmm0, %xmm064; CHECK-NEXT: retq65 %sh1 = lshr <2 x i64> %x0, %y66 %sh2 = lshr <2 x i64> %x1, %y67 %logic = or <2 x i64> %z, %sh168 %r = or <2 x i64> %sh2, %logic69 ret <2 x i64> %r70}71 72define i16 @or_ashr_commute0(i16 %x0, i16 %x1, i16 %y, i16 %z) {73; CHECK-LABEL: or_ashr_commute0:74; CHECK: # %bb.0:75; CHECK-NEXT: movl %ecx, %r8d76; CHECK-NEXT: movl %edx, %ecx77; CHECK-NEXT: orl %esi, %edi78; CHECK-NEXT: movswl %di, %eax79; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx80; CHECK-NEXT: sarl %cl, %eax81; CHECK-NEXT: orl %r8d, %eax82; CHECK-NEXT: # kill: def $ax killed $ax killed $eax83; CHECK-NEXT: retq84 %sh1 = ashr i16 %x0, %y85 %sh2 = ashr i16 %x1, %y86 %logic = or i16 %sh1, %z87 %r = or i16 %logic, %sh288 ret i16 %r89}90 91define i64 @or_ashr_commute1(i64 %x0, i64 %x1, i64 %y, i64 %z) {92; CHECK-LABEL: or_ashr_commute1:93; CHECK: # %bb.0:94; CHECK-NEXT: movq %rcx, %rax95; CHECK-NEXT: movq %rdx, %rcx96; CHECK-NEXT: orq %rsi, %rdi97; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx98; CHECK-NEXT: sarq %cl, %rdi99; CHECK-NEXT: orq %rdi, %rax100; CHECK-NEXT: retq101 %sh1 = ashr i64 %x0, %y102 %sh2 = ashr i64 %x1, %y103 %logic = or i64 %z, %sh1104 %r = or i64 %logic, %sh2105 ret i64 %r106}107 108define <4 x i32> @or_ashr_commute2(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %y, <4 x i32> %z) {109; CHECK-LABEL: or_ashr_commute2:110; CHECK: # %bb.0:111; CHECK-NEXT: vpor %xmm1, %xmm0, %xmm0112; CHECK-NEXT: vpsravd %xmm2, %xmm0, %xmm0113; CHECK-NEXT: vpor %xmm3, %xmm0, %xmm0114; CHECK-NEXT: retq115 %sh1 = ashr <4 x i32> %x0, %y116 %sh2 = ashr <4 x i32> %x1, %y117 %logic = or <4 x i32> %sh1, %z118 %r = or <4 x i32> %sh2, %logic119 ret <4 x i32> %r120}121 122define <16 x i8> @or_ashr_commute3(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %y, <16 x i8> %z) {123; CHECK-LABEL: or_ashr_commute3:124; CHECK: # %bb.0:125; CHECK-NEXT: vpsllw $5, %xmm2, %xmm2126; CHECK-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]127; CHECK-NEXT: vpor %xmm1, %xmm0, %xmm0128; CHECK-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]129; CHECK-NEXT: vpsraw $4, %xmm1, %xmm5130; CHECK-NEXT: vpblendvb %xmm4, %xmm5, %xmm1, %xmm1131; CHECK-NEXT: vpsraw $2, %xmm1, %xmm5132; CHECK-NEXT: vpaddw %xmm4, %xmm4, %xmm6133; CHECK-NEXT: vpblendvb %xmm6, %xmm5, %xmm1, %xmm1134; CHECK-NEXT: vpsraw $1, %xmm1, %xmm5135; CHECK-NEXT: vpsllw $2, %xmm4, %xmm4136; CHECK-NEXT: vpblendvb %xmm4, %xmm5, %xmm1, %xmm1137; CHECK-NEXT: vpsrlw $8, %xmm1, %xmm1138; CHECK-NEXT: vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]139; CHECK-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]140; CHECK-NEXT: vpsraw $4, %xmm0, %xmm4141; CHECK-NEXT: vpblendvb %xmm2, %xmm4, %xmm0, %xmm0142; CHECK-NEXT: vpsraw $2, %xmm0, %xmm4143; CHECK-NEXT: vpaddw %xmm2, %xmm2, %xmm5144; CHECK-NEXT: vpblendvb %xmm5, %xmm4, %xmm0, %xmm0145; CHECK-NEXT: vpsraw $1, %xmm0, %xmm4146; CHECK-NEXT: vpsllw $2, %xmm2, %xmm2147; CHECK-NEXT: vpblendvb %xmm2, %xmm4, %xmm0, %xmm0148; CHECK-NEXT: vpsrlw $8, %xmm0, %xmm0149; CHECK-NEXT: vpackuswb %xmm1, %xmm0, %xmm0150; CHECK-NEXT: vpor %xmm3, %xmm0, %xmm0151; CHECK-NEXT: retq152 %sh1 = ashr <16 x i8> %x0, %y153 %sh2 = ashr <16 x i8> %x1, %y154 %logic = or <16 x i8> %z, %sh1155 %r = or <16 x i8> %sh2, %logic156 ret <16 x i8> %r157}158 159define i32 @or_shl_commute0(i32 %x0, i32 %x1, i32 %y, i32 %z) {160; CHECK-LABEL: or_shl_commute0:161; CHECK: # %bb.0:162; CHECK-NEXT: movl %ecx, %eax163; CHECK-NEXT: movl %edx, %ecx164; CHECK-NEXT: orl %esi, %edi165; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx166; CHECK-NEXT: shll %cl, %edi167; CHECK-NEXT: orl %edi, %eax168; CHECK-NEXT: retq169 %sh1 = shl i32 %x0, %y170 %sh2 = shl i32 %x1, %y171 %logic = or i32 %sh1, %z172 %r = or i32 %logic, %sh2173 ret i32 %r174}175 176define i8 @or_shl_commute1(i8 %x0, i8 %x1, i8 %y, i8 %z) {177; CHECK-LABEL: or_shl_commute1:178; CHECK: # %bb.0:179; CHECK-NEXT: movl %ecx, %eax180; CHECK-NEXT: movl %edx, %ecx181; CHECK-NEXT: orl %esi, %edi182; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx183; CHECK-NEXT: shlb %cl, %dil184; CHECK-NEXT: orb %dil, %al185; CHECK-NEXT: # kill: def $al killed $al killed $eax186; CHECK-NEXT: retq187 %sh1 = shl i8 %x0, %y188 %sh2 = shl i8 %x1, %y189 %logic = or i8 %z, %sh1190 %r = or i8 %logic, %sh2191 ret i8 %r192}193 194define <2 x i64> @or_shl_commute2(<2 x i64> %x0, <2 x i64> %x1, <2 x i64> %y, <2 x i64> %z) {195; CHECK-LABEL: or_shl_commute2:196; CHECK: # %bb.0:197; CHECK-NEXT: vpor %xmm1, %xmm0, %xmm0198; CHECK-NEXT: vpsllvq %xmm2, %xmm0, %xmm0199; CHECK-NEXT: vpor %xmm3, %xmm0, %xmm0200; CHECK-NEXT: retq201 %sh1 = shl <2 x i64> %x0, %y202 %sh2 = shl <2 x i64> %x1, %y203 %logic = or <2 x i64> %sh1, %z204 %r = or <2 x i64> %sh2, %logic205 ret <2 x i64> %r206}207 208define <8 x i16> @or_shl_commute3(<8 x i16> %x0, <8 x i16> %x1, <8 x i16> %y, <8 x i16> %z) {209; CHECK-LABEL: or_shl_commute3:210; CHECK: # %bb.0:211; CHECK-NEXT: vpor %xmm1, %xmm0, %xmm0212; CHECK-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero213; CHECK-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero214; CHECK-NEXT: vpsllvd %ymm1, %ymm0, %ymm0215; CHECK-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]216; CHECK-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]217; CHECK-NEXT: vpor %xmm3, %xmm0, %xmm0218; CHECK-NEXT: vzeroupper219; CHECK-NEXT: retq220 %sh1 = shl <8 x i16> %x0, %y221 %sh2 = shl <8 x i16> %x1, %y222 %logic = or <8 x i16> %z, %sh1223 %r = or <8 x i16> %sh2, %logic224 ret <8 x i16> %r225}226 227; negative test - mismatched shift opcodes228 229define i64 @or_mix_shr(i64 %x0, i64 %x1, i64 %y, i64 %z) {230; CHECK-LABEL: or_mix_shr:231; CHECK: # %bb.0:232; CHECK-NEXT: movq %rcx, %rax233; CHECK-NEXT: movq %rdx, %rcx234; CHECK-NEXT: sarq %cl, %rdi235; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx236; CHECK-NEXT: shrq %cl, %rsi237; CHECK-NEXT: orq %rdi, %rax238; CHECK-NEXT: orq %rsi, %rax239; CHECK-NEXT: retq240 %sh1 = ashr i64 %x0, %y241 %sh2 = lshr i64 %x1, %y242 %logic = or i64 %sh1, %z243 %r = or i64 %logic, %sh2244 ret i64 %r245}246 247; negative test - mismatched shift amounts248 249define i64 @or_lshr_mix_shift_amount(i64 %x0, i64 %x1, i64 %y, i64 %z, i64 %w) {250; CHECK-LABEL: or_lshr_mix_shift_amount:251; CHECK: # %bb.0:252; CHECK-NEXT: movq %rcx, %rax253; CHECK-NEXT: movq %rdx, %rcx254; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx255; CHECK-NEXT: shrq %cl, %rdi256; CHECK-NEXT: movl %r8d, %ecx257; CHECK-NEXT: shrq %cl, %rsi258; CHECK-NEXT: orq %rdi, %rax259; CHECK-NEXT: orq %rsi, %rax260; CHECK-NEXT: retq261 %sh1 = lshr i64 %x0, %y262 %sh2 = lshr i64 %x1, %w263 %logic = or i64 %sh1, %z264 %r = or i64 %logic, %sh2265 ret i64 %r266}267 268; negative test - mismatched logic opcodes269 270define i64 @mix_logic_lshr(i64 %x0, i64 %x1, i64 %y, i64 %z) {271; CHECK-LABEL: mix_logic_lshr:272; CHECK: # %bb.0:273; CHECK-NEXT: movq %rcx, %rax274; CHECK-NEXT: movq %rdx, %rcx275; CHECK-NEXT: shrq %cl, %rdi276; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx277; CHECK-NEXT: shrq %cl, %rsi278; CHECK-NEXT: xorq %rdi, %rax279; CHECK-NEXT: orq %rsi, %rax280; CHECK-NEXT: retq281 %sh1 = lshr i64 %x0, %y282 %sh2 = lshr i64 %x1, %y283 %logic = xor i64 %sh1, %z284 %r = or i64 %logic, %sh2285 ret i64 %r286}287 288define i8 @xor_lshr_commute0(i8 %x0, i8 %x1, i8 %y, i8 %z) {289; CHECK-LABEL: xor_lshr_commute0:290; CHECK: # %bb.0:291; CHECK-NEXT: movl %ecx, %eax292; CHECK-NEXT: movl %edx, %ecx293; CHECK-NEXT: xorl %esi, %edi294; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx295; CHECK-NEXT: shrb %cl, %dil296; CHECK-NEXT: xorb %dil, %al297; CHECK-NEXT: # kill: def $al killed $al killed $eax298; CHECK-NEXT: retq299 %sh1 = lshr i8 %x0, %y300 %sh2 = lshr i8 %x1, %y301 %logic = xor i8 %sh1, %z302 %r = xor i8 %logic, %sh2303 ret i8 %r304}305 306define i32 @xor_lshr_commute1(i32 %x0, i32 %x1, i32 %y, i32 %z) {307; CHECK-LABEL: xor_lshr_commute1:308; CHECK: # %bb.0:309; CHECK-NEXT: movl %ecx, %eax310; CHECK-NEXT: movl %edx, %ecx311; CHECK-NEXT: xorl %esi, %edi312; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx313; CHECK-NEXT: shrl %cl, %edi314; CHECK-NEXT: xorl %edi, %eax315; CHECK-NEXT: retq316 %sh1 = lshr i32 %x0, %y317 %sh2 = lshr i32 %x1, %y318 %logic = xor i32 %z, %sh1319 %r = xor i32 %logic, %sh2320 ret i32 %r321}322 323define <8 x i16> @xor_lshr_commute2(<8 x i16> %x0, <8 x i16> %x1, <8 x i16> %y, <8 x i16> %z) {324; CHECK-LABEL: xor_lshr_commute2:325; CHECK: # %bb.0:326; CHECK-NEXT: vpxor %xmm1, %xmm0, %xmm0327; CHECK-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero328; CHECK-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero329; CHECK-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0330; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm1331; CHECK-NEXT: vpackusdw %xmm1, %xmm0, %xmm0332; CHECK-NEXT: vpxor %xmm3, %xmm0, %xmm0333; CHECK-NEXT: vzeroupper334; CHECK-NEXT: retq335 %sh1 = lshr <8 x i16> %x0, %y336 %sh2 = lshr <8 x i16> %x1, %y337 %logic = xor <8 x i16> %sh1, %z338 %r = xor <8 x i16> %sh2, %logic339 ret <8 x i16> %r340}341 342define <2 x i64> @xor_lshr_commute3(<2 x i64> %x0, <2 x i64> %x1, <2 x i64> %y, <2 x i64> %z) {343; CHECK-LABEL: xor_lshr_commute3:344; CHECK: # %bb.0:345; CHECK-NEXT: vpxor %xmm1, %xmm0, %xmm0346; CHECK-NEXT: vpsrlvq %xmm2, %xmm0, %xmm0347; CHECK-NEXT: vpxor %xmm3, %xmm0, %xmm0348; CHECK-NEXT: retq349 %sh1 = lshr <2 x i64> %x0, %y350 %sh2 = lshr <2 x i64> %x1, %y351 %logic = xor <2 x i64> %z, %sh1352 %r = xor <2 x i64> %sh2, %logic353 ret <2 x i64> %r354}355 356define i16 @xor_ashr_commute0(i16 %x0, i16 %x1, i16 %y, i16 %z) {357; CHECK-LABEL: xor_ashr_commute0:358; CHECK: # %bb.0:359; CHECK-NEXT: movl %ecx, %r8d360; CHECK-NEXT: movl %edx, %ecx361; CHECK-NEXT: xorl %esi, %edi362; CHECK-NEXT: movswl %di, %eax363; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx364; CHECK-NEXT: sarl %cl, %eax365; CHECK-NEXT: xorl %r8d, %eax366; CHECK-NEXT: # kill: def $ax killed $ax killed $eax367; CHECK-NEXT: retq368 %sh1 = ashr i16 %x0, %y369 %sh2 = ashr i16 %x1, %y370 %logic = xor i16 %sh1, %z371 %r = xor i16 %logic, %sh2372 ret i16 %r373}374 375define i64 @xor_ashr_commute1(i64 %x0, i64 %x1, i64 %y, i64 %z) {376; CHECK-LABEL: xor_ashr_commute1:377; CHECK: # %bb.0:378; CHECK-NEXT: movq %rcx, %rax379; CHECK-NEXT: movq %rdx, %rcx380; CHECK-NEXT: xorq %rsi, %rdi381; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx382; CHECK-NEXT: sarq %cl, %rdi383; CHECK-NEXT: xorq %rdi, %rax384; CHECK-NEXT: retq385 %sh1 = ashr i64 %x0, %y386 %sh2 = ashr i64 %x1, %y387 %logic = xor i64 %z, %sh1388 %r = xor i64 %logic, %sh2389 ret i64 %r390}391 392define <4 x i32> @xor_ashr_commute2(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %y, <4 x i32> %z) {393; CHECK-LABEL: xor_ashr_commute2:394; CHECK: # %bb.0:395; CHECK-NEXT: vpxor %xmm1, %xmm0, %xmm0396; CHECK-NEXT: vpsravd %xmm2, %xmm0, %xmm0397; CHECK-NEXT: vpxor %xmm3, %xmm0, %xmm0398; CHECK-NEXT: retq399 %sh1 = ashr <4 x i32> %x0, %y400 %sh2 = ashr <4 x i32> %x1, %y401 %logic = xor <4 x i32> %sh1, %z402 %r = xor <4 x i32> %sh2, %logic403 ret <4 x i32> %r404}405 406define <16 x i8> @xor_ashr_commute3(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %y, <16 x i8> %z) {407; CHECK-LABEL: xor_ashr_commute3:408; CHECK: # %bb.0:409; CHECK-NEXT: vpsllw $5, %xmm2, %xmm2410; CHECK-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]411; CHECK-NEXT: vpxor %xmm1, %xmm0, %xmm0412; CHECK-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]413; CHECK-NEXT: vpsraw $4, %xmm1, %xmm5414; CHECK-NEXT: vpblendvb %xmm4, %xmm5, %xmm1, %xmm1415; CHECK-NEXT: vpsraw $2, %xmm1, %xmm5416; CHECK-NEXT: vpaddw %xmm4, %xmm4, %xmm6417; CHECK-NEXT: vpblendvb %xmm6, %xmm5, %xmm1, %xmm1418; CHECK-NEXT: vpsraw $1, %xmm1, %xmm5419; CHECK-NEXT: vpsllw $2, %xmm4, %xmm4420; CHECK-NEXT: vpblendvb %xmm4, %xmm5, %xmm1, %xmm1421; CHECK-NEXT: vpsrlw $8, %xmm1, %xmm1422; CHECK-NEXT: vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]423; CHECK-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]424; CHECK-NEXT: vpsraw $4, %xmm0, %xmm4425; CHECK-NEXT: vpblendvb %xmm2, %xmm4, %xmm0, %xmm0426; CHECK-NEXT: vpsraw $2, %xmm0, %xmm4427; CHECK-NEXT: vpaddw %xmm2, %xmm2, %xmm5428; CHECK-NEXT: vpblendvb %xmm5, %xmm4, %xmm0, %xmm0429; CHECK-NEXT: vpsraw $1, %xmm0, %xmm4430; CHECK-NEXT: vpsllw $2, %xmm2, %xmm2431; CHECK-NEXT: vpblendvb %xmm2, %xmm4, %xmm0, %xmm0432; CHECK-NEXT: vpsrlw $8, %xmm0, %xmm0433; CHECK-NEXT: vpackuswb %xmm1, %xmm0, %xmm0434; CHECK-NEXT: vpxor %xmm3, %xmm0, %xmm0435; CHECK-NEXT: retq436 %sh1 = ashr <16 x i8> %x0, %y437 %sh2 = ashr <16 x i8> %x1, %y438 %logic = xor <16 x i8> %z, %sh1439 %r = xor <16 x i8> %sh2, %logic440 ret <16 x i8> %r441}442 443define i32 @xor_shl_commute0(i32 %x0, i32 %x1, i32 %y, i32 %z) {444; CHECK-LABEL: xor_shl_commute0:445; CHECK: # %bb.0:446; CHECK-NEXT: movl %ecx, %eax447; CHECK-NEXT: movl %edx, %ecx448; CHECK-NEXT: xorl %esi, %edi449; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx450; CHECK-NEXT: shll %cl, %edi451; CHECK-NEXT: xorl %edi, %eax452; CHECK-NEXT: retq453 %sh1 = shl i32 %x0, %y454 %sh2 = shl i32 %x1, %y455 %logic = xor i32 %sh1, %z456 %r = xor i32 %logic, %sh2457 ret i32 %r458}459 460define i8 @xor_shl_commute1(i8 %x0, i8 %x1, i8 %y, i8 %z) {461; CHECK-LABEL: xor_shl_commute1:462; CHECK: # %bb.0:463; CHECK-NEXT: movl %ecx, %eax464; CHECK-NEXT: movl %edx, %ecx465; CHECK-NEXT: xorl %esi, %edi466; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx467; CHECK-NEXT: shlb %cl, %dil468; CHECK-NEXT: xorb %dil, %al469; CHECK-NEXT: # kill: def $al killed $al killed $eax470; CHECK-NEXT: retq471 %sh1 = shl i8 %x0, %y472 %sh2 = shl i8 %x1, %y473 %logic = xor i8 %z, %sh1474 %r = xor i8 %logic, %sh2475 ret i8 %r476}477 478define <2 x i64> @xor_shl_commute2(<2 x i64> %x0, <2 x i64> %x1, <2 x i64> %y, <2 x i64> %z) {479; CHECK-LABEL: xor_shl_commute2:480; CHECK: # %bb.0:481; CHECK-NEXT: vpxor %xmm1, %xmm0, %xmm0482; CHECK-NEXT: vpsllvq %xmm2, %xmm0, %xmm0483; CHECK-NEXT: vpxor %xmm3, %xmm0, %xmm0484; CHECK-NEXT: retq485 %sh1 = shl <2 x i64> %x0, %y486 %sh2 = shl <2 x i64> %x1, %y487 %logic = xor <2 x i64> %sh1, %z488 %r = xor <2 x i64> %sh2, %logic489 ret <2 x i64> %r490}491 492define <8 x i16> @xor_shl_commute3(<8 x i16> %x0, <8 x i16> %x1, <8 x i16> %y, <8 x i16> %z) {493; CHECK-LABEL: xor_shl_commute3:494; CHECK: # %bb.0:495; CHECK-NEXT: vpxor %xmm1, %xmm0, %xmm0496; CHECK-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero497; CHECK-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero498; CHECK-NEXT: vpsllvd %ymm1, %ymm0, %ymm0499; CHECK-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]500; CHECK-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]501; CHECK-NEXT: vpxor %xmm3, %xmm0, %xmm0502; CHECK-NEXT: vzeroupper503; CHECK-NEXT: retq504 %sh1 = shl <8 x i16> %x0, %y505 %sh2 = shl <8 x i16> %x1, %y506 %logic = xor <8 x i16> %z, %sh1507 %r = xor <8 x i16> %sh2, %logic508 ret <8 x i16> %r509}510 511; negative test - mismatched shift opcodes512 513define i64 @xor_mix_shr(i64 %x0, i64 %x1, i64 %y, i64 %z) {514; CHECK-LABEL: xor_mix_shr:515; CHECK: # %bb.0:516; CHECK-NEXT: movq %rcx, %rax517; CHECK-NEXT: movq %rdx, %rcx518; CHECK-NEXT: sarq %cl, %rdi519; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx520; CHECK-NEXT: shrq %cl, %rsi521; CHECK-NEXT: xorq %rdi, %rax522; CHECK-NEXT: xorq %rsi, %rax523; CHECK-NEXT: retq524 %sh1 = ashr i64 %x0, %y525 %sh2 = lshr i64 %x1, %y526 %logic = xor i64 %sh1, %z527 %r = xor i64 %logic, %sh2528 ret i64 %r529}530 531; negative test - mismatched shift amounts532 533define i64 @xor_lshr_mix_shift_amount(i64 %x0, i64 %x1, i64 %y, i64 %z, i64 %w) {534; CHECK-LABEL: xor_lshr_mix_shift_amount:535; CHECK: # %bb.0:536; CHECK-NEXT: movq %rcx, %rax537; CHECK-NEXT: movq %rdx, %rcx538; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx539; CHECK-NEXT: shrq %cl, %rdi540; CHECK-NEXT: movl %r8d, %ecx541; CHECK-NEXT: shrq %cl, %rsi542; CHECK-NEXT: xorq %rdi, %rax543; CHECK-NEXT: xorq %rsi, %rax544; CHECK-NEXT: retq545 %sh1 = lshr i64 %x0, %y546 %sh2 = lshr i64 %x1, %w547 %logic = xor i64 %sh1, %z548 %r = xor i64 %logic, %sh2549 ret i64 %r550}551 552; negative test - mismatched logic opcodes553 554define i64 @mix_logic_ashr(i64 %x0, i64 %x1, i64 %y, i64 %z) {555; CHECK-LABEL: mix_logic_ashr:556; CHECK: # %bb.0:557; CHECK-NEXT: movq %rcx, %rax558; CHECK-NEXT: movq %rdx, %rcx559; CHECK-NEXT: sarq %cl, %rdi560; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx561; CHECK-NEXT: sarq %cl, %rsi562; CHECK-NEXT: orq %rdi, %rax563; CHECK-NEXT: xorq %rsi, %rax564; CHECK-NEXT: retq565 %sh1 = ashr i64 %x0, %y566 %sh2 = ashr i64 %x1, %y567 %logic = or i64 %sh1, %z568 %r = xor i64 %logic, %sh2569 ret i64 %r570}571 572define i8 @and_lshr_commute0(i8 %x0, i8 %x1, i8 %y, i8 %z) {573; CHECK-LABEL: and_lshr_commute0:574; CHECK: # %bb.0:575; CHECK-NEXT: movl %ecx, %eax576; CHECK-NEXT: movl %edx, %ecx577; CHECK-NEXT: andl %esi, %edi578; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx579; CHECK-NEXT: shrb %cl, %dil580; CHECK-NEXT: andb %dil, %al581; CHECK-NEXT: # kill: def $al killed $al killed $eax582; CHECK-NEXT: retq583 %sh1 = lshr i8 %x0, %y584 %sh2 = lshr i8 %x1, %y585 %logic = and i8 %sh1, %z586 %r = and i8 %logic, %sh2587 ret i8 %r588}589 590define i32 @and_lshr_commute1(i32 %x0, i32 %x1, i32 %y, i32 %z) {591; CHECK-LABEL: and_lshr_commute1:592; CHECK: # %bb.0:593; CHECK-NEXT: movl %ecx, %eax594; CHECK-NEXT: movl %edx, %ecx595; CHECK-NEXT: andl %esi, %edi596; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx597; CHECK-NEXT: shrl %cl, %edi598; CHECK-NEXT: andl %edi, %eax599; CHECK-NEXT: retq600 %sh1 = lshr i32 %x0, %y601 %sh2 = lshr i32 %x1, %y602 %logic = and i32 %z, %sh1603 %r = and i32 %logic, %sh2604 ret i32 %r605}606 607define <8 x i16> @and_lshr_commute2(<8 x i16> %x0, <8 x i16> %x1, <8 x i16> %y, <8 x i16> %z) {608; CHECK-LABEL: and_lshr_commute2:609; CHECK: # %bb.0:610; CHECK-NEXT: vpand %xmm1, %xmm0, %xmm0611; CHECK-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero612; CHECK-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero613; CHECK-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0614; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm1615; CHECK-NEXT: vpackusdw %xmm1, %xmm0, %xmm0616; CHECK-NEXT: vpand %xmm3, %xmm0, %xmm0617; CHECK-NEXT: vzeroupper618; CHECK-NEXT: retq619 %sh1 = lshr <8 x i16> %x0, %y620 %sh2 = lshr <8 x i16> %x1, %y621 %logic = and <8 x i16> %sh1, %z622 %r = and <8 x i16> %sh2, %logic623 ret <8 x i16> %r624}625 626define <2 x i64> @and_lshr_commute3(<2 x i64> %x0, <2 x i64> %x1, <2 x i64> %y, <2 x i64> %z) {627; CHECK-LABEL: and_lshr_commute3:628; CHECK: # %bb.0:629; CHECK-NEXT: vpand %xmm1, %xmm0, %xmm0630; CHECK-NEXT: vpsrlvq %xmm2, %xmm0, %xmm0631; CHECK-NEXT: vpand %xmm3, %xmm0, %xmm0632; CHECK-NEXT: retq633 %sh1 = lshr <2 x i64> %x0, %y634 %sh2 = lshr <2 x i64> %x1, %y635 %logic = and <2 x i64> %z, %sh1636 %r = and <2 x i64> %sh2, %logic637 ret <2 x i64> %r638}639 640define i16 @and_ashr_commute0(i16 %x0, i16 %x1, i16 %y, i16 %z) {641; CHECK-LABEL: and_ashr_commute0:642; CHECK: # %bb.0:643; CHECK-NEXT: movl %ecx, %r8d644; CHECK-NEXT: movl %edx, %ecx645; CHECK-NEXT: andl %esi, %edi646; CHECK-NEXT: movswl %di, %eax647; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx648; CHECK-NEXT: sarl %cl, %eax649; CHECK-NEXT: andl %r8d, %eax650; CHECK-NEXT: # kill: def $ax killed $ax killed $eax651; CHECK-NEXT: retq652 %sh1 = ashr i16 %x0, %y653 %sh2 = ashr i16 %x1, %y654 %logic = and i16 %sh1, %z655 %r = and i16 %logic, %sh2656 ret i16 %r657}658 659define i64 @and_ashr_commute1(i64 %x0, i64 %x1, i64 %y, i64 %z) {660; CHECK-LABEL: and_ashr_commute1:661; CHECK: # %bb.0:662; CHECK-NEXT: movq %rcx, %rax663; CHECK-NEXT: movq %rdx, %rcx664; CHECK-NEXT: andq %rsi, %rdi665; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx666; CHECK-NEXT: sarq %cl, %rdi667; CHECK-NEXT: andq %rdi, %rax668; CHECK-NEXT: retq669 %sh1 = ashr i64 %x0, %y670 %sh2 = ashr i64 %x1, %y671 %logic = and i64 %z, %sh1672 %r = and i64 %logic, %sh2673 ret i64 %r674}675 676define <4 x i32> @and_ashr_commute2(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %y, <4 x i32> %z) {677; CHECK-LABEL: and_ashr_commute2:678; CHECK: # %bb.0:679; CHECK-NEXT: vpand %xmm1, %xmm0, %xmm0680; CHECK-NEXT: vpsravd %xmm2, %xmm0, %xmm0681; CHECK-NEXT: vpand %xmm3, %xmm0, %xmm0682; CHECK-NEXT: retq683 %sh1 = ashr <4 x i32> %x0, %y684 %sh2 = ashr <4 x i32> %x1, %y685 %logic = and <4 x i32> %sh1, %z686 %r = and <4 x i32> %sh2, %logic687 ret <4 x i32> %r688}689 690define <16 x i8> @and_ashr_commute3(<16 x i8> %x0, <16 x i8> %x1, <16 x i8> %y, <16 x i8> %z) {691; CHECK-LABEL: and_ashr_commute3:692; CHECK: # %bb.0:693; CHECK-NEXT: vpsllw $5, %xmm2, %xmm2694; CHECK-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]695; CHECK-NEXT: vpand %xmm1, %xmm0, %xmm0696; CHECK-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]697; CHECK-NEXT: vpsraw $4, %xmm1, %xmm5698; CHECK-NEXT: vpblendvb %xmm4, %xmm5, %xmm1, %xmm1699; CHECK-NEXT: vpsraw $2, %xmm1, %xmm5700; CHECK-NEXT: vpaddw %xmm4, %xmm4, %xmm6701; CHECK-NEXT: vpblendvb %xmm6, %xmm5, %xmm1, %xmm1702; CHECK-NEXT: vpsraw $1, %xmm1, %xmm5703; CHECK-NEXT: vpsllw $2, %xmm4, %xmm4704; CHECK-NEXT: vpblendvb %xmm4, %xmm5, %xmm1, %xmm1705; CHECK-NEXT: vpsrlw $8, %xmm1, %xmm1706; CHECK-NEXT: vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]707; CHECK-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]708; CHECK-NEXT: vpsraw $4, %xmm0, %xmm4709; CHECK-NEXT: vpblendvb %xmm2, %xmm4, %xmm0, %xmm0710; CHECK-NEXT: vpsraw $2, %xmm0, %xmm4711; CHECK-NEXT: vpaddw %xmm2, %xmm2, %xmm5712; CHECK-NEXT: vpblendvb %xmm5, %xmm4, %xmm0, %xmm0713; CHECK-NEXT: vpsraw $1, %xmm0, %xmm4714; CHECK-NEXT: vpsllw $2, %xmm2, %xmm2715; CHECK-NEXT: vpblendvb %xmm2, %xmm4, %xmm0, %xmm0716; CHECK-NEXT: vpsrlw $8, %xmm0, %xmm0717; CHECK-NEXT: vpackuswb %xmm1, %xmm0, %xmm0718; CHECK-NEXT: vpand %xmm3, %xmm0, %xmm0719; CHECK-NEXT: retq720 %sh1 = ashr <16 x i8> %x0, %y721 %sh2 = ashr <16 x i8> %x1, %y722 %logic = and <16 x i8> %z, %sh1723 %r = and <16 x i8> %sh2, %logic724 ret <16 x i8> %r725}726 727define i32 @and_shl_commute0(i32 %x0, i32 %x1, i32 %y, i32 %z) {728; CHECK-LABEL: and_shl_commute0:729; CHECK: # %bb.0:730; CHECK-NEXT: movl %ecx, %eax731; CHECK-NEXT: movl %edx, %ecx732; CHECK-NEXT: andl %esi, %edi733; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx734; CHECK-NEXT: shll %cl, %edi735; CHECK-NEXT: andl %edi, %eax736; CHECK-NEXT: retq737 %sh1 = shl i32 %x0, %y738 %sh2 = shl i32 %x1, %y739 %logic = and i32 %sh1, %z740 %r = and i32 %logic, %sh2741 ret i32 %r742}743 744define i8 @and_shl_commute1(i8 %x0, i8 %x1, i8 %y, i8 %z) {745; CHECK-LABEL: and_shl_commute1:746; CHECK: # %bb.0:747; CHECK-NEXT: movl %ecx, %eax748; CHECK-NEXT: movl %edx, %ecx749; CHECK-NEXT: andl %esi, %edi750; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx751; CHECK-NEXT: shlb %cl, %dil752; CHECK-NEXT: andb %dil, %al753; CHECK-NEXT: # kill: def $al killed $al killed $eax754; CHECK-NEXT: retq755 %sh1 = shl i8 %x0, %y756 %sh2 = shl i8 %x1, %y757 %logic = and i8 %z, %sh1758 %r = and i8 %logic, %sh2759 ret i8 %r760}761 762define <2 x i64> @and_shl_commute2(<2 x i64> %x0, <2 x i64> %x1, <2 x i64> %y, <2 x i64> %z) {763; CHECK-LABEL: and_shl_commute2:764; CHECK: # %bb.0:765; CHECK-NEXT: vpand %xmm1, %xmm0, %xmm0766; CHECK-NEXT: vpsllvq %xmm2, %xmm0, %xmm0767; CHECK-NEXT: vpand %xmm3, %xmm0, %xmm0768; CHECK-NEXT: retq769 %sh1 = shl <2 x i64> %x0, %y770 %sh2 = shl <2 x i64> %x1, %y771 %logic = and <2 x i64> %sh1, %z772 %r = and <2 x i64> %sh2, %logic773 ret <2 x i64> %r774}775 776define <8 x i16> @and_shl_commute3(<8 x i16> %x0, <8 x i16> %x1, <8 x i16> %y, <8 x i16> %z) {777; CHECK-LABEL: and_shl_commute3:778; CHECK: # %bb.0:779; CHECK-NEXT: vpand %xmm1, %xmm0, %xmm0780; CHECK-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero781; CHECK-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero782; CHECK-NEXT: vpsllvd %ymm1, %ymm0, %ymm0783; CHECK-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]784; CHECK-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]785; CHECK-NEXT: vpand %xmm3, %xmm0, %xmm0786; CHECK-NEXT: vzeroupper787; CHECK-NEXT: retq788 %sh1 = shl <8 x i16> %x0, %y789 %sh2 = shl <8 x i16> %x1, %y790 %logic = and <8 x i16> %z, %sh1791 %r = and <8 x i16> %sh2, %logic792 ret <8 x i16> %r793}794 795; negative test - mismatched shift opcodes796 797define i64 @and_mix_shr(i64 %x0, i64 %x1, i64 %y, i64 %z) {798; CHECK-LABEL: and_mix_shr:799; CHECK: # %bb.0:800; CHECK-NEXT: movq %rcx, %rax801; CHECK-NEXT: movq %rdx, %rcx802; CHECK-NEXT: shrq %cl, %rdi803; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx804; CHECK-NEXT: sarq %cl, %rsi805; CHECK-NEXT: andq %rdi, %rax806; CHECK-NEXT: andq %rsi, %rax807; CHECK-NEXT: retq808 %sh1 = lshr i64 %x0, %y809 %sh2 = ashr i64 %x1, %y810 %logic = and i64 %sh1, %z811 %r = and i64 %logic, %sh2812 ret i64 %r813}814 815; negative test - mismatched shift amounts816 817define i64 @and_lshr_mix_shift_amount(i64 %x0, i64 %x1, i64 %y, i64 %z, i64 %w) {818; CHECK-LABEL: and_lshr_mix_shift_amount:819; CHECK: # %bb.0:820; CHECK-NEXT: movq %rcx, %rax821; CHECK-NEXT: movq %rdx, %rcx822; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx823; CHECK-NEXT: shrq %cl, %rdi824; CHECK-NEXT: movl %r8d, %ecx825; CHECK-NEXT: shrq %cl, %rsi826; CHECK-NEXT: andq %rdi, %rax827; CHECK-NEXT: andq %rsi, %rax828; CHECK-NEXT: retq829 %sh1 = lshr i64 %x0, %y830 %sh2 = lshr i64 %x1, %w831 %logic = and i64 %sh1, %z832 %r = and i64 %logic, %sh2833 ret i64 %r834}835 836; negative test - mismatched logic opcodes837 838define i64 @mix_logic_shl(i64 %x0, i64 %x1, i64 %y, i64 %z) {839; CHECK-LABEL: mix_logic_shl:840; CHECK: # %bb.0:841; CHECK-NEXT: movq %rcx, %rax842; CHECK-NEXT: movq %rdx, %rcx843; CHECK-NEXT: shlq %cl, %rdi844; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx845; CHECK-NEXT: shlq %cl, %rsi846; CHECK-NEXT: xorq %rdi, %rax847; CHECK-NEXT: andq %rsi, %rax848; CHECK-NEXT: retq849 %sh1 = shl i64 %x0, %y850 %sh2 = shl i64 %x1, %y851 %logic = xor i64 %sh1, %z852 %r = and i64 %logic, %sh2853 ret i64 %r854}855 856; (shl (X | Y), C1) | (srl X, C2) --> (rotl X, C1) | (shl Y, C1)857 858define i32 @or_fshl_commute0(i32 %x, i32 %y) {859; CHECK-LABEL: or_fshl_commute0:860; CHECK: # %bb.0:861; CHECK-NEXT: movl %esi, %eax862; CHECK-NEXT: orl %edi, %eax863; CHECK-NEXT: shldl $5, %edi, %eax864; CHECK-NEXT: retq865 %or1 = or i32 %x, %y866 %sh1 = shl i32 %or1, 5867 %sh2 = lshr i32 %x, 27868 %r = or i32 %sh1, %sh2869 ret i32 %r870}871 872define i64 @or_fshl_commute1(i64 %x, i64 %y) {873; CHECK-LABEL: or_fshl_commute1:874; CHECK: # %bb.0:875; CHECK-NEXT: movl %edi, %eax876; CHECK-NEXT: orl %esi, %eax877; CHECK-NEXT: shldq $35, %rdi, %rax878; CHECK-NEXT: retq879 %or1 = or i64 %y, %x880 %sh1 = shl i64 %or1, 35881 %sh2 = lshr i64 %x, 29882 %r = or i64 %sh1, %sh2883 ret i64 %r884}885 886define i16 @or_fshl_commute2(i16 %x, i16 %y) {887; CHECK-LABEL: or_fshl_commute2:888; CHECK: # %bb.0:889; CHECK-NEXT: movl %edi, %eax890; CHECK-NEXT: orl %edi, %esi891; CHECK-NEXT: shrdw $14, %si, %ax892; CHECK-NEXT: # kill: def $ax killed $ax killed $eax893; CHECK-NEXT: retq894 %or1 = or i16 %x, %y895 %sh1 = shl i16 %or1, 2896 %sh2 = lshr i16 %x, 14897 %r = or i16 %sh2, %sh1898 ret i16 %r899}900 901define i8 @or_fshl_commute3(i8 %x, i8 %y) {902; CHECK-LABEL: or_fshl_commute3:903; CHECK: # %bb.0:904; CHECK-NEXT: movl %edi, %eax905; CHECK-NEXT: orl %edi, %esi906; CHECK-NEXT: shlb $5, %sil907; CHECK-NEXT: shrb $3, %al908; CHECK-NEXT: orb %sil, %al909; CHECK-NEXT: # kill: def $al killed $al killed $eax910; CHECK-NEXT: retq911 %or1 = or i8 %y, %x912 %sh1 = shl i8 %or1, 5913 %sh2 = lshr i8 %x, 3914 %r = or i8 %sh2, %sh1915 ret i8 %r916}917 918define i32 @or_fshl_wrong_shift(i32 %x, i32 %y) {919; CHECK-LABEL: or_fshl_wrong_shift:920; CHECK: # %bb.0:921; CHECK-NEXT: movl %edi, %eax922; CHECK-NEXT: orl %edi, %esi923; CHECK-NEXT: shll $20, %esi924; CHECK-NEXT: shrl $11, %eax925; CHECK-NEXT: orl %esi, %eax926; CHECK-NEXT: retq927 %or1 = or i32 %x, %y928 %sh1 = shl i32 %or1, 20929 %sh2 = lshr i32 %x, 11930 %r = or i32 %sh1, %sh2931 ret i32 %r932}933 934; (shl X, C1) | (srl (X | Y), C2) --> (rotl X, C1) | (srl Y, C2)935 936define i64 @or_fshr_commute0(i64 %x, i64 %y) {937; CHECK-LABEL: or_fshr_commute0:938; CHECK: # %bb.0:939; CHECK-NEXT: movq %rsi, %rax940; CHECK-NEXT: orq %rdi, %rax941; CHECK-NEXT: shrdq $24, %rdi, %rax942; CHECK-NEXT: retq943 %or1 = or i64 %x, %y944 %sh1 = shl i64 %x, 40945 %sh2 = lshr i64 %or1, 24946 %r = or i64 %sh1, %sh2947 ret i64 %r948}949 950define i32 @or_fshr_commute1(i32 %x, i32 %y) {951; CHECK-LABEL: or_fshr_commute1:952; CHECK: # %bb.0:953; CHECK-NEXT: movl %esi, %eax954; CHECK-NEXT: orl %edi, %eax955; CHECK-NEXT: shrdl $29, %edi, %eax956; CHECK-NEXT: retq957 %or1 = or i32 %y, %x958 %sh1 = shl i32 %x, 3959 %sh2 = lshr i32 %or1, 29960 %r = or i32 %sh1, %sh2961 ret i32 %r962}963 964define i16 @or_fshr_commute2(i16 %x, i16 %y) {965; CHECK-LABEL: or_fshr_commute2:966; CHECK: # %bb.0:967; CHECK-NEXT: movl %esi, %eax968; CHECK-NEXT: orl %edi, %eax969; CHECK-NEXT: shrdw $7, %di, %ax970; CHECK-NEXT: # kill: def $ax killed $ax killed $eax971; CHECK-NEXT: retq972 %or1 = or i16 %x, %y973 %sh1 = shl i16 %x, 9974 %sh2 = lshr i16 %or1, 7975 %r = or i16 %sh2, %sh1976 ret i16 %r977}978 979define i8 @or_fshr_commute3(i8 %x, i8 %y) {980; CHECK-LABEL: or_fshr_commute3:981; CHECK: # %bb.0:982; CHECK-NEXT: # kill: def $edi killed $edi def $rdi983; CHECK-NEXT: orl %edi, %esi984; CHECK-NEXT: shrb $6, %sil985; CHECK-NEXT: leal (,%rdi,4), %eax986; CHECK-NEXT: orb %sil, %al987; CHECK-NEXT: # kill: def $al killed $al killed $eax988; CHECK-NEXT: retq989 %or1 = or i8 %y, %x990 %sh1 = shl i8 %x, 2991 %sh2 = lshr i8 %or1, 6992 %r = or i8 %sh2, %sh1993 ret i8 %r994}995 996define i32 @or_fshr_wrong_shift(i32 %x, i32 %y) {997; CHECK-LABEL: or_fshr_wrong_shift:998; CHECK: # %bb.0:999; CHECK-NEXT: # kill: def $esi killed $esi def $rsi1000; CHECK-NEXT: # kill: def $edi killed $edi def $rdi1001; CHECK-NEXT: orl %edi, %esi1002; CHECK-NEXT: shll $7, %edi1003; CHECK-NEXT: shrl $26, %esi1004; CHECK-NEXT: leal (%rsi,%rdi), %eax1005; CHECK-NEXT: retq1006 %or1 = or i32 %x, %y1007 %sh1 = shl i32 %x, 71008 %sh2 = lshr i32 %or1, 261009 %r = or i32 %sh1, %sh21010 ret i32 %r1011}1012