[Bug tree-optimization/99777] [11 Regression] ICE in build2, at tree.c:4869 with -O3

2021-04-22 Thread cvs-commit at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99777

--- Comment #8 from CVS Commits  ---
The releases/gcc-8 branch has been updated by Jakub Jelinek
:

https://gcc.gnu.org/g:1ee66d06f25d5bf14e2f3b599fc391dc3d532722

commit r8-10902-g1ee66d06f25d5bf14e2f3b599fc391dc3d532722
Author: Jakub Jelinek 
Date:   Mon Mar 29 12:35:32 2021 +0200

fold-const: Fix ICE in extract_muldiv_1 [PR99777]

extract_muldiv{,_1} is apparently only prepared to handle scalar integer
operations, the callers ensure it by only calling it if the divisor or
one of the multiplicands is INTEGER_CST and because neither multiplication
nor division nor modulo are really supported e.g. for pointer types,
nullptr
type etc.  But the CASE_CONVERT handling doesn't really check if it isn't
a cast from some other type kind, so on the testcase we end up trying to
build MULT_EXPR in POINTER_TYPE which ICEs.  A few years ago Marek has
added ANY_INTEGRAL_TYPE_P checks to two spots, but the code uses
TYPE_PRECISION which means something completely different for vector types,
etc.
So IMNSHO we should just punt on conversions from non-integrals or
non-scalar integrals.

2021-03-29  Jakub Jelinek  

PR tree-optimization/99777
* fold-const.c (extract_muldiv_1): For conversions, punt on casts
from
types other than scalar integral types.

* g++.dg/torture/pr99777.C: New test.

(cherry picked from commit afe9a630eae114665e77402ea083201c9d406e99)

[Bug tree-optimization/99777] [11 Regression] ICE in build2, at tree.c:4869 with -O3

2021-04-20 Thread cvs-commit at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99777

--- Comment #7 from CVS Commits  ---
The releases/gcc-9 branch has been updated by Jakub Jelinek
:

https://gcc.gnu.org/g:a784483132fd7f3830b96e5a606d8eeb8f64e5ce

commit r9-9439-ga784483132fd7f3830b96e5a606d8eeb8f64e5ce
Author: Jakub Jelinek 
Date:   Mon Mar 29 12:35:32 2021 +0200

fold-const: Fix ICE in extract_muldiv_1 [PR99777]

extract_muldiv{,_1} is apparently only prepared to handle scalar integer
operations, the callers ensure it by only calling it if the divisor or
one of the multiplicands is INTEGER_CST and because neither multiplication
nor division nor modulo are really supported e.g. for pointer types,
nullptr
type etc.  But the CASE_CONVERT handling doesn't really check if it isn't
a cast from some other type kind, so on the testcase we end up trying to
build MULT_EXPR in POINTER_TYPE which ICEs.  A few years ago Marek has
added ANY_INTEGRAL_TYPE_P checks to two spots, but the code uses
TYPE_PRECISION which means something completely different for vector types,
etc.
So IMNSHO we should just punt on conversions from non-integrals or
non-scalar integrals.

2021-03-29  Jakub Jelinek  

PR tree-optimization/99777
* fold-const.c (extract_muldiv_1): For conversions, punt on casts
from
types other than scalar integral types.

* g++.dg/torture/pr99777.C: New test.

(cherry picked from commit afe9a630eae114665e77402ea083201c9d406e99)

[Bug tree-optimization/99777] [11 Regression] ICE in build2, at tree.c:4869 with -O3

2021-03-30 Thread cvs-commit at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99777

--- Comment #6 from CVS Commits  ---
The releases/gcc-10 branch has been updated by Jakub Jelinek
:

https://gcc.gnu.org/g:afe9a630eae114665e77402ea083201c9d406e99

commit r10-9625-gafe9a630eae114665e77402ea083201c9d406e99
Author: Jakub Jelinek 
Date:   Mon Mar 29 12:35:32 2021 +0200

fold-const: Fix ICE in extract_muldiv_1 [PR99777]

extract_muldiv{,_1} is apparently only prepared to handle scalar integer
operations, the callers ensure it by only calling it if the divisor or
one of the multiplicands is INTEGER_CST and because neither multiplication
nor division nor modulo are really supported e.g. for pointer types,
nullptr
type etc.  But the CASE_CONVERT handling doesn't really check if it isn't
a cast from some other type kind, so on the testcase we end up trying to
build MULT_EXPR in POINTER_TYPE which ICEs.  A few years ago Marek has
added ANY_INTEGRAL_TYPE_P checks to two spots, but the code uses
TYPE_PRECISION which means something completely different for vector types,
etc.
So IMNSHO we should just punt on conversions from non-integrals or
non-scalar integrals.

2021-03-29  Jakub Jelinek  

PR tree-optimization/99777
* fold-const.c (extract_muldiv_1): For conversions, punt on casts
from
types other than scalar integral types.

* g++.dg/torture/pr99777.C: New test.

[Bug tree-optimization/99777] [11 Regression] ICE in build2, at tree.c:4869 with -O3

2021-03-29 Thread jakub at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99777

Jakub Jelinek  changed:

   What|Removed |Added

 Status|ASSIGNED|RESOLVED
 Resolution|--- |FIXED

--- Comment #5 from Jakub Jelinek  ---
Fixed.

[Bug tree-optimization/99777] [11 Regression] ICE in build2, at tree.c:4869 with -O3

2021-03-29 Thread cvs-commit at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99777

--- Comment #4 from CVS Commits  ---
The master branch has been updated by Jakub Jelinek :

https://gcc.gnu.org/g:25e515d2199d555848dfba01fd5364df94096496

commit r11-7887-g25e515d2199d555848dfba01fd5364df94096496
Author: Jakub Jelinek 
Date:   Mon Mar 29 12:35:32 2021 +0200

fold-const: Fix ICE in extract_muldiv_1 [PR99777]

extract_muldiv{,_1} is apparently only prepared to handle scalar integer
operations, the callers ensure it by only calling it if the divisor or
one of the multiplicands is INTEGER_CST and because neither multiplication
nor division nor modulo are really supported e.g. for pointer types,
nullptr
type etc.  But the CASE_CONVERT handling doesn't really check if it isn't
a cast from some other type kind, so on the testcase we end up trying to
build MULT_EXPR in POINTER_TYPE which ICEs.  A few years ago Marek has
added ANY_INTEGRAL_TYPE_P checks to two spots, but the code uses
TYPE_PRECISION which means something completely different for vector types,
etc.
So IMNSHO we should just punt on conversions from non-integrals or
non-scalar integrals.

2021-03-29  Jakub Jelinek  

PR tree-optimization/99777
* fold-const.c (extract_muldiv_1): For conversions, punt on casts
from
types other than scalar integral types.

* g++.dg/torture/pr99777.C: New test.

[Bug tree-optimization/99777] [11 Regression] ICE in build2, at tree.c:4869 with -O3

2021-03-26 Thread jakub at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99777

--- Comment #3 from Jakub Jelinek  ---
So, one thing is that tree-affine.c during store motion alias analysis feeds
very questionable expressions to the folder, in particular it attempts to fold
MULT_EXPR of (sizetype) (vector(4) short int *) ((int) ivtmp.46_14 * 3)
where ivtmp.46_14 is unsigned int, and (sizetype) -1.
Note e.g. the cast from int to pointer of different size, or pointer back to
sizetype.

And another thing is that extract_muldiv{,_1} really relies on integral types
only, is called when the divisor or second multiplication operand is
INTEGER_CST and the multiplication/division aren't defined for other types that
represent
constants as INTEGER_CST (e.g. pointers, NULLPTR_TYPE etc.).  Vector types
really should use VECTOR_CSTs...

The ICE can be fixed with:
--- gcc/fold-const.c.jj 2021-03-25 13:41:55.0 +0100
+++ gcc/fold-const.c2021-03-26 11:51:57.901091895 +0100
@@ -6713,6 +6713,8 @@ extract_muldiv_1 (tree t, tree c, enum t
   break;

 CASE_CONVERT: case NON_LVALUE_EXPR:
+  if (!INTEGRAL_TYPE_P (TREE_TYPE (op0)))
+   break;
   /* If op0 is an expression ...  */
   if ((COMPARISON_CLASS_P (op0)
   || UNARY_CLASS_P (op0)
@@ -6721,8 +6723,7 @@ extract_muldiv_1 (tree t, tree c, enum t
   || EXPRESSION_CLASS_P (op0))
  /* ... and has wrapping overflow, and its type is smaller
 than ctype, then we cannot pass through as widening.  */
- && (((ANY_INTEGRAL_TYPE_P (TREE_TYPE (op0))
-   && TYPE_OVERFLOW_WRAPS (TREE_TYPE (op0)))
+ && ((TYPE_OVERFLOW_WRAPS (TREE_TYPE (op0))
   && (TYPE_PRECISION (ctype)
   > TYPE_PRECISION (TREE_TYPE (op0
  /* ... or this is a truncation (t is narrower than op0),
@@ -6737,8 +6738,7 @@ extract_muldiv_1 (tree t, tree c, enum t
  /* ... or has undefined overflow while the converted to
 type has not, we cannot do the operation in the inner type
 as that would introduce undefined overflow.  */
- || ((ANY_INTEGRAL_TYPE_P (TREE_TYPE (op0))
-  && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0)))
+ || (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0))
  && !TYPE_OVERFLOW_UNDEFINED (type
break;

[Bug tree-optimization/99777] [11 Regression] ICE in build2, at tree.c:4869 with -O3

2021-03-25 Thread jakub at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99777

Jakub Jelinek  changed:

   What|Removed |Added

 Status|NEW |ASSIGNED
   Assignee|unassigned at gcc dot gnu.org  |jakub at gcc dot gnu.org

--- Comment #2 from Jakub Jelinek  ---
Seems to be a fold-const.c bug.

[Bug tree-optimization/99777] [11 Regression] ICE in build2, at tree.c:4869 with -O3

2021-03-25 Thread jakub at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99777

Jakub Jelinek  changed:

   What|Removed |Added

 Status|UNCONFIRMED |NEW
   Target Milestone|--- |11.0
Summary|ICE in build2, at   |[11 Regression] ICE in
   |tree.c:4869 with -O3|build2, at tree.c:4869 with
   ||-O3
 CC||jakub at gcc dot gnu.org
   Priority|P3  |P1
 Ever confirmed|0   |1
   Last reconfirmed||2021-03-25

--- Comment #1 from Jakub Jelinek  ---
Started with r11-3705-gdae673abd37d400408959497e50fe1f3fbef5533
Testcase without any includes:

template
constexpr inline const T&
min(const T& a, const T& b) { if (b < a) return b; return a; }
template
constexpr inline const T&
max(const T& a, const T& b) { if (a < b) return b; return a; }
extern int var_142;
extern int a, c;
long h;
unsigned long long e;
signed char d;
extern short arr_323[][7][5][30];

void test(long long b, short f[][17][25][22][20])
{
  for (char i = 0; i < 7; i += 3)
for (unsigned char l = e; l < 5; l += 2) {
  if (max(0LL, min(7LL, b)))
for (bool j = 0; j < 1; j = b) {
  for (unsigned k = d; k < 20; k++)
h = f[0][i][l][b][k];
  for (int m = 0; m < 5; m++)
arr_323[c][i][l][m] = 0;
}
  for (int n = 0; n < 4; n += a)
var_142 = n;
}
}