Bug 98213 - [11 Regression] Never ending compilation at -O3 since r11-161-g283cb9ea6293e813
Summary: [11 Regression] Never ending compilation at -O3 since r11-161-g283cb9ea6293e813
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: tree-optimization (show other bugs)
Version: 11.0
: P3 normal
Target Milestone: 11.0
Assignee: Richard Biener
URL:
Keywords: compile-time-hog
Depends on:
Blocks: yarpgen
  Show dependency treegraph
 
Reported: 2020-12-09 10:46 UTC by Martin Liška
Modified: 2021-11-03 05:20 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work: 10.2.0
Known to fail: 11.0
Last reconfirmed: 2020-12-09 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Martin Liška 2020-12-09 10:46:06 UTC
Since the revision, the following code does not terminate. The test-case was given by yarpgen:

$ cat func.cpp
long var_23;
int var_24, test_var_8;
extern bool arr_20[][13];
char arr_21_0_0_0_0_0;
#include <algorithm>
int *test_arr_0;
void test(unsigned long long var_1) {
  int arr_16;
  for (int i_0 = 0;;)
    for (int i_5; i_5;) {
      for (int i_6 = 0; i_6 < 19; i_6 += 4)
        for (long i_7(test_var_8); i_7; i_7 += 2) {
          arr_20[0][i_7] = arr_21_0_0_0_0_0 = 0;
          var_23 = test_arr_0[0];
        }
      var_24 = std::max((unsigned long long)arr_16,
                        std::min((unsigned long long)5, var_1));
    }
}

$ timeout 10 g++ -O3 func.cpp -c
$ echo $?
124
Comment 1 Richard Biener 2020-12-09 12:45:52 UTC
Can you reduce to w/o <algorithm>?
Comment 2 Martin Liška 2020-12-09 13:00:20 UTC
Sure:

long var_23, min___a;
int var_24, test_var_8, test_arr_16;
extern bool arr_20[][13];
char arr_21_0_0_0_0_0;
const unsigned long long &min(unsigned long long &__b) {
  if (__b)
    return __b;
  return min___a;
}
const unsigned long long &max(const unsigned long long &__a,
                              const unsigned long long &__b) {
  if (__b)
    return __b;
  return __a;
}
int *test_arr_0;
unsigned long long test_var_1;
void test() {
  for (;;) {
    for (int i_6 = 0; i_6 < 19; i_6 += 4)
      for (long i_7(test_var_8); i_7; i_7 += 2) {
        arr_20[0][i_7] = arr_21_0_0_0_0_0 = 0;
        var_23 = test_arr_0[0];
      }
    const unsigned long long &__trans_tmp_1 = min(test_var_1);
    var_24 = max(test_arr_16, __trans_tmp_1);
  }
}
Comment 3 Richard Biener 2020-12-09 14:37:17 UTC
OK, so it's "merely" taking a long time (exponential) walking all paths through the CFG.  Meh.

I have a patch fixing this case but will have to think about some more.
Comment 4 GCC Commits 2020-12-09 16:27:33 UTC
The master branch has been updated by Richard Biener <rguenth@gcc.gnu.org>:

https://gcc.gnu.org/g:84d08255f9f2f7137caf648fcc9dc36101bc893c

commit r11-5886-g84d08255f9f2f7137caf648fcc9dc36101bc893c
Author: Richard Biener <rguenther@suse.de>
Date:   Wed Dec 9 15:48:36 2020 +0100

    tree-optimization/98213 - cache PHI walking result in SM
    
    This avoids exponential work when walking PHIs in loop store motion.
    Fails are quickly propagated and thus need no caching.
    
    2020-12-09  Richard Biener  <rguenther@suse.de>
    
            PR tree-optimization/98213
            * tree-ssa-loop-im.c (sm_seq_valid_bb): Cache successfully
            processed PHIs.
            (hoist_memory_references): Adjust.
    
            * g++.dg/pr98213.C: New testcase.
Comment 5 Richard Biener 2020-12-09 16:27:46 UTC
Fixed.