https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61289
Bug ID: 61289
Summary: Bad jump threading generates infinite loop
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: xinliangli at gmail dot com
Build the following program with -fno-exceptions -O2, the program aborts at
runtime.
Adding -fno-tree-dominator-opts, the program runs fine.
To trigger the problem, the first iteration needs to return list == new_list
--> the code will then get into the cloned path which is actually an infinite
loop.
(the toy program does something nonsense, but it should finish without
aborting).
jpthread.h
---------
struct MyList {
inline int LastHit () const { return last_; }
// inline int FirstHit () const { return last_-1; }
MyList* PushBack(int);
// MyList* PushFront(int);
void Destroy();
static MyList* Create(int);
MyList(int i): last_(i) {}
void PopBack();
int last_;
};
jpthread.cc
------------
#include "jpthread.h"
void test ()
{
MyList *list = MyList::Create(20);
for (int i = 0; i < 2; ) {
MyList* new_list = list->PushBack(
list->LastHit() + 10);
if (new_list != list) {
list->Destroy();
list = new_list;
++i;
}
}
list->Destroy();
}
int main()
{
test();
}
m.cc
-----
#include <stdlib.h>
#include <stdio.h>
#include "jpthread.h"
int cnt = 0;
MyList *prev = 0;
MyList* MyList::PushBack(int i)
{
cnt ++;
if (cnt == 1)
return prev;
if (cnt > 3) {
fprintf (stderr, "Loop not ending, aborting ..\n");
abort ();
}
prev = this;
return new MyList(i+last_);
}
MyList* MyList::Create(int i)
{
prev = new MyList(i);
return prev;
}
void MyList::Destroy() {
delete this;
}