re PR tree-optimization/82549 (ICE at -O1 and above: verify_gimple failed)

PR tree-optimization/82549
	* fold-const.c (optimize_bit_field_compare, fold_truth_andor_1):
	Formatting fixes.  Instead of calling make_bit_field_ref with negative
	bitpos return 0.

	* gcc.c-torture/compile/pr82549.c: New test.

From-SVN: r253816
This commit is contained in:
Jakub Jelinek 2017-10-17 16:47:15 +02:00
parent 7ea6f14bdc
commit 0c2ff9c396
4 changed files with 64 additions and 31 deletions

View File

@ -1,3 +1,10 @@
2017-10-17 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/82549
* fold-const.c (optimize_bit_field_compare, fold_truth_andor_1):
Formatting fixes. Instead of calling make_bit_field_ref with negative
bitpos return 0.
2017-10-13 Jakub Jelinek <jakub@redhat.com>
PR target/82274

View File

@ -4040,21 +4040,20 @@ optimize_bit_field_compare (location_t loc, enum tree_code code,
size_int (nbitsize - lbitsize - lbitpos));
if (! const_p)
/* If not comparing with constant, just rework the comparison
and return. */
return fold_build2_loc (loc, code, compare_type,
fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
make_bit_field_ref (loc, linner, lhs,
unsigned_type,
nbitsize, nbitpos,
1, lreversep),
mask),
fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type,
make_bit_field_ref (loc, rinner, rhs,
unsigned_type,
nbitsize, nbitpos,
1, rreversep),
mask));
{
if (nbitpos < 0)
return 0;
/* If not comparing with constant, just rework the comparison
and return. */
tree t1 = make_bit_field_ref (loc, linner, lhs, unsigned_type,
nbitsize, nbitpos, 1, lreversep);
t1 = fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type, t1, mask);
tree t2 = make_bit_field_ref (loc, rinner, rhs, unsigned_type,
nbitsize, nbitpos, 1, rreversep);
t2 = fold_build2_loc (loc, BIT_AND_EXPR, unsigned_type, t2, mask);
return fold_build2_loc (loc, code, compare_type, t1, t2);
}
/* Otherwise, we are handling the constant case. See if the constant is too
big for the field. Warn and return a tree for 0 (false) if so. We do
@ -4085,6 +4084,9 @@ optimize_bit_field_compare (location_t loc, enum tree_code code,
}
}
if (nbitpos < 0)
return 0;
/* Single-bit compares should always be against zero. */
if (lbitsize == 1 && ! integer_zerop (rhs))
{
@ -5858,7 +5860,10 @@ fold_truth_andor_1 (location_t loc, enum tree_code code, tree truth_type,
results. */
ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask);
lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask);
if (lnbitsize == rnbitsize && xll_bitpos == xlr_bitpos)
if (lnbitsize == rnbitsize
&& xll_bitpos == xlr_bitpos
&& lnbitpos >= 0
&& rnbitpos >= 0)
{
lhs = make_bit_field_ref (loc, ll_inner, ll_arg,
lntype, lnbitsize, lnbitpos,
@ -5882,10 +5887,14 @@ fold_truth_andor_1 (location_t loc, enum tree_code code, tree truth_type,
Note that we still must mask the lhs/rhs expressions. Furthermore,
the mask must be shifted to account for the shift done by
make_bit_field_ref. */
if ((ll_bitsize + ll_bitpos == rl_bitpos
&& lr_bitsize + lr_bitpos == rr_bitpos)
|| (ll_bitpos == rl_bitpos + rl_bitsize
&& lr_bitpos == rr_bitpos + rr_bitsize))
if (((ll_bitsize + ll_bitpos == rl_bitpos
&& lr_bitsize + lr_bitpos == rr_bitpos)
|| (ll_bitpos == rl_bitpos + rl_bitsize
&& lr_bitpos == rr_bitpos + rr_bitsize))
&& ll_bitpos >= 0
&& rl_bitpos >= 0
&& lr_bitpos >= 0
&& rr_bitpos >= 0)
{
tree type;
@ -5954,6 +5963,9 @@ fold_truth_andor_1 (location_t loc, enum tree_code code, tree truth_type,
}
}
if (lnbitpos < 0)
return 0;
/* Construct the expression we will return. First get the component
reference we will make. Unless the mask is all ones the width of
that field, perform the mask operation. Then compare with the

View File

@ -1,26 +1,31 @@
2017-10-17 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/82549
* gcc.c-torture/compile/pr82549.c: New test.
2017-10-16 Paul Thomas <pault@gcc.gnu.org>
PR fortran/78512
* gfortran.dg/associate_9.f03 : Remove XFAIL.
* gfortran.dg/associate_26.f90 : New test.
* gfortran.dg/associate_9.f03: Remove XFAIL.
* gfortran.dg/associate_26.f90: New test.
PR fortran/80120
* gfortran.dg/associate_27.f90 : New test.
* gfortran.dg/associate_27.f90: New test.
PR fortran/81903
* gfortran.dg/associate_28.f90 : New test.
* gfortran.dg/associate_28.f90: New test.
PR fortran/82121
* gfortran.dg/associate_29.f90 : New test.
* gfortran.dg/associate_29.f90: New test.
PR fortran/67543
* gfortran.dg/associate_30.f90 : New test.
* gfortran.dg/associate_30.f90: New test.
2017-10-16 Paul Thomas <pault@gcc.gnu.org>
Backport from trunk
PR fortran/81048
* gfortran.dg/derived_init_4.f90 : New test.
* gfortran.dg/derived_init_4.f90: New test.
2017-10-13 Jakub Jelinek <jakub@redhat.com>
@ -2762,7 +2767,7 @@
PR fortran/80156
PR fortran/79382
* gfortran.dg/dtio_23.f90 : Remove the dg-error and add the
* gfortran.dg/dtio_23.f90: Remove the dg-error and add the
testcase for PR80156. Add a main programme that tests that
the typebound generic is accessible.
@ -3098,13 +3103,13 @@
2017-03-18 Paul Thomas <pault@gcc.gnu.org>
PR fortran/79676
* gfortran.dg/submodule_28.f08 : New test.
* gfortran.dg/submodule_28.f08: New test.
2017-03-18 Paul Thomas <pault@gcc.gnu.org>
PR fortran/71838
* gfortran.dg/submodule_26.f08 : New test.
* gfortran.dg/submodule_27.f08 : New test.
* gfortran.dg/submodule_26.f08: New test.
* gfortran.dg/submodule_27.f08: New test.
2017-03-17 Pat Haugen <pthaugen@us.ibm.com>

View File

@ -0,0 +1,9 @@
/* PR tree-optimization/82549 */
int a, b[1];
int
main ()
{
return !a || b[-2] || b[-2];
}