Skip to content

Commit 5fc240a

Browse files
committed
Recommitting Craig Topper's patch now that r296476 has been recommitted.
When checking if chain node is foldable, make sure the intermediate nodes have a single use across all results not just the result that was used to reach the chain node. This recovers a test case that was severely broken by r296476, my making sure we don't create ADD/ADC that loads and stores when there is also a flag dependency. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297698 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 3bbf394 commit 5fc240a

File tree

2 files changed

+83
-255
lines changed

2 files changed

+83
-255
lines changed

lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3355,7 +3355,7 @@ void SelectionDAGISel::SelectCodeCommon(SDNode *NodeToMatch,
33553355
// a single use.
33563356
bool HasMultipleUses = false;
33573357
for (unsigned i = 1, e = NodeStack.size()-1; i != e; ++i)
3358-
if (!NodeStack[i].hasOneUse()) {
3358+
if (!NodeStack[i].getNode()->hasOneUse()) {
33593359
HasMultipleUses = true;
33603360
break;
33613361
}

test/CodeGen/X86/i256-add.ll

Lines changed: 82 additions & 254 deletions
Original file line numberDiff line numberDiff line change
@@ -6,122 +6,42 @@ define void @add(i256* %p, i256* %q) nounwind {
66
; X32-LABEL: add:
77
; X32: # BB#0:
88
; X32-NEXT: pushl %ebp
9-
; X32-NEXT: movl %esp, %ebp
109
; X32-NEXT: pushl %ebx
1110
; X32-NEXT: pushl %edi
1211
; X32-NEXT: pushl %esi
13-
; X32-NEXT: subl $28, %esp
14-
; X32-NEXT: movl 12(%ebp), %edi
15-
; X32-NEXT: movl 8(%ebp), %eax
16-
; X32-NEXT: movl (%eax), %ecx
17-
; X32-NEXT: movl (%edi), %edx
18-
; X32-NEXT: movl %ecx, %esi
19-
; X32-NEXT: addl %edx, %esi
20-
; X32-NEXT: movl 4(%edi), %ebx
21-
; X32-NEXT: movl 4(%eax), %esi
22-
; X32-NEXT: adcl %ebx, %esi
23-
; X32-NEXT: pushl %eax
24-
; X32-NEXT: seto %al
25-
; X32-NEXT: lahf
26-
; X32-NEXT: movl %eax, %esi
27-
; X32-NEXT: popl %eax
28-
; X32-NEXT: movl %esi, -32(%ebp) # 4-byte Spill
29-
; X32-NEXT: movl %esi, -16(%ebp) # 4-byte Spill
30-
; X32-NEXT: addl %edx, %ecx
31-
; X32-NEXT: movl %ecx, -40(%ebp) # 4-byte Spill
32-
; X32-NEXT: movl 8(%edi), %edx
33-
; X32-NEXT: movl %edx, -28(%ebp) # 4-byte Spill
34-
; X32-NEXT: movl 28(%edi), %ecx
35-
; X32-NEXT: movl %ecx, -36(%ebp) # 4-byte Spill
36-
; X32-NEXT: movl 24(%edi), %ecx
37-
; X32-NEXT: movl %ecx, -20(%ebp) # 4-byte Spill
38-
; X32-NEXT: movl 20(%edi), %ecx
39-
; X32-NEXT: movl 16(%edi), %esi
40-
; X32-NEXT: movl %esi, -24(%ebp) # 4-byte Spill
41-
; X32-NEXT: movl 12(%edi), %edi
42-
; X32-NEXT: adcl %ebx, 4(%eax)
43-
; X32-NEXT: movl 8(%eax), %ebx
44-
; X32-NEXT: movl -16(%ebp), %esi # 4-byte Reload
45-
; X32-NEXT: pushl %eax
46-
; X32-NEXT: movl %esi, %eax
47-
; X32-NEXT: addb $127, %al
48-
; X32-NEXT: sahf
49-
; X32-NEXT: popl %eax
50-
; X32-NEXT: adcl %edx, %ebx
51-
; X32-NEXT: pushl %eax
52-
; X32-NEXT: seto %al
53-
; X32-NEXT: lahf
54-
; X32-NEXT: movl %eax, %ebx
55-
; X32-NEXT: popl %eax
56-
; X32-NEXT: adcl %edi, 12(%eax)
57-
; X32-NEXT: pushl %eax
58-
; X32-NEXT: movl %ebx, %eax
59-
; X32-NEXT: addb $127, %al
60-
; X32-NEXT: sahf
61-
; X32-NEXT: popl %eax
62-
; X32-NEXT: adcl 12(%eax), %edi
63-
; X32-NEXT: pushl %eax
64-
; X32-NEXT: seto %al
65-
; X32-NEXT: lahf
66-
; X32-NEXT: movl %eax, %esi
67-
; X32-NEXT: popl %eax
68-
; X32-NEXT: movl 16(%eax), %ebx
69-
; X32-NEXT: movl -24(%ebp), %edx # 4-byte Reload
70-
; X32-NEXT: adcl %edx, %ebx
71-
; X32-NEXT: pushl %eax
72-
; X32-NEXT: seto %al
73-
; X32-NEXT: lahf
74-
; X32-NEXT: movl %eax, %ebx
75-
; X32-NEXT: popl %eax
76-
; X32-NEXT: pushl %eax
77-
; X32-NEXT: seto %al
78-
; X32-NEXT: lahf
79-
; X32-NEXT: movl %eax, %edi
80-
; X32-NEXT: popl %eax
81-
; X32-NEXT: pushl %eax
82-
; X32-NEXT: movl %esi, %eax
83-
; X32-NEXT: addb $127, %al
84-
; X32-NEXT: sahf
85-
; X32-NEXT: popl %eax
86-
; X32-NEXT: adcl %edx, 16(%eax)
87-
; X32-NEXT: movl -32(%ebp), %edx # 4-byte Reload
88-
; X32-NEXT: pushl %eax
89-
; X32-NEXT: movl %edx, %eax
90-
; X32-NEXT: addb $127, %al
91-
; X32-NEXT: sahf
92-
; X32-NEXT: popl %eax
93-
; X32-NEXT: movl -28(%ebp), %edx # 4-byte Reload
94-
; X32-NEXT: adcl %edx, 8(%eax)
95-
; X32-NEXT: pushl %eax
96-
; X32-NEXT: movl %edi, %eax
97-
; X32-NEXT: addb $127, %al
98-
; X32-NEXT: sahf
99-
; X32-NEXT: popl %eax
100-
; X32-NEXT: adcl %ecx, 20(%eax)
101-
; X32-NEXT: pushl %eax
102-
; X32-NEXT: movl %ebx, %eax
103-
; X32-NEXT: addb $127, %al
104-
; X32-NEXT: sahf
105-
; X32-NEXT: popl %eax
106-
; X32-NEXT: adcl 20(%eax), %ecx
107-
; X32-NEXT: pushl %eax
108-
; X32-NEXT: seto %al
109-
; X32-NEXT: lahf
110-
; X32-NEXT: movl %eax, %ecx
111-
; X32-NEXT: popl %eax
112-
; X32-NEXT: movl -20(%ebp), %edx # 4-byte Reload
113-
; X32-NEXT: adcl %edx, 24(%eax)
114-
; X32-NEXT: pushl %eax
115-
; X32-NEXT: movl %ecx, %eax
116-
; X32-NEXT: addb $127, %al
117-
; X32-NEXT: sahf
118-
; X32-NEXT: popl %eax
119-
; X32-NEXT: adcl 24(%eax), %edx
120-
; X32-NEXT: movl -36(%ebp), %ecx # 4-byte Reload
121-
; X32-NEXT: adcl %ecx, 28(%eax)
122-
; X32-NEXT: movl -40(%ebp), %ecx # 4-byte Reload
123-
; X32-NEXT: movl %ecx, (%eax)
124-
; X32-NEXT: addl $28, %esp
12+
; X32-NEXT: subl $12, %esp
13+
; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
14+
; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx
15+
; X32-NEXT: movl 8(%ecx), %edx
16+
; X32-NEXT: movl (%ecx), %ebx
17+
; X32-NEXT: movl 4(%ecx), %edi
18+
; X32-NEXT: movl 28(%eax), %esi
19+
; X32-NEXT: movl %esi, {{[0-9]+}}(%esp) # 4-byte Spill
20+
; X32-NEXT: movl 24(%eax), %ebp
21+
; X32-NEXT: addl (%eax), %ebx
22+
; X32-NEXT: adcl 4(%eax), %edi
23+
; X32-NEXT: adcl 8(%eax), %edx
24+
; X32-NEXT: movl %edx, {{[0-9]+}}(%esp) # 4-byte Spill
25+
; X32-NEXT: movl 20(%eax), %esi
26+
; X32-NEXT: movl 12(%eax), %edx
27+
; X32-NEXT: movl 16(%eax), %eax
28+
; X32-NEXT: adcl 12(%ecx), %edx
29+
; X32-NEXT: adcl 16(%ecx), %eax
30+
; X32-NEXT: adcl 20(%ecx), %esi
31+
; X32-NEXT: adcl 24(%ecx), %ebp
32+
; X32-NEXT: movl %ebp, (%esp) # 4-byte Spill
33+
; X32-NEXT: movl {{[0-9]+}}(%esp), %ebp # 4-byte Reload
34+
; X32-NEXT: adcl %ebp, 28(%ecx)
35+
; X32-NEXT: movl %ebx, (%ecx)
36+
; X32-NEXT: movl %edi, 4(%ecx)
37+
; X32-NEXT: movl {{[0-9]+}}(%esp), %edi # 4-byte Reload
38+
; X32-NEXT: movl %edi, 8(%ecx)
39+
; X32-NEXT: movl %edx, 12(%ecx)
40+
; X32-NEXT: movl %eax, 16(%ecx)
41+
; X32-NEXT: movl %esi, 20(%ecx)
42+
; X32-NEXT: movl (%esp), %eax # 4-byte Reload
43+
; X32-NEXT: movl %eax, 24(%ecx)
44+
; X32-NEXT: addl $12, %esp
12545
; X32-NEXT: popl %esi
12646
; X32-NEXT: popl %edi
12747
; X32-NEXT: popl %ebx
@@ -130,28 +50,17 @@ define void @add(i256* %p, i256* %q) nounwind {
13050
;
13151
; X64-LABEL: add:
13252
; X64: # BB#0:
133-
; X64-NEXT: pushq %rbp
134-
; X64-NEXT: movq %rsp, %rbp
135-
; X64-NEXT: movq (%rdi), %rdx
136-
; X64-NEXT: movq 8(%rdi), %r9
53+
; X64-NEXT: movq 16(%rdi), %rax
54+
; X64-NEXT: movq (%rdi), %rcx
55+
; X64-NEXT: movq 8(%rdi), %rdx
13756
; X64-NEXT: movq 24(%rsi), %r8
138-
; X64-NEXT: movq 8(%rsi), %r10
139-
; X64-NEXT: movq 16(%rsi), %rcx
140-
; X64-NEXT: movq (%rsi), %rsi
141-
; X64-NEXT: movq %rdx, %rax
142-
; X64-NEXT: addq %rsi, %rax
143-
; X64-NEXT: adcq %r10, 8(%rdi)
144-
; X64-NEXT: addq %rsi, %rdx
145-
; X64-NEXT: adcq %r10, %r9
146-
; X64-NEXT: pushfq
147-
; X64-NEXT: popq %rax
148-
; X64-NEXT: adcq %rcx, 16(%rdi)
149-
; X64-NEXT: pushq %rax
150-
; X64-NEXT: popfq
151-
; X64-NEXT: adcq 16(%rdi), %rcx
57+
; X64-NEXT: addq (%rsi), %rcx
58+
; X64-NEXT: adcq 8(%rsi), %rdx
59+
; X64-NEXT: adcq 16(%rsi), %rax
15260
; X64-NEXT: adcq %r8, 24(%rdi)
153-
; X64-NEXT: movq %rdx, (%rdi)
154-
; X64-NEXT: popq %rbp
61+
; X64-NEXT: movq %rcx, (%rdi)
62+
; X64-NEXT: movq %rdx, 8(%rdi)
63+
; X64-NEXT: movq %rax, 16(%rdi)
15564
; X64-NEXT: retq
15665
%a = load i256, i256* %p
15766
%b = load i256, i256* %q
@@ -163,110 +72,40 @@ define void @sub(i256* %p, i256* %q) nounwind {
16372
; X32-LABEL: sub:
16473
; X32: # BB#0:
16574
; X32-NEXT: pushl %ebp
166-
; X32-NEXT: movl %esp, %ebp
16775
; X32-NEXT: pushl %ebx
16876
; X32-NEXT: pushl %edi
16977
; X32-NEXT: pushl %esi
170-
; X32-NEXT: subl $24, %esp
171-
; X32-NEXT: movl 12(%ebp), %edi
172-
; X32-NEXT: movl 8(%ebp), %ecx
173-
; X32-NEXT: movl (%ecx), %eax
174-
; X32-NEXT: movl 4(%ecx), %edx
175-
; X32-NEXT: movl (%edi), %esi
176-
; X32-NEXT: cmpl %esi, %eax
177-
; X32-NEXT: movl 4(%edi), %ebx
178-
; X32-NEXT: sbbl %ebx, %edx
179-
; X32-NEXT: pushl %eax
180-
; X32-NEXT: seto %al
181-
; X32-NEXT: lahf
182-
; X32-NEXT: movl %eax, %edx
183-
; X32-NEXT: popl %eax
184-
; X32-NEXT: movl %edx, -24(%ebp) # 4-byte Spill
185-
; X32-NEXT: movl %edx, -16(%ebp) # 4-byte Spill
186-
; X32-NEXT: subl %esi, %eax
187-
; X32-NEXT: movl %eax, -36(%ebp) # 4-byte Spill
188-
; X32-NEXT: movl 8(%edi), %esi
189-
; X32-NEXT: movl 28(%edi), %eax
190-
; X32-NEXT: movl %eax, -32(%ebp) # 4-byte Spill
191-
; X32-NEXT: movl 24(%edi), %eax
192-
; X32-NEXT: movl %eax, -28(%ebp) # 4-byte Spill
193-
; X32-NEXT: movl 20(%edi), %eax
194-
; X32-NEXT: movl %eax, -20(%ebp) # 4-byte Spill
195-
; X32-NEXT: movl 16(%edi), %edx
196-
; X32-NEXT: movl 12(%edi), %edi
197-
; X32-NEXT: sbbl %ebx, 4(%ecx)
198-
; X32-NEXT: movl 8(%ecx), %ebx
199-
; X32-NEXT: movl -16(%ebp), %eax # 4-byte Reload
200-
; X32-NEXT: movl %eax, %eax
201-
; X32-NEXT: addb $127, %al
202-
; X32-NEXT: sahf
203-
; X32-NEXT: sbbl %esi, %ebx
204-
; X32-NEXT: pushl %eax
205-
; X32-NEXT: seto %al
206-
; X32-NEXT: lahf
207-
; X32-NEXT: movl %eax, %ebx
208-
; X32-NEXT: popl %eax
209-
; X32-NEXT: sbbl %edi, 12(%ecx)
210-
; X32-NEXT: movl 12(%ecx), %eax
211-
; X32-NEXT: pushl %eax
212-
; X32-NEXT: movl %ebx, %eax
213-
; X32-NEXT: addb $127, %al
214-
; X32-NEXT: sahf
215-
; X32-NEXT: popl %eax
216-
; X32-NEXT: sbbl %edi, %eax
217-
; X32-NEXT: seto %al
218-
; X32-NEXT: lahf
219-
; X32-NEXT: movl %eax, %eax
220-
; X32-NEXT: movl 16(%ecx), %edi
221-
; X32-NEXT: sbbl %edx, %edi
222-
; X32-NEXT: pushl %eax
223-
; X32-NEXT: seto %al
224-
; X32-NEXT: lahf
225-
; X32-NEXT: movl %eax, %edi
226-
; X32-NEXT: popl %eax
227-
; X32-NEXT: pushl %eax
228-
; X32-NEXT: seto %al
229-
; X32-NEXT: lahf
230-
; X32-NEXT: movl %eax, %ebx
231-
; X32-NEXT: popl %eax
232-
; X32-NEXT: movl %eax, %eax
233-
; X32-NEXT: addb $127, %al
234-
; X32-NEXT: sahf
235-
; X32-NEXT: sbbl %edx, 16(%ecx)
236-
; X32-NEXT: movl -24(%ebp), %eax # 4-byte Reload
237-
; X32-NEXT: movl %eax, %eax
238-
; X32-NEXT: addb $127, %al
239-
; X32-NEXT: sahf
240-
; X32-NEXT: sbbl %esi, 8(%ecx)
241-
; X32-NEXT: pushl %eax
242-
; X32-NEXT: movl %ebx, %eax
243-
; X32-NEXT: addb $127, %al
244-
; X32-NEXT: sahf
245-
; X32-NEXT: popl %eax
246-
; X32-NEXT: movl -20(%ebp), %edx # 4-byte Reload
247-
; X32-NEXT: sbbl %edx, 20(%ecx)
248-
; X32-NEXT: movl 20(%ecx), %eax
249-
; X32-NEXT: pushl %eax
250-
; X32-NEXT: movl %edi, %eax
251-
; X32-NEXT: addb $127, %al
252-
; X32-NEXT: sahf
253-
; X32-NEXT: popl %eax
254-
; X32-NEXT: sbbl %edx, %eax
255-
; X32-NEXT: seto %al
256-
; X32-NEXT: lahf
257-
; X32-NEXT: movl %eax, %eax
258-
; X32-NEXT: movl -28(%ebp), %esi # 4-byte Reload
259-
; X32-NEXT: sbbl %esi, 24(%ecx)
260-
; X32-NEXT: movl 24(%ecx), %edx
261-
; X32-NEXT: movl %eax, %eax
262-
; X32-NEXT: addb $127, %al
263-
; X32-NEXT: sahf
264-
; X32-NEXT: sbbl %esi, %edx
265-
; X32-NEXT: movl -32(%ebp), %eax # 4-byte Reload
266-
; X32-NEXT: sbbl %eax, 28(%ecx)
267-
; X32-NEXT: movl -36(%ebp), %eax # 4-byte Reload
268-
; X32-NEXT: movl %eax, (%ecx)
269-
; X32-NEXT: addl $24, %esp
78+
; X32-NEXT: subl $8, %esp
79+
; X32-NEXT: movl {{[0-9]+}}(%esp), %esi
80+
; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx
81+
; X32-NEXT: movl 16(%ecx), %eax
82+
; X32-NEXT: movl 12(%ecx), %edx
83+
; X32-NEXT: movl 8(%ecx), %edi
84+
; X32-NEXT: movl (%ecx), %ebx
85+
; X32-NEXT: movl 4(%ecx), %ebp
86+
; X32-NEXT: subl (%esi), %ebx
87+
; X32-NEXT: sbbl 4(%esi), %ebp
88+
; X32-NEXT: sbbl 8(%esi), %edi
89+
; X32-NEXT: sbbl 12(%esi), %edx
90+
; X32-NEXT: movl %edx, {{[0-9]+}}(%esp) # 4-byte Spill
91+
; X32-NEXT: sbbl 16(%esi), %eax
92+
; X32-NEXT: movl %eax, (%esp) # 4-byte Spill
93+
; X32-NEXT: movl 20(%ecx), %edx
94+
; X32-NEXT: sbbl 20(%esi), %edx
95+
; X32-NEXT: movl 24(%ecx), %eax
96+
; X32-NEXT: sbbl 24(%esi), %eax
97+
; X32-NEXT: movl 28(%esi), %esi
98+
; X32-NEXT: sbbl %esi, 28(%ecx)
99+
; X32-NEXT: movl %ebx, (%ecx)
100+
; X32-NEXT: movl %ebp, 4(%ecx)
101+
; X32-NEXT: movl %edi, 8(%ecx)
102+
; X32-NEXT: movl {{[0-9]+}}(%esp), %esi # 4-byte Reload
103+
; X32-NEXT: movl %esi, 12(%ecx)
104+
; X32-NEXT: movl (%esp), %esi # 4-byte Reload
105+
; X32-NEXT: movl %esi, 16(%ecx)
106+
; X32-NEXT: movl %edx, 20(%ecx)
107+
; X32-NEXT: movl %eax, 24(%ecx)
108+
; X32-NEXT: addl $8, %esp
270109
; X32-NEXT: popl %esi
271110
; X32-NEXT: popl %edi
272111
; X32-NEXT: popl %ebx
@@ -275,28 +114,17 @@ define void @sub(i256* %p, i256* %q) nounwind {
275114
;
276115
; X64-LABEL: sub:
277116
; X64: # BB#0:
278-
; X64-NEXT: pushq %rbp
279-
; X64-NEXT: movq %rsp, %rbp
280-
; X64-NEXT: movq (%rdi), %rax
281-
; X64-NEXT: movq 8(%rdi), %rcx
117+
; X64-NEXT: movq 16(%rdi), %rax
118+
; X64-NEXT: movq (%rdi), %rcx
119+
; X64-NEXT: movq 8(%rdi), %rdx
282120
; X64-NEXT: movq 24(%rsi), %r8
283-
; X64-NEXT: movq 8(%rsi), %rdx
284-
; X64-NEXT: movq 16(%rsi), %r9
285-
; X64-NEXT: movq (%rsi), %rsi
286-
; X64-NEXT: cmpq %rsi, %rax
287-
; X64-NEXT: sbbq %rdx, 8(%rdi)
288-
; X64-NEXT: subq %rsi, %rax
289-
; X64-NEXT: sbbq %rdx, %rcx
290-
; X64-NEXT: pushfq
291-
; X64-NEXT: popq %rcx
292-
; X64-NEXT: sbbq %r9, 16(%rdi)
293-
; X64-NEXT: movq 16(%rdi), %rdx
294-
; X64-NEXT: pushq %rcx
295-
; X64-NEXT: popfq
296-
; X64-NEXT: sbbq %r9, %rdx
121+
; X64-NEXT: subq (%rsi), %rcx
122+
; X64-NEXT: sbbq 8(%rsi), %rdx
123+
; X64-NEXT: sbbq 16(%rsi), %rax
297124
; X64-NEXT: sbbq %r8, 24(%rdi)
298-
; X64-NEXT: movq %rax, (%rdi)
299-
; X64-NEXT: popq %rbp
125+
; X64-NEXT: movq %rcx, (%rdi)
126+
; X64-NEXT: movq %rdx, 8(%rdi)
127+
; X64-NEXT: movq %rax, 16(%rdi)
300128
; X64-NEXT: retq
301129
%a = load i256, i256* %p
302130
%b = load i256, i256* %q

0 commit comments

Comments
 (0)