mirror of git://gcc.gnu.org/git/gcc.git
re PR tree-optimization/71230 (ICE : in zero_one_operation, at tree-ssa-reassoc.c:1230)
2016-05-24 Richard Biener <rguenther@suse.de> PR tree-optimization/71230 * tree-ssa-reassoc.c (zero_one_operation): Handle negate special ops. * gcc.dg/torture/pr71230.c: New testcase. * g++.dg/torture/pr71230.C: Likewise. From-SVN: r236643
This commit is contained in:
parent
fce57248c8
commit
e5328f5dc2
|
|
@ -1,3 +1,8 @@
|
||||||
|
2016-05-24 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
|
PR tree-optimization/71230
|
||||||
|
* tree-ssa-reassoc.c (zero_one_operation): Handle negate special ops.
|
||||||
|
|
||||||
2016-05-24 Richard Sandiford <richard.sandiford@arm.com>
|
2016-05-24 Richard Sandiford <richard.sandiford@arm.com>
|
||||||
|
|
||||||
* tree-vectorizer.h (vectorizable_comparison): Delete.
|
* tree-vectorizer.h (vectorizable_comparison): Delete.
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,9 @@
|
||||||
|
2016-05-24 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
|
PR tree-optimization/71230
|
||||||
|
* gcc.dg/torture/pr71230.c: New testcase.
|
||||||
|
* g++.dg/torture/pr71230.C: Likewise.
|
||||||
|
|
||||||
2016-05-24 Thomas Schwinge <thomas@codesourcery.com>
|
2016-05-24 Thomas Schwinge <thomas@codesourcery.com>
|
||||||
|
|
||||||
* c-c++-common/goacc/routine-5.c: Add tests.
|
* c-c++-common/goacc/routine-5.c: Add tests.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
// { dg-do compile }
|
||||||
|
// { dg-additional-options "-ffast-math" }
|
||||||
|
|
||||||
|
template <int rank, int dim> class Tensor;
|
||||||
|
template <int dim> class Point {
|
||||||
|
public:
|
||||||
|
Point (const double x, const double y, const double z);
|
||||||
|
double operator () (const unsigned int index) const;
|
||||||
|
};
|
||||||
|
template <int celldim, int dim> class TriaObjectAccessor {
|
||||||
|
Point<dim> & vertex (const unsigned int i) const;
|
||||||
|
Point<dim> barycenter (double, double, double, double, double) const;
|
||||||
|
};
|
||||||
|
template <> Point<3> TriaObjectAccessor<3, 3>::barycenter (double s6, double s7, double s1, double s2, double s3) const
|
||||||
|
{
|
||||||
|
const double x[8] = {
|
||||||
|
vertex(0)(0), vertex(1)(0), vertex(2)(0), vertex(3)(0), vertex(4)(0), vertex(5)(0), vertex(6)(0), vertex(7)(0) };
|
||||||
|
const double y[8] = {
|
||||||
|
vertex(0)(1), vertex(1)(1), vertex(2)(1), vertex(3)(1), vertex(4)(1), vertex(5)(1), vertex(6)(1), vertex(7)(1) };
|
||||||
|
const double z[8] = {
|
||||||
|
vertex(0)(2), vertex(1)(2), vertex(2)(2), vertex(3)(2), vertex(4)(2), vertex(5)(2), vertex(6)(2), vertex(7)(2) };
|
||||||
|
double s4, s5, s8;
|
||||||
|
const double unknown0 = s1*s2;
|
||||||
|
const double unknown1 = s1*s2;
|
||||||
|
s8 = -z[2]*x[1]*y[2]*z[5]+z[2]*y[1]*x[2]*z[5]-z[2]*z[1]*x[2]*y[5]+z[2]*z [1]*x[5]*y[2]+2.0*y[5]*x[7]*z[4]*z[4]-y[1]*x[2]*z[0]*z[0]+x[0]*y[3]*z[7]*z[7] -2.0*z[5]*z[5]*x[4]*y[1]+2.0*z[5]*z[5]*x[1]*y[4]+z[5]*z[5]*x[0]*y[4]-2.0*z[2]*z [2]*x[1]*y[3]+2.0*z[2]*z[2]*x[3]*y[1]-x[0]*y[4]*z[7]*z[7]-y[0]*x[3]*z[7]*z[7]+x [1]*y[0]*z[5]*z[5];
|
||||||
|
s5 = s8+z[2]*x[6]*y[2]*z[5]-z[2]*x[5]*y[2]*z[6]-z[2]*x[2]*y[3]*z[7]-x[2]* y[3]*z[7]*z[7]+2.0*z[2]*x[2]*y[3]*z[1]-z[2]*y[2]*x[3]*z[0]+z[2]*y[2]*x[0]*z[3]- z[2]*x[2]*y[0]*z[3]-z[7]*y[2]*x[7]*z[3]+z[7]*z[2]*x[7]*y[3]+z[7]*x[2]*y[7]*z[3] +z[6]*y[1]*x[2]*z[5]-z[6]*x[1]*y[2]*z[5]+z[5]*x[1]*y[5]*z[2]+s6+s7;
|
||||||
|
s4 = 1/s5;
|
||||||
|
s2 = s3*s4;
|
||||||
|
const double unknown2 = s1*s2;
|
||||||
|
return Point<3> (unknown0, unknown1, unknown2);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-additional-options "-ffast-math" } */
|
||||||
|
|
||||||
|
void metric_carttosphere(int *cctk_lsh, double txz, double tyz, double txx,
|
||||||
|
double tzz, double sint, double cosp, double cost,
|
||||||
|
double tyy, double sinp, double txy, double *grp,
|
||||||
|
double *grq, double *r)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i=0; i<cctk_lsh[0]*cctk_lsh[1]*cctk_lsh[2]; i++)
|
||||||
|
{
|
||||||
|
grq[i] = (cost*tyy*((sinp)*(sinp))*sint+
|
||||||
|
2*cosp*cost*txy*sinp*sint-
|
||||||
|
cost*tzz*sint+
|
||||||
|
((cosp)*(cosp))*cost*txx*sint+
|
||||||
|
2*((cost)*(cost))*tyz*sinp-
|
||||||
|
tyz*sinp+
|
||||||
|
2*cosp*((cost)*(cost))*txz-
|
||||||
|
cosp*txz)*r[i];
|
||||||
|
grp[i] = ((-txy*((sinp)*(sinp))+
|
||||||
|
(cosp*tyy-cosp*txx)*sinp+
|
||||||
|
((cosp)*(cosp))*txy)*sint-
|
||||||
|
cost*txz*sinp+cosp*cost*tyz);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1189,13 +1189,21 @@ zero_one_operation (tree *def, enum tree_code opcode, tree op)
|
||||||
{
|
{
|
||||||
tree name;
|
tree name;
|
||||||
|
|
||||||
if (opcode == MULT_EXPR
|
if (opcode == MULT_EXPR)
|
||||||
&& stmt_is_power_of_op (stmt, op))
|
{
|
||||||
|
if (stmt_is_power_of_op (stmt, op))
|
||||||
{
|
{
|
||||||
if (decrement_power (stmt) == 1)
|
if (decrement_power (stmt) == 1)
|
||||||
propagate_op_to_single_use (op, stmt, def);
|
propagate_op_to_single_use (op, stmt, def);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if (gimple_assign_rhs_code (stmt) == NEGATE_EXPR
|
||||||
|
&& gimple_assign_rhs1 (stmt) == op)
|
||||||
|
{
|
||||||
|
propagate_op_to_single_use (op, stmt, def);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
name = gimple_assign_rhs1 (stmt);
|
name = gimple_assign_rhs1 (stmt);
|
||||||
|
|
||||||
|
|
@ -1213,7 +1221,8 @@ zero_one_operation (tree *def, enum tree_code opcode, tree op)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We might have a multiply of two __builtin_pow* calls, and
|
/* We might have a multiply of two __builtin_pow* calls, and
|
||||||
the operand might be hiding in the rightmost one. */
|
the operand might be hiding in the rightmost one. Likewise
|
||||||
|
this can happen for a negate. */
|
||||||
if (opcode == MULT_EXPR
|
if (opcode == MULT_EXPR
|
||||||
&& gimple_assign_rhs_code (stmt) == opcode
|
&& gimple_assign_rhs_code (stmt) == opcode
|
||||||
&& TREE_CODE (gimple_assign_rhs2 (stmt)) == SSA_NAME
|
&& TREE_CODE (gimple_assign_rhs2 (stmt)) == SSA_NAME
|
||||||
|
|
@ -1226,6 +1235,13 @@ zero_one_operation (tree *def, enum tree_code opcode, tree op)
|
||||||
propagate_op_to_single_use (op, stmt2, def);
|
propagate_op_to_single_use (op, stmt2, def);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if (is_gimple_assign (stmt2)
|
||||||
|
&& gimple_assign_rhs_code (stmt2) == NEGATE_EXPR
|
||||||
|
&& gimple_assign_rhs1 (stmt2) == op)
|
||||||
|
{
|
||||||
|
propagate_op_to_single_use (op, stmt2, def);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Continue walking the chain. */
|
/* Continue walking the chain. */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue