Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / pr32345.ll
blobcec3a6925c31cd87603d64fefc70b9d8849773a5
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -fast-isel-sink-local-values -O0 -mtriple=x86_64-unknown-linux-gnu -o - %s | FileCheck %s -check-prefix=X640
3 ; RUN: llc -fast-isel-sink-local-values -O0 -mtriple=i686-unknown             -o - %s | FileCheck %s -check-prefix=6860
4 ; RUN: llc -fast-isel-sink-local-values     -mtriple=x86_64-unknown-linux-gnu -o - %s | FileCheck %s -check-prefix=X64
5 ; RUN: llc -fast-isel-sink-local-values     -mtriple=i686-unknown             -o - %s | FileCheck %s -check-prefix=686
7 @var_22 = external global i16, align 2
8 @var_27 = external global i16, align 2
10 define void @foo() {
11 ; X640-LABEL: foo:
12 ; X640:       # %bb.0: # %bb
13 ; X640-NEXT:    movzwl var_22, %eax
14 ; X640-NEXT:    movzwl var_27, %ecx
15 ; X640-NEXT:    xorl %ecx, %eax
16 ; X640-NEXT:    movzwl var_27, %ecx
17 ; X640-NEXT:    xorl %ecx, %eax
18 ; X640-NEXT:    movslq %eax, %rdx
19 ; X640-NEXT:    movq %rdx, -{{[0-9]+}}(%rsp)
20 ; X640-NEXT:    movzwl var_22, %eax
21 ; X640-NEXT:    movzwl var_27, %ecx
22 ; X640-NEXT:    xorl %ecx, %eax
23 ; X640-NEXT:    movzwl var_27, %ecx
24 ; X640-NEXT:    xorl %ecx, %eax
25 ; X640-NEXT:    movslq %eax, %rdx
26 ; X640-NEXT:    movzwl var_27, %eax
27 ; X640-NEXT:    subl $16610, %eax # imm = 0x40E2
28 ; X640-NEXT:    movl %eax, %eax
29 ; X640-NEXT:    movl %eax, %ecx
30 ; X640-NEXT:    # kill: def $cl killed $rcx
31 ; X640-NEXT:    sarq %cl, %rdx
32 ; X640-NEXT:    movb %dl, %cl
33 ; X640-NEXT:    # implicit-def: $rdx
34 ; X640-NEXT:    movb %cl, (%rdx)
35 ; X640-NEXT:    retq
37 ; 6860-LABEL: foo:
38 ; 6860:       # %bb.0: # %bb
39 ; 6860-NEXT:    pushl %ebp
40 ; 6860-NEXT:    .cfi_def_cfa_offset 8
41 ; 6860-NEXT:    .cfi_offset %ebp, -8
42 ; 6860-NEXT:    movl %esp, %ebp
43 ; 6860-NEXT:    .cfi_def_cfa_register %ebp
44 ; 6860-NEXT:    pushl %ebx
45 ; 6860-NEXT:    pushl %edi
46 ; 6860-NEXT:    pushl %esi
47 ; 6860-NEXT:    andl $-8, %esp
48 ; 6860-NEXT:    subl $32, %esp
49 ; 6860-NEXT:    .cfi_offset %esi, -20
50 ; 6860-NEXT:    .cfi_offset %edi, -16
51 ; 6860-NEXT:    .cfi_offset %ebx, -12
52 ; 6860-NEXT:    movw var_22, %ax
53 ; 6860-NEXT:    movzwl var_27, %ecx
54 ; 6860-NEXT:    movw %cx, %dx
55 ; 6860-NEXT:    xorw %dx, %ax
56 ; 6860-NEXT:    # implicit-def: $esi
57 ; 6860-NEXT:    movw %ax, %si
58 ; 6860-NEXT:    xorl %ecx, %esi
59 ; 6860-NEXT:    movw %si, %ax
60 ; 6860-NEXT:    movzwl %ax, %ecx
61 ; 6860-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
62 ; 6860-NEXT:    movl $0, {{[0-9]+}}(%esp)
63 ; 6860-NEXT:    movw var_22, %ax
64 ; 6860-NEXT:    movzwl var_27, %ecx
65 ; 6860-NEXT:    movw %cx, %dx
66 ; 6860-NEXT:    xorw %dx, %ax
67 ; 6860-NEXT:    # implicit-def: $esi
68 ; 6860-NEXT:    movw %ax, %si
69 ; 6860-NEXT:    xorl %ecx, %esi
70 ; 6860-NEXT:    movw %si, %ax
71 ; 6860-NEXT:    movzwl %ax, %esi
72 ; 6860-NEXT:    movb %cl, %bl
73 ; 6860-NEXT:    addb $30, %bl
74 ; 6860-NEXT:    xorl %ecx, %ecx
75 ; 6860-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
76 ; 6860-NEXT:    movb %bl, %cl
77 ; 6860-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
78 ; 6860-NEXT:    shrdl %cl, %edi, %esi
79 ; 6860-NEXT:    testb $32, %bl
80 ; 6860-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
81 ; 6860-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
82 ; 6860-NEXT:    jne .LBB0_2
83 ; 6860-NEXT:  # %bb.1: # %bb
84 ; 6860-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
85 ; 6860-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
86 ; 6860-NEXT:  .LBB0_2: # %bb
87 ; 6860-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
88 ; 6860-NEXT:    movb %al, %cl
89 ; 6860-NEXT:    # implicit-def: $eax
90 ; 6860-NEXT:    movb %cl, (%eax)
91 ; 6860-NEXT:    leal -12(%ebp), %esp
92 ; 6860-NEXT:    popl %esi
93 ; 6860-NEXT:    popl %edi
94 ; 6860-NEXT:    popl %ebx
95 ; 6860-NEXT:    popl %ebp
96 ; 6860-NEXT:    .cfi_def_cfa %esp, 4
97 ; 6860-NEXT:    retl
99 ; X64-LABEL: foo:
100 ; X64:       # %bb.0: # %bb
101 ; X64-NEXT:    movzwl {{.*}}(%rip), %ecx
102 ; X64-NEXT:    movzwl {{.*}}(%rip), %eax
103 ; X64-NEXT:    xorw %cx, %ax
104 ; X64-NEXT:    xorl %ecx, %eax
105 ; X64-NEXT:    movzwl %ax, %eax
106 ; X64-NEXT:    movq %rax, -{{[0-9]+}}(%rsp)
107 ; X64-NEXT:    addb $30, %cl
108 ; X64-NEXT:    # kill: def $cl killed $cl killed $ecx
109 ; X64-NEXT:    shrq %cl, %rax
110 ; X64-NEXT:    movb %al, (%rax)
111 ; X64-NEXT:    retq
113 ; 686-LABEL: foo:
114 ; 686:       # %bb.0: # %bb
115 ; 686-NEXT:    pushl %ebp
116 ; 686-NEXT:    .cfi_def_cfa_offset 8
117 ; 686-NEXT:    .cfi_offset %ebp, -8
118 ; 686-NEXT:    movl %esp, %ebp
119 ; 686-NEXT:    .cfi_def_cfa_register %ebp
120 ; 686-NEXT:    andl $-8, %esp
121 ; 686-NEXT:    subl $8, %esp
122 ; 686-NEXT:    movzwl var_27, %ecx
123 ; 686-NEXT:    movzwl var_22, %eax
124 ; 686-NEXT:    xorw %cx, %ax
125 ; 686-NEXT:    xorl %ecx, %eax
126 ; 686-NEXT:    movzwl %ax, %eax
127 ; 686-NEXT:    movl %eax, (%esp)
128 ; 686-NEXT:    movl $0, {{[0-9]+}}(%esp)
129 ; 686-NEXT:    addb $30, %cl
130 ; 686-NEXT:    xorl %edx, %edx
131 ; 686-NEXT:    shrdl %cl, %edx, %eax
132 ; 686-NEXT:    testb $32, %cl
133 ; 686-NEXT:    jne .LBB0_2
134 ; 686-NEXT:  # %bb.1: # %bb
135 ; 686-NEXT:    movl %eax, %edx
136 ; 686-NEXT:  .LBB0_2: # %bb
137 ; 686-NEXT:    movb %dl, (%eax)
138 ; 686-NEXT:    movl %ebp, %esp
139 ; 686-NEXT:    popl %ebp
140 ; 686-NEXT:    .cfi_def_cfa %esp, 4
141 ; 686-NEXT:    retl
143   %tmp = alloca i64, align 8
144   %tmp1 = load i16, i16* @var_22, align 2
145   %tmp2 = zext i16 %tmp1 to i32
146   %tmp3 = load i16, i16* @var_27, align 2
147   %tmp4 = zext i16 %tmp3 to i32
148   %tmp5 = xor i32 %tmp2, %tmp4
149   %tmp6 = load i16, i16* @var_27, align 2
150   %tmp7 = zext i16 %tmp6 to i32
151   %tmp8 = xor i32 %tmp5, %tmp7
152   %tmp9 = sext i32 %tmp8 to i64
153   store i64 %tmp9, i64* %tmp, align 8
154   %tmp10 = load i16, i16* @var_22, align 2
155   %tmp11 = zext i16 %tmp10 to i32
156   %tmp12 = load i16, i16* @var_27, align 2
157   %tmp13 = zext i16 %tmp12 to i32
158   %tmp14 = xor i32 %tmp11, %tmp13
159   %tmp15 = load i16, i16* @var_27, align 2
160   %tmp16 = zext i16 %tmp15 to i32
161   %tmp17 = xor i32 %tmp14, %tmp16
162   %tmp18 = sext i32 %tmp17 to i64
163   %tmp19 = load i16, i16* @var_27, align 2
164   %tmp20 = zext i16 %tmp19 to i32
165   %tmp21 = sub nsw i32 %tmp20, 16610
166   %tmp22 = zext i32 %tmp21 to i64
167   %tmp23 = ashr i64 %tmp18, %tmp22
168   %tmp24 = trunc i64 %tmp23 to i8
169   store i8 %tmp24, i8* undef, align 1
170   ret void