brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.7 KiB · 2bef668 Raw
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