brintos

brintos / llvm-project-archived public Read only

0
0
Text · 30.5 KiB · 46b2571 Raw
1112 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-- -mattr=+sse2 | FileCheck %s --check-prefixes=X863; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=X644 5define i32 @freeze_and(i32 %a0) nounwind {6; X86-LABEL: freeze_and:7; X86:       # %bb.0:8; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax9; X86-NEXT:    andl $7, %eax10; X86-NEXT:    retl11;12; X64-LABEL: freeze_and:13; X64:       # %bb.0:14; X64-NEXT:    movl %edi, %eax15; X64-NEXT:    andl $7, %eax16; X64-NEXT:    retq17  %x = and i32 %a0, 1518  %y = freeze i32 %x19  %z = and i32 %y, 720  ret i32 %z21}22 23define i32 @freeze_and_extra_use(i32 %a0, ptr %escape) nounwind {24; X86-LABEL: freeze_and_extra_use:25; X86:       # %bb.0:26; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax27; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx28; X86-NEXT:    movl %eax, (%ecx)29; X86-NEXT:    andl $7, %eax30; X86-NEXT:    retl31;32; X64-LABEL: freeze_and_extra_use:33; X64:       # %bb.0:34; X64-NEXT:    movl %edi, %eax35; X64-NEXT:    movl %edi, (%rsi)36; X64-NEXT:    andl $7, %eax37; X64-NEXT:    retq38  store i32 %a0, ptr %escape39  %x = and i32 %a0, 1540  %y = freeze i32 %x41  %z = and i32 %y, 742  ret i32 %z43}44define i32 @freeze_and_extra_use2(i32 %a0, ptr %escape) nounwind {45; X86-LABEL: freeze_and_extra_use2:46; X86:       # %bb.0:47; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax48; X86-NEXT:    andl $15, %eax49; X86-NEXT:    retl50;51; X64-LABEL: freeze_and_extra_use2:52; X64:       # %bb.0:53; X64-NEXT:    movl %edi, %eax54; X64-NEXT:    andl $15, %eax55; X64-NEXT:    retq56  %x = and i32 %a0, 1557  %y = freeze i32 %x58  %z = and i32 %y, 759  %w = and i32 %y, %a060  ret i32 %w61}62 63define <2 x i64> @freeze_and_vec(<2 x i64> %a0) nounwind {64; X86-LABEL: freeze_and_vec:65; X86:       # %bb.0:66; X86-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm067; X86-NEXT:    retl68;69; X64-LABEL: freeze_and_vec:70; X64:       # %bb.0:71; X64-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm072; X64-NEXT:    retq73  %x = and <2 x i64> %a0, <i64 15, i64 7>74  %y = freeze <2 x i64> %x75  %z = and <2 x i64> %y, <i64 7, i64 15>76  ret <2 x i64> %z77}78 79define i32 @freeze_or(i32 %a0) nounwind {80; X86-LABEL: freeze_or:81; X86:       # %bb.0:82; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax83; X86-NEXT:    orl $15, %eax84; X86-NEXT:    retl85;86; X64-LABEL: freeze_or:87; X64:       # %bb.0:88; X64-NEXT:    movl %edi, %eax89; X64-NEXT:    orl $15, %eax90; X64-NEXT:    retq91  %x = or i32 %a0, 392  %y = freeze i32 %x93  %z = or i32 %y, 1294  ret i32 %z95}96 97define <2 x i64> @freeze_or_vec(<2 x i64> %a0) nounwind {98; X86-LABEL: freeze_or_vec:99; X86:       # %bb.0:100; X86-NEXT:    orps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0101; X86-NEXT:    retl102;103; X64-LABEL: freeze_or_vec:104; X64:       # %bb.0:105; X64-NEXT:    vorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0106; X64-NEXT:    retq107  %x = or <2 x i64> %a0, <i64 1, i64 3>108  %y = freeze <2 x i64> %x109  %z = or <2 x i64> %y, <i64 14, i64 12>110  ret <2 x i64> %z111}112 113define i32 @freeze_xor(i32 %a0) nounwind {114; X86-LABEL: freeze_xor:115; X86:       # %bb.0:116; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax117; X86-NEXT:    xorl $15, %eax118; X86-NEXT:    retl119;120; X64-LABEL: freeze_xor:121; X64:       # %bb.0:122; X64-NEXT:    movl %edi, %eax123; X64-NEXT:    xorl $15, %eax124; X64-NEXT:    retq125  %x = xor i32 %a0, 3126  %y = freeze i32 %x127  %z = xor i32 %y, 12128  ret i32 %z129}130 131define <8 x i16> @freeze_xor_vec(<8 x i16> %a0) nounwind {132; X86-LABEL: freeze_xor_vec:133; X86:       # %bb.0:134; X86-NEXT:    pcmpeqd %xmm1, %xmm1135; X86-NEXT:    pxor %xmm1, %xmm0136; X86-NEXT:    retl137;138; X64-LABEL: freeze_xor_vec:139; X64:       # %bb.0:140; X64-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1141; X64-NEXT:    vpxor %xmm1, %xmm0, %xmm0142; X64-NEXT:    retq143  %x = xor <8 x i16> %a0, <i16 -1, i16 0, i16 -1, i16 0, i16 -1, i16 0, i16 -1, i16 0>144  %y = freeze <8 x i16> %x145  %z = xor <8 x i16> %y, <i16 0, i16 -1, i16 0, i16 -1, i16 0, i16 -1, i16 0, i16 -1>146  ret <8 x i16> %z147}148 149define i32 @freeze_add(i32 %a0) nounwind {150; X86-LABEL: freeze_add:151; X86:       # %bb.0:152; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax153; X86-NEXT:    addl $2, %eax154; X86-NEXT:    retl155;156; X64-LABEL: freeze_add:157; X64:       # %bb.0:158; X64-NEXT:    # kill: def $edi killed $edi def $rdi159; X64-NEXT:    leal 2(%rdi), %eax160; X64-NEXT:    retq161  %x = add i32 %a0, 1162  %y = freeze i32 %x163  %z = add i32 %y, 1164  ret i32 %z165}166 167define i32 @freeze_add_nsw(i32 %a0) nounwind {168; X86-LABEL: freeze_add_nsw:169; X86:       # %bb.0:170; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax171; X86-NEXT:    addl $2, %eax172; X86-NEXT:    retl173;174; X64-LABEL: freeze_add_nsw:175; X64:       # %bb.0:176; X64-NEXT:    # kill: def $edi killed $edi def $rdi177; X64-NEXT:    leal 2(%rdi), %eax178; X64-NEXT:    retq179  %x = add nsw i32 %a0, 1180  %y = freeze i32 %x181  %z = add i32 %y, 1182  ret i32 %z183}184 185define <4 x i32> @freeze_add_vec(<4 x i32> %a0) nounwind {186; X86-LABEL: freeze_add_vec:187; X86:       # %bb.0:188; X86-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0189; X86-NEXT:    retl190;191; X64-LABEL: freeze_add_vec:192; X64:       # %bb.0:193; X64-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [5,5,5,5]194; X64-NEXT:    vpaddd %xmm1, %xmm0, %xmm0195; X64-NEXT:    retq196  %x = add <4 x i32> %a0, <i32 1, i32 2, i32 3, i32 4>197  %y = freeze <4 x i32> %x198  %z = add <4 x i32> %y, <i32 4, i32 3, i32 2, i32 1>199  ret <4 x i32> %z200}201 202define <4 x i32> @freeze_add_vec_undef(<4 x i32> %a0) nounwind {203; X86-LABEL: freeze_add_vec_undef:204; X86:       # %bb.0:205; X86-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0206; X86-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0207; X86-NEXT:    retl208;209; X64-LABEL: freeze_add_vec_undef:210; X64:       # %bb.0:211; X64-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0212; X64-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0213; X64-NEXT:    retq214  %x = add <4 x i32> %a0, <i32 1, i32 2, i32 3, i32 undef>215  %y = freeze <4 x i32> %x216  %z = add <4 x i32> %y, <i32 4, i32 3, i32 2, i32 undef>217  ret <4 x i32> %z218}219 220define i32 @freeze_sub(i32 %a0) nounwind {221; X86-LABEL: freeze_sub:222; X86:       # %bb.0:223; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax224; X86-NEXT:    addl $-2, %eax225; X86-NEXT:    retl226;227; X64-LABEL: freeze_sub:228; X64:       # %bb.0:229; X64-NEXT:    # kill: def $edi killed $edi def $rdi230; X64-NEXT:    leal -2(%rdi), %eax231; X64-NEXT:    retq232  %x = sub i32 %a0, 1233  %y = freeze i32 %x234  %z = sub i32 %y, 1235  ret i32 %z236}237 238define i32 @freeze_sub_nuw(i32 %a0) nounwind {239; X86-LABEL: freeze_sub_nuw:240; X86:       # %bb.0:241; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax242; X86-NEXT:    addl $-2, %eax243; X86-NEXT:    retl244;245; X64-LABEL: freeze_sub_nuw:246; X64:       # %bb.0:247; X64-NEXT:    # kill: def $edi killed $edi def $rdi248; X64-NEXT:    leal -2(%rdi), %eax249; X64-NEXT:    retq250  %x = sub nuw i32 %a0, 1251  %y = freeze i32 %x252  %z = sub i32 %y, 1253  ret i32 %z254}255 256define <4 x i32> @freeze_sub_vec(<4 x i32> %a0) nounwind {257; X86-LABEL: freeze_sub_vec:258; X86:       # %bb.0:259; X86-NEXT:    psubd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0260; X86-NEXT:    retl261;262; X64-LABEL: freeze_sub_vec:263; X64:       # %bb.0:264; X64-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [5,5,5,5]265; X64-NEXT:    vpsubd %xmm1, %xmm0, %xmm0266; X64-NEXT:    retq267  %x = sub <4 x i32> %a0, <i32 1, i32 2, i32 3, i32 4>268  %y = freeze <4 x i32> %x269  %z = sub <4 x i32> %y, <i32 4, i32 3, i32 2, i32 1>270  ret <4 x i32> %z271}272 273define <4 x i32> @freeze_sub_vec_undef(<4 x i32> %a0) nounwind {274; X86-LABEL: freeze_sub_vec_undef:275; X86:       # %bb.0:276; X86-NEXT:    psubd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0277; X86-NEXT:    psubd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0278; X86-NEXT:    retl279;280; X64-LABEL: freeze_sub_vec_undef:281; X64:       # %bb.0:282; X64-NEXT:    vpsubd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0283; X64-NEXT:    vpsubd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0284; X64-NEXT:    retq285  %x = sub <4 x i32> %a0, <i32 1, i32 2, i32 3, i32 undef>286  %y = freeze <4 x i32> %x287  %z = sub <4 x i32> %y, <i32 4, i32 3, i32 2, i32 undef>288  ret <4 x i32> %z289}290 291define i32 @freeze_mul(i32 %a0) nounwind {292; X86-LABEL: freeze_mul:293; X86:       # %bb.0:294; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax295; X86-NEXT:    shll $2, %eax296; X86-NEXT:    retl297;298; X64-LABEL: freeze_mul:299; X64:       # %bb.0:300; X64-NEXT:    # kill: def $edi killed $edi def $rdi301; X64-NEXT:    leal (,%rdi,4), %eax302; X64-NEXT:    retq303  %x = mul i32 %a0, 2304  %y = freeze i32 %x305  %z = mul i32 %y, 2306  ret i32 %z307}308 309define i32 @freeze_mul_nsw(i32 %a0) nounwind {310; X86-LABEL: freeze_mul_nsw:311; X86:       # %bb.0:312; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax313; X86-NEXT:    leal (%eax,%eax,4), %eax314; X86-NEXT:    leal (%eax,%eax,2), %eax315; X86-NEXT:    retl316;317; X64-LABEL: freeze_mul_nsw:318; X64:       # %bb.0:319; X64-NEXT:    # kill: def $edi killed $edi def $rdi320; X64-NEXT:    leal (%rdi,%rdi,4), %eax321; X64-NEXT:    leal (%rax,%rax,2), %eax322; X64-NEXT:    retq323  %x = mul nsw i32 %a0, 3324  %y = freeze i32 %x325  %z = mul i32 %y, 5326  ret i32 %z327}328 329define <8 x i16> @freeze_mul_vec(<8 x i16> %a0) nounwind {330; X86-LABEL: freeze_mul_vec:331; X86:       # %bb.0:332; X86-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [4,6,6,4,4,6,6,4]333; X86-NEXT:    retl334;335; X64-LABEL: freeze_mul_vec:336; X64:       # %bb.0:337; X64-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [4,6,6,4,4,6,6,4]338; X64-NEXT:    retq339  %x = mul <8 x i16> %a0, <i16 1, i16 2, i16 3, i16 4, i16 4, i16 3, i16 2, i16 1>340  %y = freeze <8 x i16> %x341  %z = mul <8 x i16> %y, <i16 4, i16 3, i16 2, i16 1, i16 1, i16 2, i16 3, i16 4>342  ret <8 x i16> %z343}344 345define <8 x i16> @freeze_mul_vec_undef(<8 x i16> %a0) nounwind {346; X86-LABEL: freeze_mul_vec_undef:347; X86:       # %bb.0:348; X86-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [1,2,3,4,4,3,0,1]349; X86-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [4,3,2,1,1,2,u,4]350; X86-NEXT:    retl351;352; X64-LABEL: freeze_mul_vec_undef:353; X64:       # %bb.0:354; X64-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,3,4,4,3,0,1]355; X64-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [4,3,2,1,1,2,u,4]356; X64-NEXT:    retq357  %x = mul <8 x i16> %a0, <i16 1, i16 2, i16 3, i16 4, i16 4, i16 3, i16 undef, i16 1>358  %y = freeze <8 x i16> %x359  %z = mul <8 x i16> %y, <i16 4, i16 3, i16 2, i16 1, i16 1, i16 2, i16 undef, i16 4>360  ret <8 x i16> %z361}362 363define i32 @freeze_shl(i32 %a0) nounwind {364; X86-LABEL: freeze_shl:365; X86:       # %bb.0:366; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax367; X86-NEXT:    shll $3, %eax368; X86-NEXT:    retl369;370; X64-LABEL: freeze_shl:371; X64:       # %bb.0:372; X64-NEXT:    # kill: def $edi killed $edi def $rdi373; X64-NEXT:    leal (,%rdi,8), %eax374; X64-NEXT:    retq375  %x = shl i32 %a0, 1376  %y = freeze i32 %x377  %z = shl i32 %y, 2378  ret i32 %z379}380 381define i32 @freeze_shl_nsw(i32 %a0) nounwind {382; X86-LABEL: freeze_shl_nsw:383; X86:       # %bb.0:384; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax385; X86-NEXT:    shll $8, %eax386; X86-NEXT:    retl387;388; X64-LABEL: freeze_shl_nsw:389; X64:       # %bb.0:390; X64-NEXT:    movl %edi, %eax391; X64-NEXT:    shll $8, %eax392; X64-NEXT:    retq393  %x = shl nsw i32 %a0, 3394  %y = freeze i32 %x395  %z = shl i32 %y, 5396  ret i32 %z397}398 399define i32 @freeze_shl_outofrange(i32 %a0) nounwind {400; X86-LABEL: freeze_shl_outofrange:401; X86:       # %bb.0:402; X86-NEXT:    shll $2, %eax403; X86-NEXT:    retl404;405; X64-LABEL: freeze_shl_outofrange:406; X64:       # %bb.0:407; X64-NEXT:    shll $2, %eax408; X64-NEXT:    retq409  %x = shl i32 %a0, 32410  %y = freeze i32 %x411  %z = shl i32 %y, 2412  ret i32 %z413}414 415define <2 x i64> @freeze_shl_vec(<2 x i64> %a0) nounwind {416; X86-LABEL: freeze_shl_vec:417; X86:       # %bb.0:418; X86-NEXT:    movdqa %xmm0, %xmm1419; X86-NEXT:    psllq $4, %xmm1420; X86-NEXT:    psllq $2, %xmm0421; X86-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]422; X86-NEXT:    retl423;424; X64-LABEL: freeze_shl_vec:425; X64:       # %bb.0:426; X64-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0427; X64-NEXT:    retq428  %x = shl <2 x i64> %a0, <i64 2, i64 1>429  %y = freeze <2 x i64> %x430  %z = shl <2 x i64> %y, <i64 2, i64 1>431  ret <2 x i64> %z432}433 434define <2 x i64> @freeze_shl_vec_outofrange(<2 x i64> %a0) nounwind {435; X86-LABEL: freeze_shl_vec_outofrange:436; X86:       # %bb.0:437; X86-NEXT:    psllq $3, %xmm0438; X86-NEXT:    retl439;440; X64-LABEL: freeze_shl_vec_outofrange:441; X64:       # %bb.0:442; X64-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0443; X64-NEXT:    vpsllq $2, %xmm0, %xmm0444; X64-NEXT:    retq445  %x = shl <2 x i64> %a0, <i64 1, i64 64>446  %y = freeze <2 x i64> %x447  %z = shl <2 x i64> %y, <i64 2, i64 2>448  ret <2 x i64> %z449}450 451define i32 @freeze_ashr(i32 %a0) nounwind {452; X86-LABEL: freeze_ashr:453; X86:       # %bb.0:454; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax455; X86-NEXT:    sarl $3, %eax456; X86-NEXT:    sarl $3, %eax457; X86-NEXT:    retl458;459; X64-LABEL: freeze_ashr:460; X64:       # %bb.0:461; X64-NEXT:    movl %edi, %eax462; X64-NEXT:    sarl $6, %eax463; X64-NEXT:    retq464  %x = ashr i32 %a0, 3465  %y = freeze i32 %x466  %z = ashr i32 %y, 3467  ret i32 %z468}469 470define i32 @freeze_ashr_exact(i32 %a0) nounwind {471; X86-LABEL: freeze_ashr_exact:472; X86:       # %bb.0:473; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax474; X86-NEXT:    sarl $3, %eax475; X86-NEXT:    sarl $6, %eax476; X86-NEXT:    retl477;478; X64-LABEL: freeze_ashr_exact:479; X64:       # %bb.0:480; X64-NEXT:    movl %edi, %eax481; X64-NEXT:    sarl $3, %eax482; X64-NEXT:    sarl $6, %eax483; X64-NEXT:    retq484  %x = ashr exact i32 %a0, 3485  %y = freeze i32 %x486  %z = ashr i32 %y, 6487  ret i32 %z488}489 490define i32 @freeze_ashr_exact_extra_use(i32 %a0, ptr %escape) nounwind {491; X86-LABEL: freeze_ashr_exact_extra_use:492; X86:       # %bb.0:493; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx494; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax495; X86-NEXT:    sarl $3, %eax496; X86-NEXT:    movl %eax, %edx497; X86-NEXT:    sarl $6, %eax498; X86-NEXT:    movl %edx, (%ecx)499; X86-NEXT:    retl500;501; X64-LABEL: freeze_ashr_exact_extra_use:502; X64:       # %bb.0:503; X64-NEXT:    movl %edi, %eax504; X64-NEXT:    sarl $3, %eax505; X64-NEXT:    movl %eax, %ecx506; X64-NEXT:    sarl $6, %eax507; X64-NEXT:    movl %ecx, (%rsi)508; X64-NEXT:    retq509  %x = ashr exact i32 %a0, 3510  %y = freeze i32 %x511  %z = ashr i32 %y, 6512  store i32 %x, ptr %escape513  ret i32 %z514}515 516define i32 @freeze_ashr_outofrange(i32 %a0) nounwind {517; X86-LABEL: freeze_ashr_outofrange:518; X86:       # %bb.0:519; X86-NEXT:    sarl $3, %eax520; X86-NEXT:    retl521;522; X64-LABEL: freeze_ashr_outofrange:523; X64:       # %bb.0:524; X64-NEXT:    sarl $3, %eax525; X64-NEXT:    retq526  %x = ashr i32 %a0, 32527  %y = freeze i32 %x528  %z = ashr i32 %y, 3529  ret i32 %z530}531 532define <8 x i16> @freeze_ashr_vec(<8 x i16> %a0) nounwind {533; X86-LABEL: freeze_ashr_vec:534; X86:       # %bb.0:535; X86-NEXT:    psraw $4, %xmm0536; X86-NEXT:    retl537;538; X64-LABEL: freeze_ashr_vec:539; X64:       # %bb.0:540; X64-NEXT:    vpsraw $4, %xmm0, %xmm0541; X64-NEXT:    retq542  %x = ashr <8 x i16> %a0, <i16 3, i16 1, i16 3, i16 1, i16 3, i16 1, i16 3, i16 1>543  %y = freeze <8 x i16> %x544  %z = ashr <8 x i16> %y, <i16 1, i16 3, i16 1, i16 3, i16 1, i16 3, i16 1, i16 3>545  ret <8 x i16> %z546}547 548define <4 x i32> @freeze_ashr_vec_outofrange(<4 x i32> %a0) nounwind {549; X86-LABEL: freeze_ashr_vec_outofrange:550; X86:       # %bb.0:551; X86-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,2,3]552; X86-NEXT:    psrad $3, %xmm0553; X86-NEXT:    retl554;555; X64-LABEL: freeze_ashr_vec_outofrange:556; X64:       # %bb.0:557; X64-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0558; X64-NEXT:    vpsrad $2, %xmm0, %xmm0559; X64-NEXT:    retq560  %x = ashr <4 x i32> %a0, <i32 1, i32 33, i32 1, i32 1>561  %y = freeze <4 x i32> %x562  %z = ashr <4 x i32> %y, <i32 2, i32 2, i32 2, i32 2>563  ret <4 x i32> %z564}565 566define i32 @freeze_lshr(i32 %a0) nounwind {567; X86-LABEL: freeze_lshr:568; X86:       # %bb.0:569; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax570; X86-NEXT:    shrl $2, %eax571; X86-NEXT:    shrl %eax572; X86-NEXT:    retl573;574; X64-LABEL: freeze_lshr:575; X64:       # %bb.0:576; X64-NEXT:    movl %edi, %eax577; X64-NEXT:    shrl $3, %eax578; X64-NEXT:    retq579  %x = lshr i32 %a0, 2580  %y = freeze i32 %x581  %z = lshr i32 %y, 1582  ret i32 %z583}584 585define i32 @freeze_lshr_exact(i32 %a0) nounwind {586; X86-LABEL: freeze_lshr_exact:587; X86:       # %bb.0:588; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax589; X86-NEXT:    shrl $3, %eax590; X86-NEXT:    shrl $5, %eax591; X86-NEXT:    retl592;593; X64-LABEL: freeze_lshr_exact:594; X64:       # %bb.0:595; X64-NEXT:    movl %edi, %eax596; X64-NEXT:    shrl $3, %eax597; X64-NEXT:    shrl $5, %eax598; X64-NEXT:    retq599  %x = lshr exact i32 %a0, 3600  %y = freeze i32 %x601  %z = lshr i32 %y, 5602  ret i32 %z603}604 605define i32 @freeze_lshr_exact_extra_use(i32 %a0, ptr %escape) nounwind {606; X86-LABEL: freeze_lshr_exact_extra_use:607; X86:       # %bb.0:608; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx609; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax610; X86-NEXT:    shrl $3, %eax611; X86-NEXT:    movl %eax, %edx612; X86-NEXT:    shrl $5, %eax613; X86-NEXT:    movl %edx, (%ecx)614; X86-NEXT:    retl615;616; X64-LABEL: freeze_lshr_exact_extra_use:617; X64:       # %bb.0:618; X64-NEXT:    movl %edi, %eax619; X64-NEXT:    shrl $3, %eax620; X64-NEXT:    movl %eax, %ecx621; X64-NEXT:    shrl $5, %eax622; X64-NEXT:    movl %ecx, (%rsi)623; X64-NEXT:    retq624  %x = lshr exact i32 %a0, 3625  %y = freeze i32 %x626  %z = lshr i32 %y, 5627  store i32 %x, ptr %escape628  ret i32 %z629}630 631define i32 @freeze_lshr_outofrange(i32 %a0) nounwind {632; X86-LABEL: freeze_lshr_outofrange:633; X86:       # %bb.0:634; X86-NEXT:    shrl %eax635; X86-NEXT:    retl636;637; X64-LABEL: freeze_lshr_outofrange:638; X64:       # %bb.0:639; X64-NEXT:    shrl %eax640; X64-NEXT:    retq641  %x = lshr i32 %a0, 32642  %y = freeze i32 %x643  %z = lshr i32 %y, 1644  ret i32 %z645}646 647define <8 x i16> @freeze_lshr_vec(<8 x i16> %a0) nounwind {648; X86-LABEL: freeze_lshr_vec:649; X86:       # %bb.0:650; X86-NEXT:    psrlw $3, %xmm0651; X86-NEXT:    retl652;653; X64-LABEL: freeze_lshr_vec:654; X64:       # %bb.0:655; X64-NEXT:    vpsrlw $3, %xmm0, %xmm0656; X64-NEXT:    retq657  %x = lshr <8 x i16> %a0, <i16 2, i16 1, i16 2, i16 1, i16 2, i16 1, i16 2, i16 1>658  %y = freeze <8 x i16> %x659  %z = lshr <8 x i16> %y, <i16 1, i16 2, i16 1, i16 2, i16 1, i16 2, i16 1, i16 2>660  ret <8 x i16> %z661}662 663define <4 x i32> @freeze_lshr_vec_outofrange(<4 x i32> %a0) nounwind {664; X86-LABEL: freeze_lshr_vec_outofrange:665; X86:       # %bb.0:666; X86-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,2,3]667; X86-NEXT:    psrld $3, %xmm0668; X86-NEXT:    retl669;670; X64-LABEL: freeze_lshr_vec_outofrange:671; X64:       # %bb.0:672; X64-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0673; X64-NEXT:    vpsrld $2, %xmm0, %xmm0674; X64-NEXT:    retq675  %x = lshr <4 x i32> %a0, <i32 1, i32 33, i32 1, i32 1>676  %y = freeze <4 x i32> %x677  %z = lshr <4 x i32> %y, <i32 2, i32 2, i32 2, i32 2>678  ret <4 x i32> %z679}680 681define i32 @freeze_rotl(i32 %a0) nounwind {682; X86-LABEL: freeze_rotl:683; X86:       # %bb.0:684; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax685; X86-NEXT:    roll $10, %eax686; X86-NEXT:    retl687;688; X64-LABEL: freeze_rotl:689; X64:       # %bb.0:690; X64-NEXT:    movl %edi, %eax691; X64-NEXT:    roll $10, %eax692; X64-NEXT:    retq693  %x = call i32 @llvm.fshl.i32(i32 %a0, i32 %a0, i32 5)694  %y = freeze i32 %x695  %z = call i32 @llvm.fshl.i32(i32 %y, i32 %y, i32 5)696  ret i32 %z697}698declare i32 @llvm.fshl.i32(i32, i32, i32)699 700define <4 x i32> @freeze_rotl_vec(<4 x i32> %a0) nounwind {701; X86-LABEL: freeze_rotl_vec:702; X86:       # %bb.0:703; X86-NEXT:    movdqa %xmm0, %xmm1704; X86-NEXT:    psrld $2, %xmm1705; X86-NEXT:    pslld $30, %xmm0706; X86-NEXT:    por %xmm1, %xmm0707; X86-NEXT:    retl708;709; X64-LABEL: freeze_rotl_vec:710; X64:       # %bb.0:711; X64-NEXT:    vpsrld $2, %xmm0, %xmm1712; X64-NEXT:    vpslld $30, %xmm0, %xmm0713; X64-NEXT:    vpor %xmm1, %xmm0, %xmm0714; X64-NEXT:    retq715  %x = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %a0, <4 x i32> %a0, <4 x i32> <i32 0, i32 1, i32 2, i32 3>)716  %y = freeze <4 x i32> %x717  %z = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %y, <4 x i32> %y, <4 x i32> <i32 30, i32 29, i32 28, i32 27>)718  ret <4 x i32> %z719}720declare <4 x i32> @llvm.fshl.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)721 722define i32 @freeze_rotr(i32 %a0) nounwind {723; X86-LABEL: freeze_rotr:724; X86:       # %bb.0:725; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax726; X86-NEXT:    rorl $24, %eax727; X86-NEXT:    retl728;729; X64-LABEL: freeze_rotr:730; X64:       # %bb.0:731; X64-NEXT:    movl %edi, %eax732; X64-NEXT:    rorl $24, %eax733; X64-NEXT:    retq734  %x = call i32 @llvm.fshr.i32(i32 %a0, i32 %a0, i32 11)735  %y = freeze i32 %x736  %z = call i32 @llvm.fshr.i32(i32 %y, i32 %y, i32 13)737  ret i32 %z738}739declare i32 @llvm.fshr.i32(i32, i32, i32)740 741define <4 x i32> @freeze_rotr_vec(<4 x i32> %a0) nounwind {742; X86-LABEL: freeze_rotr_vec:743; X86:       # %bb.0:744; X86-NEXT:    movdqa %xmm0, %xmm1745; X86-NEXT:    psrld $31, %xmm1746; X86-NEXT:    paddd %xmm0, %xmm0747; X86-NEXT:    por %xmm1, %xmm0748; X86-NEXT:    retl749;750; X64-LABEL: freeze_rotr_vec:751; X64:       # %bb.0:752; X64-NEXT:    vpsrld $31, %xmm0, %xmm1753; X64-NEXT:    vpaddd %xmm0, %xmm0, %xmm0754; X64-NEXT:    vpor %xmm1, %xmm0, %xmm0755; X64-NEXT:    retq756  %x = call <4 x i32> @llvm.fshr.v4i32(<4 x i32> %a0, <4 x i32> %a0, <4 x i32> <i32 0, i32 1, i32 2, i32 3>)757  %y = freeze <4 x i32> %x758  %z = call <4 x i32> @llvm.fshr.v4i32(<4 x i32> %y, <4 x i32> %y, <4 x i32> <i32 31, i32 30, i32 29, i32 28>)759  ret <4 x i32> %z760}761declare <4 x i32> @llvm.fshr.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)762 763define i32 @freeze_fshl(i32 %a0, i32 %a1, i32 %a2) nounwind {764; X86-LABEL: freeze_fshl:765; X86:       # %bb.0:766; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx767; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax768; X86-NEXT:    shrl $27, %eax769; X86-NEXT:    shldl $27, %ecx, %eax770; X86-NEXT:    retl771;772; X64-LABEL: freeze_fshl:773; X64:       # %bb.0:774; X64-NEXT:    movl %esi, %eax775; X64-NEXT:    shrl $27, %eax776; X64-NEXT:    shldl $27, %edx, %eax777; X64-NEXT:    retq778  %f1 = freeze i32 %a1779  %f2 = freeze i32 %a2780  %x = call i32 @llvm.fshl.i32(i32 %a0, i32 %f1, i32 5)781  %y = freeze i32 %x782  %z = call i32 @llvm.fshl.i32(i32 %y, i32 %f2, i32 27)783  ret i32 %z784}785 786define i32 @freeze_fshr(i32 %a0, i32 %a1, i32 %a2) nounwind {787; X86-LABEL: freeze_fshr:788; X86:       # %bb.0:789; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx790; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax791; X86-NEXT:    shrl %eax792; X86-NEXT:    shldl $1, %ecx, %eax793; X86-NEXT:    retl794;795; X64-LABEL: freeze_fshr:796; X64:       # %bb.0:797; X64-NEXT:    movl %esi, %eax798; X64-NEXT:    shrl %eax799; X64-NEXT:    shldl $1, %edx, %eax800; X64-NEXT:    retq801  %f1 = freeze i32 %a1802  %f2 = freeze i32 %a2803  %x = call i32 @llvm.fshr.i32(i32 %a0, i32 %f1, i32 1)804  %y = freeze i32 %x805  %z = call i32 @llvm.fshr.i32(i32 %y, i32 %f2, i32 31)806  ret i32 %z807}808 809define i32 @freeze_saddo(i32 %a0, i32 %a1, i8 %a2, i8 %a3) nounwind {810; X86-LABEL: freeze_saddo:811; X86:       # %bb.0:812; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax813; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx814; X86-NEXT:    addb {{[0-9]+}}(%esp), %cl815; X86-NEXT:    adcl $0, %eax816; X86-NEXT:    addl {{[0-9]+}}(%esp), %eax817; X86-NEXT:    retl818;819; X64-LABEL: freeze_saddo:820; X64:       # %bb.0:821; X64-NEXT:    movl %edi, %eax822; X64-NEXT:    addb %cl, %dl823; X64-NEXT:    adcl %esi, %eax824; X64-NEXT:    retq825  %b = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 %a2, i8 %a3)826  %b.o = extractvalue {i8, i1} %b, 1827  %x = zext i1 %b.o to i32828 829  %f0 = freeze i32 %a0830  %o = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %f0, i32 %x)831  %f = freeze {i32, i1} %o832  %v = extractvalue {i32, i1} %f, 0833  %r = add i32 %v, %a1834  ret i32 %r835}836 837define i32 @freeze_uaddo(i32 %a0, i32 %a1, i8 %a2, i8 %a3) nounwind {838; X86-LABEL: freeze_uaddo:839; X86:       # %bb.0:840; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax841; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx842; X86-NEXT:    addb {{[0-9]+}}(%esp), %cl843; X86-NEXT:    adcl $0, %eax844; X86-NEXT:    addl {{[0-9]+}}(%esp), %eax845; X86-NEXT:    retl846;847; X64-LABEL: freeze_uaddo:848; X64:       # %bb.0:849; X64-NEXT:    movl %edi, %eax850; X64-NEXT:    addb %cl, %dl851; X64-NEXT:    adcl %esi, %eax852; X64-NEXT:    retq853  %b = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 %a2, i8 %a3)854  %b.o = extractvalue {i8, i1} %b, 1855  %x = zext i1 %b.o to i32856 857  %f0 = freeze i32 %a0858  %o = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %f0, i32 %x)859  %f = freeze {i32, i1} %o860  %v = extractvalue {i32, i1} %f, 0861  %r = add i32 %v, %a1862  ret i32 %r863}864 865define i32 @freeze_ssubo(i32 %a0, i32 %a1, i8 %a2, i8 %a3) nounwind {866; X86-LABEL: freeze_ssubo:867; X86:       # %bb.0:868; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax869; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %edx870; X86-NEXT:    xorl %ecx, %ecx871; X86-NEXT:    addb {{[0-9]+}}(%esp), %dl872; X86-NEXT:    setb %cl873; X86-NEXT:    andl $1, %ecx874; X86-NEXT:    subl %ecx, %eax875; X86-NEXT:    subl {{[0-9]+}}(%esp), %eax876; X86-NEXT:    retl877;878; X64-LABEL: freeze_ssubo:879; X64:       # %bb.0:880; X64-NEXT:    movl %edi, %eax881; X64-NEXT:    addb %cl, %dl882; X64-NEXT:    sbbl $0, %eax883; X64-NEXT:    subl %esi, %eax884; X64-NEXT:    retq885  %b = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 %a2, i8 %a3)886  %b.o = extractvalue {i8, i1} %b, 1887  %x = zext i1 %b.o to i32888 889  %f0 = freeze i32 %a0890  %o = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %f0, i32 %x)891  %f = freeze {i32, i1} %o892  %v = extractvalue {i32, i1} %f, 0893  %r = sub i32 %v, %a1894  ret i32 %r895}896 897define i32 @freeze_usubo(i32 %a0, i32 %a1, i8 %a2, i8 %a3) nounwind {898; X86-LABEL: freeze_usubo:899; X86:       # %bb.0:900; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax901; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %edx902; X86-NEXT:    xorl %ecx, %ecx903; X86-NEXT:    addb {{[0-9]+}}(%esp), %dl904; X86-NEXT:    setb %cl905; X86-NEXT:    andl $1, %ecx906; X86-NEXT:    subl %ecx, %eax907; X86-NEXT:    subl {{[0-9]+}}(%esp), %eax908; X86-NEXT:    retl909;910; X64-LABEL: freeze_usubo:911; X64:       # %bb.0:912; X64-NEXT:    movl %edi, %eax913; X64-NEXT:    addb %cl, %dl914; X64-NEXT:    sbbl $0, %eax915; X64-NEXT:    subl %esi, %eax916; X64-NEXT:    retq917  %b = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 %a2, i8 %a3)918  %b.o = extractvalue {i8, i1} %b, 1919  %x = zext i1 %b.o to i32920 921  %f0 = freeze i32 %a0922  %o = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %f0, i32 %x)923  %f = freeze {i32, i1} %o924  %v = extractvalue {i32, i1} %f, 0925  %r = sub i32 %v, %a1926  ret i32 %r927}928 929define i32 @freeze_scmp(i32 %a0) nounwind {930; X86-LABEL: freeze_scmp:931; X86:       # %bb.0:932; X86-NEXT:    movl $2, %eax933; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %eax934; X86-NEXT:    setl %al935; X86-NEXT:    setg %cl936; X86-NEXT:    subb %al, %cl937; X86-NEXT:    movsbl %cl, %eax938; X86-NEXT:    negl %eax939; X86-NEXT:    setl %al940; X86-NEXT:    setg %cl941; X86-NEXT:    subb %al, %cl942; X86-NEXT:    movsbl %cl, %eax943; X86-NEXT:    retl944;945; X64-LABEL: freeze_scmp:946; X64:       # %bb.0:947; X64-NEXT:    movl $2, %eax948; X64-NEXT:    cmpl %edi, %eax949; X64-NEXT:    setl %al950; X64-NEXT:    setg %cl951; X64-NEXT:    subb %al, %cl952; X64-NEXT:    movsbl %cl, %eax953; X64-NEXT:    negl %eax954; X64-NEXT:    setl %al955; X64-NEXT:    setg %cl956; X64-NEXT:    subb %al, %cl957; X64-NEXT:    movsbl %cl, %eax958; X64-NEXT:    retq959  %x = call i32 @llvm.scmp.i32(i32 2, i32 %a0)960  %y = freeze i32 %x961  %z = call i32 @llvm.scmp.i32(i32 0, i32 %y)962  ret i32 %z963}964 965define i32 @freeze_ucmp(i32 %a0) nounwind {966; X86-LABEL: freeze_ucmp:967; X86:       # %bb.0:968; X86-NEXT:    movl $2, %eax969; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %eax970; X86-NEXT:    seta %al971; X86-NEXT:    sbbb $0, %al972; X86-NEXT:    movsbl %al, %eax973; X86-NEXT:    cmpl $2, %eax974; X86-NEXT:    setae %cl975; X86-NEXT:    cmpl $1, %eax976; X86-NEXT:    sbbb $0, %cl977; X86-NEXT:    movsbl %cl, %eax978; X86-NEXT:    retl979;980; X64-LABEL: freeze_ucmp:981; X64:       # %bb.0:982; X64-NEXT:    movl $2, %eax983; X64-NEXT:    cmpl %edi, %eax984; X64-NEXT:    seta %al985; X64-NEXT:    sbbb $0, %al986; X64-NEXT:    movsbl %al, %eax987; X64-NEXT:    cmpl $2, %eax988; X64-NEXT:    setae %cl989; X64-NEXT:    cmpl $1, %eax990; X64-NEXT:    sbbb $0, %cl991; X64-NEXT:    movsbl %cl, %eax992; X64-NEXT:    retq993  %x = call i32 @llvm.ucmp.i32(i32 2, i32 %a0)994  %y = freeze i32 %x995  %z = call i32 @llvm.ucmp.i32(i32 %y, i32 1)996  ret i32 %z997}998 999define void @pr59676_frozen(ptr %dst, i32 %x.orig) {1000; X86-LABEL: pr59676_frozen:1001; X86:       # %bb.0:1002; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1003; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1004; X86-NEXT:    imull %eax, %eax1005; X86-NEXT:    imull $84, %eax, %eax1006; X86-NEXT:    movl $818089009, %edx # imm = 0x30C30C311007; X86-NEXT:    imull %edx1008; X86-NEXT:    movl %edx, %eax1009; X86-NEXT:    shrl $31, %eax1010; X86-NEXT:    sarl $3, %edx1011; X86-NEXT:    addl %eax, %edx1012; X86-NEXT:    movl %edx, (%ecx)1013; X86-NEXT:    retl1014;1015; X64-LABEL: pr59676_frozen:1016; X64:       # %bb.0:1017; X64-NEXT:    imull %esi, %esi1018; X64-NEXT:    imull $84, %esi, %eax1019; X64-NEXT:    cltq1020; X64-NEXT:    imulq $818089009, %rax, %rax # imm = 0x30C30C311021; X64-NEXT:    movq %rax, %rcx1022; X64-NEXT:    shrq $63, %rcx1023; X64-NEXT:    sarq $35, %rax1024; X64-NEXT:    addl %ecx, %eax1025; X64-NEXT:    movl %eax, (%rdi)1026; X64-NEXT:    retq1027  %x = freeze i32 %x.orig1028  %mul = mul i32 %x, 421029  %shl = shl i32 %x, 11030  %mul.frozen = freeze i32 %mul1031  %shl.frozen = freeze i32 %shl1032  %area = mul i32 %mul.frozen, %shl.frozen1033  %div = sdiv i32 %area, 421034  store i32 %div, ptr %dst, align 41035  ret void1036}1037define void @pr59676_nsw_frozen(ptr %dst, i32 %x.orig) {1038; X86-LABEL: pr59676_nsw_frozen:1039; X86:       # %bb.0:1040; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1041; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1042; X86-NEXT:    imull %eax, %eax1043; X86-NEXT:    imull $84, %eax, %eax1044; X86-NEXT:    movl $818089009, %edx # imm = 0x30C30C311045; X86-NEXT:    imull %edx1046; X86-NEXT:    movl %edx, %eax1047; X86-NEXT:    shrl $31, %eax1048; X86-NEXT:    sarl $3, %edx1049; X86-NEXT:    addl %eax, %edx1050; X86-NEXT:    movl %edx, (%ecx)1051; X86-NEXT:    retl1052;1053; X64-LABEL: pr59676_nsw_frozen:1054; X64:       # %bb.0:1055; X64-NEXT:    imull %esi, %esi1056; X64-NEXT:    imull $84, %esi, %eax1057; X64-NEXT:    cltq1058; X64-NEXT:    imulq $818089009, %rax, %rax # imm = 0x30C30C311059; X64-NEXT:    movq %rax, %rcx1060; X64-NEXT:    shrq $63, %rcx1061; X64-NEXT:    sarq $35, %rax1062; X64-NEXT:    addl %ecx, %eax1063; X64-NEXT:    movl %eax, (%rdi)1064; X64-NEXT:    retq1065  %x = freeze i32 %x.orig1066  %mul = mul nsw i32 %x, 421067  %shl = shl i32 %x, 11068  %mul.frozen = freeze i32 %mul1069  %shl.frozen = freeze i32 %shl1070  %area = mul i32 %mul.frozen, %shl.frozen1071  %div = sdiv i32 %area, 421072  store i32 %div, ptr %dst, align 41073  ret void1074}1075define void @pr59676_nsw(ptr %dst, i32 %x) {1076; X86-LABEL: pr59676_nsw:1077; X86:       # %bb.0:1078; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1079; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1080; X86-NEXT:    imull %eax, %eax1081; X86-NEXT:    imull $84, %eax, %eax1082; X86-NEXT:    movl $818089009, %edx # imm = 0x30C30C311083; X86-NEXT:    imull %edx1084; X86-NEXT:    movl %edx, %eax1085; X86-NEXT:    shrl $31, %eax1086; X86-NEXT:    sarl $3, %edx1087; X86-NEXT:    addl %eax, %edx1088; X86-NEXT:    movl %edx, (%ecx)1089; X86-NEXT:    retl1090;1091; X64-LABEL: pr59676_nsw:1092; X64:       # %bb.0:1093; X64-NEXT:    imull %esi, %esi1094; X64-NEXT:    imull $84, %esi, %eax1095; X64-NEXT:    cltq1096; X64-NEXT:    imulq $818089009, %rax, %rax # imm = 0x30C30C311097; X64-NEXT:    movq %rax, %rcx1098; X64-NEXT:    shrq $63, %rcx1099; X64-NEXT:    sarq $35, %rax1100; X64-NEXT:    addl %ecx, %eax1101; X64-NEXT:    movl %eax, (%rdi)1102; X64-NEXT:    retq1103  %mul = mul nsw i32 %x, 421104  %shl = shl i32 %x, 11105  %mul.frozen = freeze i32 %mul1106  %shl.frozen = freeze i32 %shl1107  %area = mul i32 %mul.frozen, %shl.frozen1108  %div = sdiv i32 %area, 421109  store i32 %div, ptr %dst, align 41110  ret void1111}1112