678 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK,X863; RUN: llc < %s -mtriple=x86_64-linux -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK,X64-LIN4; RUN: llc < %s -mtriple=x86_64-win32 -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK,X64-WIN5 6; Though it is undefined, we want xor undef,undef to produce zero.7define <4 x i32> @test1() nounwind {8; CHECK-LABEL: test1:9; CHECK: # %bb.0:10; CHECK-NEXT: xorps %xmm0, %xmm011; CHECK-NEXT: ret{{[l|q]}}12 %tmp = xor <4 x i32> undef, undef13 ret <4 x i32> %tmp14}15 16; Though it is undefined, we want xor undef,undef to produce zero.17define i32 @test2() nounwind{18; CHECK-LABEL: test2:19; CHECK: # %bb.0:20; CHECK-NEXT: xorl %eax, %eax21; CHECK-NEXT: ret{{[l|q]}}22 %tmp = xor i32 undef, undef23 ret i32 %tmp24}25 26define i32 @test3(i32 %a, i32 %b) nounwind {27; X86-LABEL: test3:28; X86: # %bb.0: # %entry29; X86-NEXT: movl {{[0-9]+}}(%esp), %eax30; X86-NEXT: notl %eax31; X86-NEXT: andl {{[0-9]+}}(%esp), %eax32; X86-NEXT: shrl %eax33; X86-NEXT: retl34;35; X64-LIN-LABEL: test3:36; X64-LIN: # %bb.0: # %entry37; X64-LIN-NEXT: movl %esi, %eax38; X64-LIN-NEXT: notl %eax39; X64-LIN-NEXT: andl %edi, %eax40; X64-LIN-NEXT: shrl %eax41; X64-LIN-NEXT: retq42;43; X64-WIN-LABEL: test3:44; X64-WIN: # %bb.0: # %entry45; X64-WIN-NEXT: movl %edx, %eax46; X64-WIN-NEXT: notl %eax47; X64-WIN-NEXT: andl %ecx, %eax48; X64-WIN-NEXT: shrl %eax49; X64-WIN-NEXT: retq50entry:51 %tmp1not = xor i32 %b, -252 %tmp3 = and i32 %tmp1not, %a53 %tmp4 = lshr i32 %tmp3, 154 ret i32 %tmp455}56 57define i32 @test4(i32 %a, i32 %b) nounwind {58; X86-LABEL: test4:59; X86: # %bb.0: # %entry60; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx61; X86-NEXT: movl {{[0-9]+}}(%esp), %eax62; X86-NEXT: .p2align 463; X86-NEXT: .LBB3_1: # %bb64; X86-NEXT: # =>This Inner Loop Header: Depth=165; X86-NEXT: xorl %ecx, %eax66; X86-NEXT: movl %eax, %edx67; X86-NEXT: notl %edx68; X86-NEXT: andl %ecx, %edx69; X86-NEXT: addl %edx, %edx70; X86-NEXT: movl %edx, %ecx71; X86-NEXT: jne .LBB3_172; X86-NEXT: # %bb.2: # %bb1273; X86-NEXT: retl74;75; X64-LIN-LABEL: test4:76; X64-LIN: # %bb.0: # %entry77; X64-LIN-NEXT: movl %edi, %eax78; X64-LIN-NEXT: .p2align 479; X64-LIN-NEXT: .LBB3_1: # %bb80; X64-LIN-NEXT: # =>This Inner Loop Header: Depth=181; X64-LIN-NEXT: xorl %esi, %eax82; X64-LIN-NEXT: movl %eax, %ecx83; X64-LIN-NEXT: notl %ecx84; X64-LIN-NEXT: andl %esi, %ecx85; X64-LIN-NEXT: addl %ecx, %ecx86; X64-LIN-NEXT: movl %ecx, %esi87; X64-LIN-NEXT: jne .LBB3_188; X64-LIN-NEXT: # %bb.2: # %bb1289; X64-LIN-NEXT: retq90;91; X64-WIN-LABEL: test4:92; X64-WIN: # %bb.0: # %entry93; X64-WIN-NEXT: movl %ecx, %eax94; X64-WIN-NEXT: .p2align 495; X64-WIN-NEXT: .LBB3_1: # %bb96; X64-WIN-NEXT: # =>This Inner Loop Header: Depth=197; X64-WIN-NEXT: xorl %edx, %eax98; X64-WIN-NEXT: movl %eax, %ecx99; X64-WIN-NEXT: notl %ecx100; X64-WIN-NEXT: andl %edx, %ecx101; X64-WIN-NEXT: addl %ecx, %ecx102; X64-WIN-NEXT: movl %ecx, %edx103; X64-WIN-NEXT: jne .LBB3_1104; X64-WIN-NEXT: # %bb.2: # %bb12105; X64-WIN-NEXT: retq106entry:107 br label %bb108bb:109 %b_addr.0 = phi i32 [ %b, %entry ], [ %tmp8, %bb ]110 %a_addr.0 = phi i32 [ %a, %entry ], [ %tmp3, %bb ]111 %tmp3 = xor i32 %a_addr.0, %b_addr.0112 %tmp4not = xor i32 %tmp3, 2147483647113 %tmp6 = and i32 %tmp4not, %b_addr.0114 %tmp8 = shl i32 %tmp6, 1115 %tmp10 = icmp eq i32 %tmp8, 0116 br i1 %tmp10, label %bb12, label %bb117bb12:118 ret i32 %tmp3119}120 121define i16 @test5(i16 %a, i16 %b) nounwind {122; X86-LABEL: test5:123; X86: # %bb.0: # %entry124; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx125; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax126; X86-NEXT: .p2align 4127; X86-NEXT: .LBB4_1: # %bb128; X86-NEXT: # =>This Inner Loop Header: Depth=1129; X86-NEXT: xorl %ecx, %eax130; X86-NEXT: movl %eax, %edx131; X86-NEXT: notl %edx132; X86-NEXT: andl %ecx, %edx133; X86-NEXT: addl %edx, %edx134; X86-NEXT: testw %dx, %dx135; X86-NEXT: movl %edx, %ecx136; X86-NEXT: jne .LBB4_1137; X86-NEXT: # %bb.2: # %bb12138; X86-NEXT: # kill: def $ax killed $ax killed $eax139; X86-NEXT: retl140;141; X64-LIN-LABEL: test5:142; X64-LIN: # %bb.0: # %entry143; X64-LIN-NEXT: movl %edi, %eax144; X64-LIN-NEXT: .p2align 4145; X64-LIN-NEXT: .LBB4_1: # %bb146; X64-LIN-NEXT: # =>This Inner Loop Header: Depth=1147; X64-LIN-NEXT: xorl %esi, %eax148; X64-LIN-NEXT: movl %eax, %ecx149; X64-LIN-NEXT: notl %ecx150; X64-LIN-NEXT: andl %esi, %ecx151; X64-LIN-NEXT: addl %ecx, %ecx152; X64-LIN-NEXT: testw %cx, %cx153; X64-LIN-NEXT: movl %ecx, %esi154; X64-LIN-NEXT: jne .LBB4_1155; X64-LIN-NEXT: # %bb.2: # %bb12156; X64-LIN-NEXT: # kill: def $ax killed $ax killed $eax157; X64-LIN-NEXT: retq158;159; X64-WIN-LABEL: test5:160; X64-WIN: # %bb.0: # %entry161; X64-WIN-NEXT: # kill: def $dx killed $dx def $edx162; X64-WIN-NEXT: movl %ecx, %eax163; X64-WIN-NEXT: .p2align 4164; X64-WIN-NEXT: .LBB4_1: # %bb165; X64-WIN-NEXT: # =>This Inner Loop Header: Depth=1166; X64-WIN-NEXT: xorl %edx, %eax167; X64-WIN-NEXT: movl %eax, %ecx168; X64-WIN-NEXT: notl %ecx169; X64-WIN-NEXT: andl %edx, %ecx170; X64-WIN-NEXT: addl %ecx, %ecx171; X64-WIN-NEXT: testw %cx, %cx172; X64-WIN-NEXT: movl %ecx, %edx173; X64-WIN-NEXT: jne .LBB4_1174; X64-WIN-NEXT: # %bb.2: # %bb12175; X64-WIN-NEXT: # kill: def $ax killed $ax killed $eax176; X64-WIN-NEXT: retq177entry:178 br label %bb179bb:180 %b_addr.0 = phi i16 [ %b, %entry ], [ %tmp8, %bb ]181 %a_addr.0 = phi i16 [ %a, %entry ], [ %tmp3, %bb ]182 %tmp3 = xor i16 %a_addr.0, %b_addr.0183 %tmp4not = xor i16 %tmp3, 32767184 %tmp6 = and i16 %tmp4not, %b_addr.0185 %tmp8 = shl i16 %tmp6, 1186 %tmp10 = icmp eq i16 %tmp8, 0187 br i1 %tmp10, label %bb12, label %bb188bb12:189 ret i16 %tmp3190}191 192define i8 @test6(i8 %a, i8 %b) nounwind {193; X86-LABEL: test6:194; X86: # %bb.0: # %entry195; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx196; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax197; X86-NEXT: .p2align 4198; X86-NEXT: .LBB5_1: # %bb199; X86-NEXT: # =>This Inner Loop Header: Depth=1200; X86-NEXT: xorb %cl, %al201; X86-NEXT: movl %eax, %edx202; X86-NEXT: notb %dl203; X86-NEXT: andb %cl, %dl204; X86-NEXT: addb %dl, %dl205; X86-NEXT: movl %edx, %ecx206; X86-NEXT: jne .LBB5_1207; X86-NEXT: # %bb.2: # %bb12208; X86-NEXT: retl209;210; X64-LIN-LABEL: test6:211; X64-LIN: # %bb.0: # %entry212; X64-LIN-NEXT: movl %edi, %eax213; X64-LIN-NEXT: .p2align 4214; X64-LIN-NEXT: .LBB5_1: # %bb215; X64-LIN-NEXT: # =>This Inner Loop Header: Depth=1216; X64-LIN-NEXT: xorb %sil, %al217; X64-LIN-NEXT: movl %eax, %ecx218; X64-LIN-NEXT: notb %cl219; X64-LIN-NEXT: andb %sil, %cl220; X64-LIN-NEXT: addb %cl, %cl221; X64-LIN-NEXT: movl %ecx, %esi222; X64-LIN-NEXT: jne .LBB5_1223; X64-LIN-NEXT: # %bb.2: # %bb12224; X64-LIN-NEXT: # kill: def $al killed $al killed $eax225; X64-LIN-NEXT: retq226;227; X64-WIN-LABEL: test6:228; X64-WIN: # %bb.0: # %entry229; X64-WIN-NEXT: movl %ecx, %eax230; X64-WIN-NEXT: .p2align 4231; X64-WIN-NEXT: .LBB5_1: # %bb232; X64-WIN-NEXT: # =>This Inner Loop Header: Depth=1233; X64-WIN-NEXT: xorb %dl, %al234; X64-WIN-NEXT: movl %eax, %ecx235; X64-WIN-NEXT: notb %cl236; X64-WIN-NEXT: andb %dl, %cl237; X64-WIN-NEXT: addb %cl, %cl238; X64-WIN-NEXT: movl %ecx, %edx239; X64-WIN-NEXT: jne .LBB5_1240; X64-WIN-NEXT: # %bb.2: # %bb12241; X64-WIN-NEXT: retq242entry:243 br label %bb244bb:245 %b_addr.0 = phi i8 [ %b, %entry ], [ %tmp8, %bb ]246 %a_addr.0 = phi i8 [ %a, %entry ], [ %tmp3, %bb ]247 %tmp3 = xor i8 %a_addr.0, %b_addr.0248 %tmp4not = xor i8 %tmp3, 127249 %tmp6 = and i8 %tmp4not, %b_addr.0250 %tmp8 = shl i8 %tmp6, 1251 %tmp10 = icmp eq i8 %tmp8, 0252 br i1 %tmp10, label %bb12, label %bb253bb12:254 ret i8 %tmp3255}256 257define i32 @test7(i32 %a, i32 %b) nounwind {258; X86-LABEL: test7:259; X86: # %bb.0: # %entry260; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx261; X86-NEXT: movl {{[0-9]+}}(%esp), %eax262; X86-NEXT: .p2align 4263; X86-NEXT: .LBB6_1: # %bb264; X86-NEXT: # =>This Inner Loop Header: Depth=1265; X86-NEXT: xorl %ecx, %eax266; X86-NEXT: movl %eax, %edx267; X86-NEXT: xorl $2147483646, %edx # imm = 0x7FFFFFFE268; X86-NEXT: andl %ecx, %edx269; X86-NEXT: addl %edx, %edx270; X86-NEXT: movl %edx, %ecx271; X86-NEXT: jne .LBB6_1272; X86-NEXT: # %bb.2: # %bb12273; X86-NEXT: retl274;275; X64-LIN-LABEL: test7:276; X64-LIN: # %bb.0: # %entry277; X64-LIN-NEXT: movl %edi, %eax278; X64-LIN-NEXT: .p2align 4279; X64-LIN-NEXT: .LBB6_1: # %bb280; X64-LIN-NEXT: # =>This Inner Loop Header: Depth=1281; X64-LIN-NEXT: xorl %esi, %eax282; X64-LIN-NEXT: movl %eax, %ecx283; X64-LIN-NEXT: xorl $2147483646, %ecx # imm = 0x7FFFFFFE284; X64-LIN-NEXT: andl %esi, %ecx285; X64-LIN-NEXT: addl %ecx, %ecx286; X64-LIN-NEXT: movl %ecx, %esi287; X64-LIN-NEXT: jne .LBB6_1288; X64-LIN-NEXT: # %bb.2: # %bb12289; X64-LIN-NEXT: retq290;291; X64-WIN-LABEL: test7:292; X64-WIN: # %bb.0: # %entry293; X64-WIN-NEXT: movl %ecx, %eax294; X64-WIN-NEXT: .p2align 4295; X64-WIN-NEXT: .LBB6_1: # %bb296; X64-WIN-NEXT: # =>This Inner Loop Header: Depth=1297; X64-WIN-NEXT: xorl %edx, %eax298; X64-WIN-NEXT: movl %eax, %ecx299; X64-WIN-NEXT: xorl $2147483646, %ecx # imm = 0x7FFFFFFE300; X64-WIN-NEXT: andl %edx, %ecx301; X64-WIN-NEXT: addl %ecx, %ecx302; X64-WIN-NEXT: movl %ecx, %edx303; X64-WIN-NEXT: jne .LBB6_1304; X64-WIN-NEXT: # %bb.2: # %bb12305; X64-WIN-NEXT: retq306entry:307 br label %bb308bb:309 %b_addr.0 = phi i32 [ %b, %entry ], [ %tmp8, %bb ]310 %a_addr.0 = phi i32 [ %a, %entry ], [ %tmp3, %bb ]311 %tmp3 = xor i32 %a_addr.0, %b_addr.0312 %tmp4not = xor i32 %tmp3, 2147483646313 %tmp6 = and i32 %tmp4not, %b_addr.0314 %tmp8 = shl i32 %tmp6, 1315 %tmp10 = icmp eq i32 %tmp8, 0316 br i1 %tmp10, label %bb12, label %bb317bb12:318 ret i32 %tmp3319}320 321; rdar://7553032322define i32 @test8(i32 %a) nounwind {323; X86-LABEL: test8:324; X86: # %bb.0: # %entry325; X86-NEXT: movl {{[0-9]+}}(%esp), %eax326; X86-NEXT: notl %eax327; X86-NEXT: retl328;329; X64-LIN-LABEL: test8:330; X64-LIN: # %bb.0: # %entry331; X64-LIN-NEXT: movl %edi, %eax332; X64-LIN-NEXT: notl %eax333; X64-LIN-NEXT: retq334;335; X64-WIN-LABEL: test8:336; X64-WIN: # %bb.0: # %entry337; X64-WIN-NEXT: movl %ecx, %eax338; X64-WIN-NEXT: notl %eax339; X64-WIN-NEXT: retq340entry:341 %t1 = sub i32 0, %a342 %t2 = add i32 %t1, -1343 ret i32 %t2344}345 346define i32 @test9(i32 %a) nounwind {347; X86-LABEL: test9:348; X86: # %bb.0:349; X86-NEXT: movl {{[0-9]+}}(%esp), %eax350; X86-NEXT: notl %eax351; X86-NEXT: andl $4096, %eax # imm = 0x1000352; X86-NEXT: retl353;354; X64-LIN-LABEL: test9:355; X64-LIN: # %bb.0:356; X64-LIN-NEXT: movl %edi, %eax357; X64-LIN-NEXT: notl %eax358; X64-LIN-NEXT: andl $4096, %eax # imm = 0x1000359; X64-LIN-NEXT: retq360;361; X64-WIN-LABEL: test9:362; X64-WIN: # %bb.0:363; X64-WIN-NEXT: movl %ecx, %eax364; X64-WIN-NEXT: notl %eax365; X64-WIN-NEXT: andl $4096, %eax # imm = 0x1000366; X64-WIN-NEXT: retq367 %1 = and i32 %a, 4096368 %2 = xor i32 %1, 4096369 ret i32 %2370}371 372; PR15948373define <4 x i32> @test10(<4 x i32> %a) nounwind {374; X86-LABEL: test10:375; X86: # %bb.0:376; X86-NEXT: andnps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0377; X86-NEXT: retl378;379; X64-LIN-LABEL: test10:380; X64-LIN: # %bb.0:381; X64-LIN-NEXT: andnps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0382; X64-LIN-NEXT: retq383;384; X64-WIN-LABEL: test10:385; X64-WIN: # %bb.0:386; X64-WIN-NEXT: movaps (%rcx), %xmm0387; X64-WIN-NEXT: andnps __xmm@00001000000010000000100000001000(%rip), %xmm0388; X64-WIN-NEXT: retq389 %1 = and <4 x i32> %a, <i32 4096, i32 4096, i32 4096, i32 4096>390 %2 = xor <4 x i32> %1, <i32 4096, i32 4096, i32 4096, i32 4096>391 ret <4 x i32> %2392}393 394define i32 @PR17487(i1 %tobool) {395; X86-LABEL: PR17487:396; X86: # %bb.0:397; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx398; X86-NEXT: notb %cl399; X86-NEXT: xorl %eax, %eax400; X86-NEXT: testb $1, %cl401; X86-NEXT: sete %al402; X86-NEXT: retl403;404; X64-LIN-LABEL: PR17487:405; X64-LIN: # %bb.0:406; X64-LIN-NEXT: movd %edi, %xmm0407; X64-LIN-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]408; X64-LIN-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0409; X64-LIN-NEXT: pextrw $4, %xmm0, %eax410; X64-LIN-NEXT: retq411;412; X64-WIN-LABEL: PR17487:413; X64-WIN: # %bb.0:414; X64-WIN-NEXT: movzbl %cl, %eax415; X64-WIN-NEXT: movd %eax, %xmm0416; X64-WIN-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]417; X64-WIN-NEXT: pand __xmm@00000000000000010000000000000001(%rip), %xmm0418; X64-WIN-NEXT: pextrw $4, %xmm0, %eax419; X64-WIN-NEXT: retq420 %tmp = insertelement <2 x i1> undef, i1 %tobool, i32 1421 %tmp1 = zext <2 x i1> %tmp to <2 x i64>422 %tmp2 = xor <2 x i64> %tmp1, <i64 1, i64 1>423 %tmp3 = extractelement <2 x i64> %tmp2, i32 1424 %add = add nsw i64 0, %tmp3425 %cmp6 = icmp ne i64 %add, 1426 %conv7 = zext i1 %cmp6 to i32427 ret i32 %conv7428}429 430define i32 @test11(i32 %b) {431; X86-LABEL: test11:432; X86: # %bb.0:433; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx434; X86-NEXT: movl $-2, %eax435; X86-NEXT: roll %cl, %eax436; X86-NEXT: retl437;438; X64-LIN-LABEL: test11:439; X64-LIN: # %bb.0:440; X64-LIN-NEXT: movl %edi, %ecx441; X64-LIN-NEXT: movl $-2, %eax442; X64-LIN-NEXT: # kill: def $cl killed $cl killed $ecx443; X64-LIN-NEXT: roll %cl, %eax444; X64-LIN-NEXT: retq445;446; X64-WIN-LABEL: test11:447; X64-WIN: # %bb.0:448; X64-WIN-NEXT: movl $-2, %eax449; X64-WIN-NEXT: # kill: def $cl killed $cl killed $ecx450; X64-WIN-NEXT: roll %cl, %eax451; X64-WIN-NEXT: retq452 %shl = shl i32 1, %b453 %neg = xor i32 %shl, -1454 ret i32 %neg455}456 457%struct.ref_s = type { %union.v, i16, i16 }458%union.v = type { i64 }459 460define ptr @test12(ptr %op, i64 %osbot, i64 %intval) {461; X86-LABEL: test12:462; X86: # %bb.0:463; X86-NEXT: movl {{[0-9]+}}(%esp), %eax464; X86-NEXT: notl %eax465; X86-NEXT: leal (%eax,%eax,2), %eax466; X86-NEXT: shll $2, %eax467; X86-NEXT: addl {{[0-9]+}}(%esp), %eax468; X86-NEXT: retl469;470; X64-LIN-LABEL: test12:471; X64-LIN: # %bb.0:472; X64-LIN-NEXT: notl %edx473; X64-LIN-NEXT: movslq %edx, %rax474; X64-LIN-NEXT: shlq $4, %rax475; X64-LIN-NEXT: addq %rdi, %rax476; X64-LIN-NEXT: retq477;478; X64-WIN-LABEL: test12:479; X64-WIN: # %bb.0:480; X64-WIN-NEXT: notl %r8d481; X64-WIN-NEXT: movslq %r8d, %rax482; X64-WIN-NEXT: shlq $4, %rax483; X64-WIN-NEXT: addq %rcx, %rax484; X64-WIN-NEXT: retq485 %neg = shl i64 %intval, 32486 %sext = xor i64 %neg, -4294967296487 %idx.ext = ashr exact i64 %sext, 32488 %add.ptr = getelementptr inbounds %struct.ref_s, ptr %op, i64 %idx.ext489 ret ptr %add.ptr490}491 492define i32 @PR39657(ptr %p, i64 %x) {493; X86-LABEL: PR39657:494; X86: # %bb.0:495; X86-NEXT: movl {{[0-9]+}}(%esp), %eax496; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx497; X86-NEXT: notl %ecx498; X86-NEXT: movl (%eax,%ecx,4), %eax499; X86-NEXT: retl500;501; X64-LIN-LABEL: PR39657:502; X64-LIN: # %bb.0:503; X64-LIN-NEXT: notq %rsi504; X64-LIN-NEXT: movl (%rdi,%rsi,4), %eax505; X64-LIN-NEXT: retq506;507; X64-WIN-LABEL: PR39657:508; X64-WIN: # %bb.0:509; X64-WIN-NEXT: notq %rdx510; X64-WIN-NEXT: movl (%rcx,%rdx,4), %eax511; X64-WIN-NEXT: retq512 %sh = shl i64 %x, 2513 %mul = xor i64 %sh, -4514 %add.ptr = getelementptr inbounds i8, ptr %p, i64 %mul515 %load = load i32, ptr %add.ptr, align 4516 ret i32 %load517}518 519define i32 @add_of_not(i32 %x, i32 %y) {520; X86-LABEL: add_of_not:521; X86: # %bb.0:522; X86-NEXT: movl {{[0-9]+}}(%esp), %eax523; X86-NEXT: notl %eax524; X86-NEXT: addl {{[0-9]+}}(%esp), %eax525; X86-NEXT: retl526;527; X64-LIN-LABEL: add_of_not:528; X64-LIN: # %bb.0:529; X64-LIN-NEXT: # kill: def $esi killed $esi def $rsi530; X64-LIN-NEXT: # kill: def $edi killed $edi def $rdi531; X64-LIN-NEXT: notl %esi532; X64-LIN-NEXT: leal (%rsi,%rdi), %eax533; X64-LIN-NEXT: retq534;535; X64-WIN-LABEL: add_of_not:536; X64-WIN: # %bb.0:537; X64-WIN-NEXT: # kill: def $edx killed $edx def $rdx538; X64-WIN-NEXT: # kill: def $ecx killed $ecx def $rcx539; X64-WIN-NEXT: notl %edx540; X64-WIN-NEXT: leal (%rdx,%rcx), %eax541; X64-WIN-NEXT: retq542 %t0 = sub i32 %x, %y543 %r = add i32 %t0, -1544 ret i32 %r545}546 547define i32 @add_of_not_decrement(i32 %x, i32 %y) {548; X86-LABEL: add_of_not_decrement:549; X86: # %bb.0:550; X86-NEXT: movl {{[0-9]+}}(%esp), %eax551; X86-NEXT: notl %eax552; X86-NEXT: addl {{[0-9]+}}(%esp), %eax553; X86-NEXT: retl554;555; X64-LIN-LABEL: add_of_not_decrement:556; X64-LIN: # %bb.0:557; X64-LIN-NEXT: # kill: def $esi killed $esi def $rsi558; X64-LIN-NEXT: # kill: def $edi killed $edi def $rdi559; X64-LIN-NEXT: notl %esi560; X64-LIN-NEXT: leal (%rsi,%rdi), %eax561; X64-LIN-NEXT: retq562;563; X64-WIN-LABEL: add_of_not_decrement:564; X64-WIN: # %bb.0:565; X64-WIN-NEXT: # kill: def $edx killed $edx def $rdx566; X64-WIN-NEXT: # kill: def $ecx killed $ecx def $rcx567; X64-WIN-NEXT: notl %edx568; X64-WIN-NEXT: leal (%rdx,%rcx), %eax569; X64-WIN-NEXT: retq570 %t0 = sub i32 %x, %y571 %r = sub i32 %t0, 1572 ret i32 %r573}574 575define <4 x i32> @vec_add_of_not(<4 x i32> %x, <4 x i32> %y) {576; X86-LABEL: vec_add_of_not:577; X86: # %bb.0:578; X86-NEXT: pcmpeqd %xmm2, %xmm2579; X86-NEXT: pxor %xmm1, %xmm2580; X86-NEXT: paddd %xmm2, %xmm0581; X86-NEXT: retl582;583; X64-LIN-LABEL: vec_add_of_not:584; X64-LIN: # %bb.0:585; X64-LIN-NEXT: pcmpeqd %xmm2, %xmm2586; X64-LIN-NEXT: pxor %xmm1, %xmm2587; X64-LIN-NEXT: paddd %xmm2, %xmm0588; X64-LIN-NEXT: retq589;590; X64-WIN-LABEL: vec_add_of_not:591; X64-WIN: # %bb.0:592; X64-WIN-NEXT: pcmpeqd %xmm0, %xmm0593; X64-WIN-NEXT: pxor (%rdx), %xmm0594; X64-WIN-NEXT: paddd (%rcx), %xmm0595; X64-WIN-NEXT: retq596 %t0 = sub <4 x i32> %x, %y597 %r = add <4 x i32> %t0, <i32 -1, i32 -1, i32 -1, i32 -1>598 ret <4 x i32> %r599}600 601define <4 x i32> @vec_add_of_not_decrement(<4 x i32> %x, <4 x i32> %y) {602; X86-LABEL: vec_add_of_not_decrement:603; X86: # %bb.0:604; X86-NEXT: pcmpeqd %xmm2, %xmm2605; X86-NEXT: pxor %xmm1, %xmm2606; X86-NEXT: paddd %xmm2, %xmm0607; X86-NEXT: retl608;609; X64-LIN-LABEL: vec_add_of_not_decrement:610; X64-LIN: # %bb.0:611; X64-LIN-NEXT: pcmpeqd %xmm2, %xmm2612; X64-LIN-NEXT: pxor %xmm1, %xmm2613; X64-LIN-NEXT: paddd %xmm2, %xmm0614; X64-LIN-NEXT: retq615;616; X64-WIN-LABEL: vec_add_of_not_decrement:617; X64-WIN: # %bb.0:618; X64-WIN-NEXT: pcmpeqd %xmm0, %xmm0619; X64-WIN-NEXT: pxor (%rdx), %xmm0620; X64-WIN-NEXT: paddd (%rcx), %xmm0621; X64-WIN-NEXT: retq622 %t0 = sub <4 x i32> %x, %y623 %r = sub <4 x i32> %t0, <i32 1, i32 1, i32 1, i32 1>624 ret <4 x i32> %r625}626 627define <4 x i32> @vec_add_of_not_with_undef(<4 x i32> %x, <4 x i32> %y) {628; X86-LABEL: vec_add_of_not_with_undef:629; X86: # %bb.0:630; X86-NEXT: pcmpeqd %xmm2, %xmm2631; X86-NEXT: pxor %xmm1, %xmm2632; X86-NEXT: paddd %xmm2, %xmm0633; X86-NEXT: retl634;635; X64-LIN-LABEL: vec_add_of_not_with_undef:636; X64-LIN: # %bb.0:637; X64-LIN-NEXT: pcmpeqd %xmm2, %xmm2638; X64-LIN-NEXT: pxor %xmm1, %xmm2639; X64-LIN-NEXT: paddd %xmm2, %xmm0640; X64-LIN-NEXT: retq641;642; X64-WIN-LABEL: vec_add_of_not_with_undef:643; X64-WIN: # %bb.0:644; X64-WIN-NEXT: pcmpeqd %xmm0, %xmm0645; X64-WIN-NEXT: pxor (%rdx), %xmm0646; X64-WIN-NEXT: paddd (%rcx), %xmm0647; X64-WIN-NEXT: retq648 %t0 = sub <4 x i32> %x, %y649 %r = add <4 x i32> %t0, <i32 -1, i32 undef, i32 -1, i32 -1>650 ret <4 x i32> %r651}652 653define <4 x i32> @vec_add_of_not_with_undef_decrement(<4 x i32> %x, <4 x i32> %y) {654; X86-LABEL: vec_add_of_not_with_undef_decrement:655; X86: # %bb.0:656; X86-NEXT: pcmpeqd %xmm2, %xmm2657; X86-NEXT: pxor %xmm1, %xmm2658; X86-NEXT: paddd %xmm2, %xmm0659; X86-NEXT: retl660;661; X64-LIN-LABEL: vec_add_of_not_with_undef_decrement:662; X64-LIN: # %bb.0:663; X64-LIN-NEXT: pcmpeqd %xmm2, %xmm2664; X64-LIN-NEXT: pxor %xmm1, %xmm2665; X64-LIN-NEXT: paddd %xmm2, %xmm0666; X64-LIN-NEXT: retq667;668; X64-WIN-LABEL: vec_add_of_not_with_undef_decrement:669; X64-WIN: # %bb.0:670; X64-WIN-NEXT: pcmpeqd %xmm0, %xmm0671; X64-WIN-NEXT: pxor (%rdx), %xmm0672; X64-WIN-NEXT: paddd (%rcx), %xmm0673; X64-WIN-NEXT: retq674 %t0 = sub <4 x i32> %x, %y675 %r = sub <4 x i32> %t0, <i32 1, i32 undef, i32 1, i32 1>676 ret <4 x i32> %r677}678