https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101769

            Bug ID: 101769
           Summary: loop->finite_p is not always true for some loops even
                    with -ffinite-loops being used
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: enhancement
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
  Target Milestone: ---

Take the following C++ testcase:
struct Node
{
        Node*   right;
        Node*   down;
};

inline
void free_node(Node*)
{
}

void free_all(Node* n_)
{
        if (n_ == nullptr) {
                return;
        }
        free_all(n_->right);
        do {
                Node* t = n_->down;
                free_node(n_);
                n_ = t;
        } while (n_);
}

void free_all2_r(Node* n_)
{
        if (n_->right) {
                free_all2_r(n_->right);
        }
        do {
                Node* t = n_->down;
                free_node(n_);
                n_ = t;
        } while (n_);
}

void free_all2(Node* n_)
{
        if (n_) {
                free_all2_r(n_);
        }
}

void loop(Node* n_)
{
        do {
                n_ = n_->down;
        } while (n_);
}

int main()
{
        return 0;
}
---- CUT -----
These all should be empty functions at -O2 -ffinite-loops but currently
free_all, free_all2_r, and free_all2 produce empty loops around the element.

loop is able to do the right thing.
What seems to be happening is loop->finite_p being lost somewhere.

Reply via email to