re PR middle-end/55921 (Crash in verify_ssa for asm to side-steps complex pessimization)
PR tree-optimization/55921 * tree-complex.c (expand_complex_asm): New function. (expand_complex_operations_1): Call it for GIMPLE_ASM. * gcc.c-torture/compile/pr55921.c: New test. From-SVN: r195080
This commit is contained in:
parent
0ff4390dd3
commit
a57fc74385
@ -1,3 +1,9 @@
|
||||
2013-01-10 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/55921
|
||||
* tree-complex.c (expand_complex_asm): New function.
|
||||
(expand_complex_operations_1): Call it for GIMPLE_ASM.
|
||||
|
||||
2013-01-10 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
|
||||
|
||||
PR target/55718
|
||||
|
@ -1,3 +1,8 @@
|
||||
2013-01-10 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/55921
|
||||
* gcc.c-torture/compile/pr55921.c: New test.
|
||||
|
||||
2013-01-09 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
PR tree-optimization/55569
|
||||
|
21
gcc/testsuite/gcc.c-torture/compile/pr55921.c
Normal file
21
gcc/testsuite/gcc.c-torture/compile/pr55921.c
Normal file
@ -0,0 +1,21 @@
|
||||
/* PR tree-optimization/55921 */
|
||||
|
||||
typedef union
|
||||
{
|
||||
_Complex float cf;
|
||||
long long ll;
|
||||
} ucf;
|
||||
|
||||
void
|
||||
foo (ucf *in, ucf *out, _Complex float r)
|
||||
{
|
||||
int i;
|
||||
ucf ucf1;
|
||||
_Complex float cf;
|
||||
|
||||
ucf1.ll = in[i].ll;
|
||||
__asm ("" : "=r" (cf) : "0" (ucf1.ll));
|
||||
cf *= r;
|
||||
__asm ("" : "=r" (ucf1.ll) : "0" (cf));
|
||||
out[i].ll = ucf1.ll;
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/* Lower complex number operations to scalar operations.
|
||||
Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
||||
Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
@ -1391,6 +1391,36 @@ expand_complex_comparison (gimple_stmt_iterator *gsi, tree ar, tree ai,
|
||||
update_stmt (stmt);
|
||||
}
|
||||
|
||||
/* Expand inline asm that sets some complex SSA_NAMEs. */
|
||||
|
||||
static void
|
||||
expand_complex_asm (gimple_stmt_iterator *gsi)
|
||||
{
|
||||
gimple stmt = gsi_stmt (*gsi);
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < gimple_asm_noutputs (stmt); ++i)
|
||||
{
|
||||
tree link = gimple_asm_output_op (stmt, i);
|
||||
tree op = TREE_VALUE (link);
|
||||
if (TREE_CODE (op) == SSA_NAME
|
||||
&& TREE_CODE (TREE_TYPE (op)) == COMPLEX_TYPE)
|
||||
{
|
||||
tree type = TREE_TYPE (op);
|
||||
tree inner_type = TREE_TYPE (type);
|
||||
tree r = build1 (REALPART_EXPR, inner_type, op);
|
||||
tree i = build1 (IMAGPART_EXPR, inner_type, op);
|
||||
gimple_seq list = set_component_ssa_name (op, false, r);
|
||||
|
||||
if (list)
|
||||
gsi_insert_seq_after (gsi, list, GSI_CONTINUE_LINKING);
|
||||
|
||||
list = set_component_ssa_name (op, true, i);
|
||||
if (list)
|
||||
gsi_insert_seq_after (gsi, list, GSI_CONTINUE_LINKING);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Process one statement. If we identify a complex operation, expand it. */
|
||||
|
||||
@ -1403,6 +1433,12 @@ expand_complex_operations_1 (gimple_stmt_iterator *gsi)
|
||||
complex_lattice_t al, bl;
|
||||
enum tree_code code;
|
||||
|
||||
if (gimple_code (stmt) == GIMPLE_ASM)
|
||||
{
|
||||
expand_complex_asm (gsi);
|
||||
return;
|
||||
}
|
||||
|
||||
lhs = gimple_get_lhs (stmt);
|
||||
if (!lhs && gimple_code (stmt) != GIMPLE_COND)
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user