Commit 5e40da4f by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/58775 (reassoc1 causes an ICE with some bool arithmetic)

	PR tree-optimization/58775
	PR tree-optimization/58791
	* tree-ssa-reassoc.c (reassoc_stmt_dominates_stmt_p): New function.
	(insert_stmt_after): Rewritten, don't move the stmt, but really
	insert it.
	(get_stmt_uid_with_default): Remove.
	(build_and_add_sum): Use insert_stmt_after and
	reassoc_stmt_dominates_stmt_p.  Fix up uid if bb contains only
	labels.
	(update_range_test): Set uid on stmts added by
	force_gimple_operand_gsi.  Don't immediately modify statements
	in inter-bb optimization, just update oe->op values.
	(optimize_range_tests): Return bool whether any changed have
	been made.
	(update_ops): New function.
	(struct inter_bb_range_test_entry): New type.
	(maybe_optimize_range_tests): Perform statement changes here.
	(not_dominated_by, appears_later_in_bb, get_def_stmt,
	ensure_ops_are_available): Remove.
	(find_insert_point): Rewritten.
	(rewrite_expr_tree): Remove MOVED argument, add CHANGED argument,
	return LHS of the (new resp. old) stmt.  Don't call
	ensure_ops_are_available, don't reuse SSA_NAMEs, recurse first
	instead of last, move new stmt at the right place.
	(linearize_expr, repropagate_negates): Don't reuse SSA_NAMEs.
	(negate_value): Likewise.  Set uids.
	(break_up_subtract_bb): Initialize uids.
	(reassociate_bb): Adjust rewrite_expr_tree caller.
	(do_reassoc): Don't call renumber_gimple_stmt_uids.

	* gcc.dg/guality/pr58791-1.c: New test.
	* gcc.dg/guality/pr58791-2.c: New test.
	* gcc.dg/guality/pr58791-3.c: New test.
	* gcc.dg/guality/pr58791-4.c: New test.
	* gcc.dg/guality/pr58791-5.c: New test.
	* gcc.c-torture/compile/pr58775.c: New test.
	* gcc.dg/tree-ssa/reassoc-28.c: Don't scan reassoc1 dump.

From-SVN: r203979
parent 66caf47a
2013-10-23 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/58775
PR tree-optimization/58791
* tree-ssa-reassoc.c (reassoc_stmt_dominates_stmt_p): New function.
(insert_stmt_after): Rewritten, don't move the stmt, but really
insert it.
(get_stmt_uid_with_default): Remove.
(build_and_add_sum): Use insert_stmt_after and
reassoc_stmt_dominates_stmt_p. Fix up uid if bb contains only
labels.
(update_range_test): Set uid on stmts added by
force_gimple_operand_gsi. Don't immediately modify statements
in inter-bb optimization, just update oe->op values.
(optimize_range_tests): Return bool whether any changed have
been made.
(update_ops): New function.
(struct inter_bb_range_test_entry): New type.
(maybe_optimize_range_tests): Perform statement changes here.
(not_dominated_by, appears_later_in_bb, get_def_stmt,
ensure_ops_are_available): Remove.
(find_insert_point): Rewritten.
(rewrite_expr_tree): Remove MOVED argument, add CHANGED argument,
return LHS of the (new resp. old) stmt. Don't call
ensure_ops_are_available, don't reuse SSA_NAMEs, recurse first
instead of last, move new stmt at the right place.
(linearize_expr, repropagate_negates): Don't reuse SSA_NAMEs.
(negate_value): Likewise. Set uids.
(break_up_subtract_bb): Initialize uids.
(reassociate_bb): Adjust rewrite_expr_tree caller.
(do_reassoc): Don't call renumber_gimple_stmt_uids.
2013-10-23 David Edelsohn <dje.gcc@gmail.com>
PR target/58838
2013-10-23 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/58775
PR tree-optimization/58791
* gcc.dg/guality/pr58791-1.c: New test.
* gcc.dg/guality/pr58791-2.c: New test.
* gcc.dg/guality/pr58791-3.c: New test.
* gcc.dg/guality/pr58791-4.c: New test.
* gcc.dg/guality/pr58791-5.c: New test.
* gcc.c-torture/compile/pr58775.c: New test.
* gcc.dg/tree-ssa/reassoc-28.c: Don't scan reassoc1 dump.
2013-10-23 Tom de Vries <tom@codesourcery.com>
PR tree-optimization/58805
......
/* PR tree-optimization/58775 */
void bar (void);
void
foo (char *x)
{
char a;
_Bool b, c, d, e, f, g, h, i, j, k, l, m;
a = *x;
b = a == 100;
c = a == 105;
d = b | c;
e = a != 111;
f = !d;
g = e & f;
h = a != 117;
i = g & h;
j = a != 120;
k = i & j;
l = a != 88;
m = k & l;
if (m == 0)
bar ();
}
/* PR tree-optimization/58791 */
/* { dg-do run } */
/* { dg-options "-g" } */
#include "../nop.h"
__attribute__((noinline, noclone)) int
foo (int x, int y)
{
_Bool a = x != 0;
_Bool b = y != 2;
_Bool c = a & b;
_Bool d = !c;
int ret;
if (c)
{
if (y < 3 || y > 4)
ret = 1;
else
ret = 0;
}
else
ret = 0;
asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr58791-1.c:25 "c & 1" "1" } } */
asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr58791-1.c:25 "d & 1" "0" } } */
return ret;
}
int
main ()
{
foo (1, 3);
return 0;
}
/* PR tree-optimization/58791 */
/* { dg-do run } */
/* { dg-options "-g" } */
#include "../nop.h"
__attribute__((noinline, noclone)) int
foo (unsigned char c)
{
int ret;
_Bool a, b, d, e, f;
a = c == 34;
b = c == 32;
d = a | b;
f = !d;
if (d)
ret = 1;
else
{
e = c <= 31;
ret = e;
}
asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr58791-2.c:27 "d & 1" "1" } } */
asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr58791-2.c:27 "f & 1" "0" } } */
return ret;
}
int
main ()
{
foo (32);
return 0;
}
/* PR tree-optimization/58791 */
/* { dg-do run } */
/* { dg-options "-g" } */
#include "../nop.h"
__attribute__((noinline, noclone)) unsigned
foo (unsigned a, unsigned b, unsigned c, unsigned d, unsigned e)
{
unsigned f = b + c; /* { dg-final { gdb-test pr58791-3.c:19 "f" "5" } } */
unsigned g = a - f; /* { dg-final { gdb-test pr58791-3.c:19 "g" "24" } } */
unsigned h = d + e; /* { dg-final { gdb-test pr58791-3.c:19 "h" "9" } } */
unsigned i = g - h; /* { dg-final { gdb-test pr58791-3.c:19 "i" "15" } } */
unsigned j = f + 1; /* { dg-final { gdb-test pr58791-3.c:19 "j" "6" } } */
unsigned k = g + 1; /* { dg-final { gdb-test pr58791-3.c:19 "k" "25" } } */
unsigned l = h + 1; /* { dg-final { gdb-test pr58791-3.c:19 "l" "10" } } */
unsigned m = i + 1; /* { dg-final { gdb-test pr58791-3.c:19 "m" "16" } } */
asm volatile (NOP : : : "memory");
asm volatile (NOP : : : "memory");
return i;
}
int
main ()
{
foo (29, 2, 3, 4, 5);
return 0;
}
/* PR tree-optimization/58791 */
/* { dg-do run } */
/* { dg-options "-g -ffast-math" } */
#include "../nop.h"
__attribute__((noinline, noclone)) double
foo (float a, float b, float c, float d, float l, double u)
{
float e = a * d;
float f = d * e;
double g = (double) f;
double h = (double) b;
double i = g * h; /* { dg-final { gdb-test pr58791-4.c:32 "i" "486" { target { x86_64-*-* && lp64 } } } } */
double i2 = i + 1.0; /* { dg-final { gdb-test pr58791-4.c:32 "i2" "487" { target { x86_64-*-* && lp64 } } } } */
double j = i * 3.25;
double k = h + j;
float m = l * 8.75;
double n = (double) m;
double o = (double) a;
double p = n * o;
double q = h * p;
double r = q * 2.5;
double s = k - r;
double t = (double) c;
double v = o * u;
double w = o * v;
double x = h * w;
double y = h * x;
double z = y * 8.5;
asm volatile (NOP : : : "memory");
asm volatile (NOP : : : "memory");
return s - z;
}
int
main ()
{
foo (3.0f, 2.0f, -1.0f, 9.0f, 1.0f, 2.0);
return 0;
}
/* PR tree-optimization/58791 */
/* { dg-do run } */
/* { dg-options "-g" } */
#include "../nop.h"
__attribute__((noinline, noclone)) unsigned int
foo (unsigned int a0, unsigned int a1, unsigned int a2,
unsigned int a3, unsigned int a4)
{
unsigned int b0, b1, b2, b3, b4, e;
/* this can be optimized to four additions... */
b4 = a4 + a3 + a2 + a1 + a0; /* { dg-final { gdb-test pr58791-5.c:20 "b4" "4681" } } */
b3 = a3 + a2 + a1 + a0; /* { dg-final { gdb-test pr58791-5.c:20 "b3" "585" } } */
b2 = a2 + a1 + a0; /* { dg-final { gdb-test pr58791-5.c:20 "b2" "73" } } */
b1 = a1 + a0; /* { dg-final { gdb-test pr58791-5.c:20 "b1" "9" } } */
/* This is actually 0 */
e = b4 - b3 + b2 - b1 - a4 - a2; /* { dg-final { gdb-test pr58791-5.c:20 "e" "0" } } */
asm volatile (NOP : : : "memory");
asm volatile (NOP : : : "memory");
return e;
}
int
main ()
{
foo (1, 8, 64, 512, 4096);
return 0;
}
/* { dg-do run} */
/* { dg-options "-O2 -fdump-tree-reassoc1-details" } */
/* { dg-options "-O2" } */
#define LENGTH 4
void abort (void);
......@@ -30,8 +30,3 @@ int main() {
abort ();
return 0;
}
/* Verify one stmt has been moved to another BB to ensure correct dependences. */
/* { dg-final { scan-tree-dump-times "to a different BB" 1 "reassoc1"} }*/
/* { dg-final { scan-tree-dump-times "within same BB" 2 "reassoc1"} }*/
/* { dg-final { cleanup-tree-dump "reassoc1" } } */
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