Commit a57fc743 by Jakub Jelinek Committed by Jakub Jelinek

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
parent 0ff4390d
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> 2013-01-10 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
PR target/55718 PR target/55718
......
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> 2013-01-09 Jan Hubicka <jh@suse.cz>
PR tree-optimization/55569 PR tree-optimization/55569
......
/* 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;
}
/* Lower complex number operations to scalar operations. /* 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. Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -1391,6 +1391,36 @@ expand_complex_comparison (gimple_stmt_iterator *gsi, tree ar, tree ai, ...@@ -1391,6 +1391,36 @@ expand_complex_comparison (gimple_stmt_iterator *gsi, tree ar, tree ai,
update_stmt (stmt); 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. */ /* Process one statement. If we identify a complex operation, expand it. */
...@@ -1403,6 +1433,12 @@ expand_complex_operations_1 (gimple_stmt_iterator *gsi) ...@@ -1403,6 +1433,12 @@ expand_complex_operations_1 (gimple_stmt_iterator *gsi)
complex_lattice_t al, bl; complex_lattice_t al, bl;
enum tree_code code; enum tree_code code;
if (gimple_code (stmt) == GIMPLE_ASM)
{
expand_complex_asm (gsi);
return;
}
lhs = gimple_get_lhs (stmt); lhs = gimple_get_lhs (stmt);
if (!lhs && gimple_code (stmt) != GIMPLE_COND) if (!lhs && gimple_code (stmt) != GIMPLE_COND)
return; return;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment