This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/50672] [4.7 Regression] ice: verify_ssa failed: no immediate_use list
- From: "rguenth at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 10 Oct 2011 10:35:30 +0000
- Subject: [Bug tree-optimization/50672] [4.7 Regression] ice: verify_ssa failed: no immediate_use list
- Auto-submitted: auto-generated
- References: <bug-50672-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50672
Richard Guenther <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
AssignedTo|rguenth at gcc dot gnu.org |tom at codesourcery dot com
--- Comment #8 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-10-10 10:35:30 UTC ---
Err. It's tailmerge ... not mine ;)
More reduced testcase:
typedef int BoxCoordinate;
typedef int BoxDimension;
const BoxDimension X = 0;
const BoxDimension Y = 1;
const BoxDimension NDimensions = 2;
class BoxPoint {
BoxCoordinate point[NDimensions];
public:
bool isValid() const;
void operator += (const BoxPoint& p) {
if (isValid() && p.isValid()) {
point[X] += p.point[X];
}
}
const BoxCoordinate& operator [] (const BoxDimension& dimension) const {
return point[dimension];
}
};
class BoxRegion {
public:
BoxCoordinate& origin(BoxDimension d) const;
BoxCoordinate& space(BoxDimension d) const;
};
inline bool operator <= (const BoxPoint& p, const BoxRegion& r) {
for (BoxDimension d = X;
d <= Y;
d++) if (p[d] < r.origin(d) || p[d] >= r.origin(d) + r.space(d))
return false;
return true;
}
typedef struct _WidgetRec *Widget;
struct GraphGC {
BoxPoint offsetIfSelected;
};
class GraphNode;
class GraphEdge {
public:
GraphNode *from() const;
GraphNode *to() const;
};
class LineGraphEdge: public GraphEdge {
protected:
virtual void drawLine(Widget w, const GraphGC& gc) const;
void _print(const GraphGC &gc) const;
};
class ArcGraphEdge: public LineGraphEdge {
static bool center(const BoxPoint& p1, const BoxPoint& p2,
const BoxPoint& p3, double& x, double& y);
void makeLine(Widget w, const GraphGC& gc) const;
};
class GraphNode {
public:
bool& selected();
GraphEdge *firstTo() const;
GraphEdge *nextTo(GraphEdge *ref) const;
virtual const BoxPoint& pos() const = 0;
virtual const BoxRegion& region(const GraphGC& gc) const = 0;
virtual bool isHint() const;
};
class PosGraphNode: public GraphNode { };
class RegionGraphNode: public PosGraphNode { };
class HintGraphNode: public RegionGraphNode { };
void ArcGraphEdge::makeLine(Widget w, const GraphGC& gc) const {
HintGraphNode *arc_hint = 0;
RegionGraphNode *arc_from = 0;
RegionGraphNode *arc_to = 0;
bool make_arc = true;
if (from()->isHint() && to()->isHint()) {
make_arc = false;
}
else if (from()->isHint() && from()->firstTo() != 0) {
if (arc_hint == 0 || arc_from == 0 || arc_to == 0
|| arc_hint->nextTo(arc_hint->firstTo()) != 0) {
make_arc = false;
}
}
if (!make_arc) {
if (w != 0) LineGraphEdge::drawLine(w, gc);
else LineGraphEdge::_print(gc);
return;
}
BoxPoint pos_from = arc_from->pos();
BoxRegion region_from = arc_from->region(gc);
BoxPoint pos_to = arc_to->pos();
BoxRegion region_to = arc_to->region(gc);
BoxPoint pos_hint = arc_hint->pos();
if (arc_hint->selected()) {
pos_hint += gc.offsetIfSelected;
}
if (pos_hint <= region_from || pos_hint <= region_to) {
return;
}
double cx, cy;
bool ok = center(pos_from, pos_hint, pos_to, cx, cy);
if (!ok) {
if (w != 0) LineGraphEdge::drawLine(w, gc);
else LineGraphEdge::_print(gc);
}
}