| Summary: | [4.3 Regression] ICE in reload_cse_simplify_operands, at postreload.c:395 | ||
|---|---|---|---|
| Product: | gcc | Reporter: | Richard Biener <rguenth> |
| Component: | target | Assignee: | Not yet assigned to anyone <unassigned> |
| Status: | RESOLVED FIXED | ||
| Severity: | normal | CC: | gcc-bugs, ismail, krebbel, pinskia |
| Priority: | P3 | Keywords: | ice-on-valid-code |
| Version: | 4.3.0 | ||
| Target Milestone: | 4.3.0 | ||
| Host: | Target: | s390-*-*, s390x-*-* | |
| Build: | Known to work: | ||
| Known to fail: | Last reconfirmed: | 2008-01-07 17:28:30 | |
| Attachments: |
testcase
reduced testcase |
||
Created attachment 14854 [details]
testcase
Reducing...
Creative way of aborting the program on allocation failure might be the
cause:
template<typename T>
class VectorBufferBase {
public:
void allocateBuffer(size_t newCapacity)
{
((void)0);
m_capacity = newCapacity;
if (newCapacity > std::numeric_limits<size_t>::max() / sizeof(T))
*(int *)(uintptr_t)0xbbadbeef = 0;
m_buffer = static_cast<T*>(fastMalloc(newCapacity * sizeof(T)));
}
but a C testcase extracted from this part doesn't ICE. Auto-reducing still
running.
*** Bug 34642 has been marked as a duplicate of this bug. *** Created attachment 14865 [details]
reduced testcase
The (const_int 3148725999 [0xbbadbeef]) is accepted by legitimate_constant_p since it is expected to end up in the literal pool. But in this case the constant becomes part of a REG_EQUIV note of an insn moving the constant into a pseudo register. Generating a reload for a later insn using the pseudo as memory base register the REG_EQUIV note is used by push_reload to replace the pseudo directly with the constant. The emitted move insn can't be recognized since none of the constraints of the move pattern accepts the large constant. I think push_reload has to make sure that the move pattern to be emitted is able to deal with the constant taken from the reg_equiv_constant array. Subject: Bug 34641 Author: krebbel Date: Thu Jan 10 16:46:26 2008 New Revision: 131445 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=131445 Log: 2008-01-10 Andreas Krebbel <krebbel1@de.ibm.com> PR middle-end/34641 * reload.c (push_reload): Add assertions. All constants from reg_equiv_constant should have been used for replacing the respective pseudo earlier. (find_reloads_address): Invoke find_reloads_address_part for constant taken from the reg_equiv_constant array. 2008-01-10 Andreas Krebbel <krebbel1@de.ibm.com> PR middle-end/34641 * g++.dg/torture/pr34641.C: New testcase. Added: trunk/gcc/testsuite/g++.dg/torture/pr34641.C Modified: trunk/gcc/ChangeLog trunk/gcc/reload.c trunk/gcc/testsuite/ChangeLog Added testcase doesn't compile on i686-linux : gcc/testsuite/g++.dg/torture/pr34641.C:16: error: 'operator new' takes type 'size_t' ('unsigned int') as first parameter |
./cc1plus -fpreprocessed TextIterator.ii -quiet -march=z900 -m64 -O2 -version -fPIC -o /dev/null -w GNU C++ (GCC) version 4.3.0 20080102 (experimental) (s390-linux-gnu) compiled by GNU C version 4.2.2 (SUSE Linux), GMP version 4.2.1, MPFR version 2.2.1. GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096 Compiler executable checksum: 31c8074c01f903f38601f94b219eb8f8 ../../WebCore/editing/TextIterator.cpp: In function 'UChar* WebCore::plainTextToMallocAllocatedBuffer(const WebCore::Range*, unsigned int&)': ../../WebCore/editing/TextIterator.cpp:1316: error: insn does not satisfy its constraints: (insn 710 711 157 26 ../../JavaScriptCore/wtf/Vector.h:251 (set (reg:DI 3 %r3) (const_int 3148725999 [0xbbadbeef])) 50 {*movdi_64} (nil)) ../../WebCore/editing/TextIterator.cpp:1316: internal compiler error: in reload_cse_simplify_operands, at postreload.c:395 Please submit a full bug report, with preprocessed source if appropriate. See <http://gcc.gnu.org/bugs.html> for instructions.