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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
      Known to work|                            |7.3.1
   Target Milestone|---                         |8.3
            Summary|Segfault after const_cast   |[8/9 Regression] Segfault
                   |with "-O2                   |after const_cast with "-O2
                   |-ftree-loop-vectorize" but  |-ftree-loop-vectorize" but
                   |_without_ "-mavx"           |_without_ "-mavx"
      Known to fail|                            |8.2.1

--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
-fno-tree-bit-ccp happens to fix the bug but it looks latent (same bogus
value-range).  Value-ranges appear from DOM and the [1, ...] one first appears
with the
vect pass:

t.C.160t.ifcvt:  # RANGE ~[2147483648, 18446744071562067967]
t.C.160t.ifcvt:  # RANGE [0, 18446744073709551600]
t.C.160t.ifcvt:  # RANGE [-2147483647, 2147483647]
t.C.161t.vect:  # RANGE [1, 2147483647] NONZERO 2147483647
t.C.161t.vect:  # RANGE ~[2147483648, 18446744071562067967]
t.C.161t.vect:  # RANGE [0, 18446744073709551600]
t.C.161t.vect:  # RANGE [-2147483647, 2147483647]
t.C.161t.vect:  # RANGE ~[2147483648, 18446744071562067967]
t.C.161t.vect:  # RANGE [0, 18446744073709551600]
t.C.161t.vect:  # RANGE [-2147483647, 2147483647]

it's set here:

  if (!is_gimple_val (niters_vector))
    {
      var = create_tmp_var (type, "bnd");
      gimple_seq stmts = NULL;
      niters_vector = force_gimple_operand (niters_vector, &stmts, true, var);
      gsi_insert_seq_on_edge_immediate (pe, stmts);
      /* Peeling algorithm guarantees that vector loop bound is at least ONE,
         we set range information to make niters analyzer's life easier.  */
      if (stmts != NULL && log_vf)
        set_range_info (niters_vector, VR_RANGE,
                        wi::to_wide (build_int_cst (type, 1)),
                        wi::to_wide (fold_build2 (RSHIFT_EXPR, type,
                                                  TYPE_MAX_VALUE (type),
                                                  log_vf)));

and the loop is

  <bb 5> [local count: 105119325]:
  niters.0_25 = (unsigned int) n_15;
  ni_gap.1_36 = niters.0_25 + 4294967295;
  # RANGE [1, 2147483647] NONZERO 2147483647
  bnd.2_37 = ni_gap.1_36 >> 1;

  <bb 4> [local count: 567644349]:
  # ivtmp_50 = PHI <ivtmp_51(6), 0(5)>
  ivtmp_51 = ivtmp_50 + 1;
  if (ivtmp_51 >= bnd.2_37)
    goto <bb 12>; [16.67%]
  else
    goto <bb 6>; [83.33%]

  <bb 6> [local count: 473036958]:
  goto <bb 4>; [100.00%]

which looks good according to the comment.  So the number of iterations
_is_ bnd.2_37 - 1 (that number may be zero).

Reply via email to