diff --git a/SOURCES/gcc8-pr91601.patch b/SOURCES/gcc8-pr91601.patch new file mode 100644 index 0000000..ec058b8 --- /dev/null +++ b/SOURCES/gcc8-pr91601.patch @@ -0,0 +1,54 @@ +2020-03-29 Martin Liska + + Backport from mainline + 2019-09-02 Martin Liska + + PR gcov-profile/91601 + * gcov.c (path_contains_zero_cycle_arc): Rename to ... + (path_contains_zero_or_negative_cycle_arc): ... this and handle + also negative edges. + (circuit): Handle also negative edges as they can happen + in some situations. + +--- gcc/gcov.c ++++ gcc/gcov.c +@@ -653,10 +653,10 @@ unblock (const block_info *u, block_vector_t &blocked, + /* Return true when PATH contains a zero cycle arc count. */ + + static bool +-path_contains_zero_cycle_arc (arc_vector_t &path) ++path_contains_zero_or_negative_cycle_arc (arc_vector_t &path) + { + for (unsigned i = 0; i < path.size (); i++) +- if (path[i]->cs_count == 0) ++ if (path[i]->cs_count <= 0) + return true; + return false; + } +@@ -682,7 +682,7 @@ circuit (block_info *v, arc_vector_t &path, block_info *start, + { + block_info *w = arc->dst; + if (w < start +- || arc->cs_count == 0 ++ || arc->cs_count <= 0 + || !linfo.has_block (w)) + continue; + +@@ -693,7 +693,7 @@ circuit (block_info *v, arc_vector_t &path, block_info *start, + handle_cycle (path, count); + loop_found = true; + } +- else if (!path_contains_zero_cycle_arc (path) ++ else if (!path_contains_zero_or_negative_cycle_arc (path) + && find (blocked.begin (), blocked.end (), w) == blocked.end ()) + loop_found |= circuit (w, path, start, blocked, block_lists, linfo, + count); +@@ -708,7 +708,7 @@ circuit (block_info *v, arc_vector_t &path, block_info *start, + { + block_info *w = arc->dst; + if (w < start +- || arc->cs_count == 0 ++ || arc->cs_count <= 0 + || !linfo.has_block (w)) + continue; + diff --git a/SOURCES/gcc8-pr92775.patch b/SOURCES/gcc8-pr92775.patch new file mode 100644 index 0000000..2a0fa59 --- /dev/null +++ b/SOURCES/gcc8-pr92775.patch @@ -0,0 +1,115 @@ +2020-03-30 Jakub Jelinek + + Backported from mainline + 2019-12-06 Jakub Jelinek + + PR fortran/92775 + * trans.h (struct lang_type, struct lang_decl): Remove span member. + (GFC_DECL_SPAN, GFC_TYPE_ARRAY_SPAN): Remove macros. + * trans-array.h (gfc_get_descriptor_offsets_for_info): Add another + argument. + * trans-array.c (gfc_get_descriptor_offsets_for_info): Add SPAN_OFF + argument and initialize *SPAN_OFF to the offset of span field. + * trans-types.c (gfc_get_array_descr_info): Adjust + gfc_get_descriptor_offsets_for_info caller. Compute elem_size + as base->span instead of TYPE_SIZE_UNIT (etype) constant. + +--- gcc/fortran/trans-array.c ++++ gcc/fortran/trans-array.c +@@ -503,9 +503,10 @@ gfc_conv_shift_descriptor_lbound (stmtblock_t* block, tree desc, + + void + gfc_get_descriptor_offsets_for_info (const_tree desc_type, tree *data_off, +- tree *dtype_off, tree *dim_off, +- tree *dim_size, tree *stride_suboff, +- tree *lower_suboff, tree *upper_suboff) ++ tree *dtype_off, tree *span_off, ++ tree *dim_off, tree *dim_size, ++ tree *stride_suboff, tree *lower_suboff, ++ tree *upper_suboff) + { + tree field; + tree type; +@@ -515,6 +516,8 @@ gfc_get_descriptor_offsets_for_info (const_tree desc_type, tree *data_off, + *data_off = byte_position (field); + field = gfc_advance_chain (TYPE_FIELDS (type), DTYPE_FIELD); + *dtype_off = byte_position (field); ++ field = gfc_advance_chain (TYPE_FIELDS (type), SPAN_FIELD); ++ *span_off = byte_position (field); + field = gfc_advance_chain (TYPE_FIELDS (type), DIMENSION_FIELD); + *dim_off = byte_position (field); + type = TREE_TYPE (TREE_TYPE (field)); +--- gcc/fortran/trans-array.h ++++ gcc/fortran/trans-array.h +@@ -159,7 +159,7 @@ void gfc_trans_array_cobounds (tree, stmtblock_t *, const gfc_symbol *); + + /* Build expressions for accessing components of an array descriptor. */ + void gfc_get_descriptor_offsets_for_info (const_tree, tree *, tree *, tree *, tree *, +- tree *, tree *, tree *); ++ tree *, tree *, tree *, tree *); + + tree gfc_conv_descriptor_data_get (tree); + tree gfc_conv_descriptor_data_addr (tree); +--- gcc/fortran/trans-types.c ++++ gcc/fortran/trans-types.c +@@ -3344,7 +3344,7 @@ gfc_get_array_descr_info (const_tree type, struct array_descr_info *info) + int rank, dim; + bool indirect = false; + tree etype, ptype, t, base_decl; +- tree data_off, dim_off, dtype_off, dim_size, elem_size; ++ tree data_off, span_off, dim_off, dtype_off, dim_size, elem_size; + tree lower_suboff, upper_suboff, stride_suboff; + tree dtype, field, rank_off; + +@@ -3401,12 +3401,13 @@ gfc_get_array_descr_info (const_tree type, struct array_descr_info *info) + if (indirect) + base_decl = build1 (INDIRECT_REF, ptype, base_decl); + +- elem_size = fold_convert (gfc_array_index_type, TYPE_SIZE_UNIT (etype)); +- +- gfc_get_descriptor_offsets_for_info (type, &data_off, &dtype_off, &dim_off, +- &dim_size, &stride_suboff, ++ gfc_get_descriptor_offsets_for_info (type, &data_off, &dtype_off, &span_off, ++ &dim_off, &dim_size, &stride_suboff, + &lower_suboff, &upper_suboff); + ++ t = fold_build_pointer_plus (base_decl, span_off); ++ elem_size = build1 (INDIRECT_REF, gfc_array_index_type, t); ++ + t = base_decl; + if (!integer_zerop (data_off)) + t = fold_build_pointer_plus (t, data_off); +--- gcc/fortran/trans.h ++++ gcc/fortran/trans.h +@@ -953,7 +953,6 @@ struct GTY(()) lang_type { + tree offset; + tree dtype; + tree dataptr_type; +- tree span; + tree base_decl[2]; + tree nonrestricted_type; + tree caf_token; +@@ -969,7 +968,6 @@ struct GTY(()) lang_decl { + address of target label. */ + tree stringlen; + tree addr; +- tree span; + /* For assumed-shape coarrays. */ + tree token, caf_offset; + unsigned int scalar_allocatable : 1; +@@ -979,7 +977,6 @@ struct GTY(()) lang_decl { + + #define GFC_DECL_ASSIGN_ADDR(node) DECL_LANG_SPECIFIC(node)->addr + #define GFC_DECL_STRING_LEN(node) DECL_LANG_SPECIFIC(node)->stringlen +-#define GFC_DECL_SPAN(node) DECL_LANG_SPECIFIC(node)->span + #define GFC_DECL_TOKEN(node) DECL_LANG_SPECIFIC(node)->token + #define GFC_DECL_CAF_OFFSET(node) DECL_LANG_SPECIFIC(node)->caf_offset + #define GFC_DECL_SAVED_DESCRIPTOR(node) \ +@@ -1028,7 +1025,6 @@ struct GTY(()) lang_decl { + #define GFC_TYPE_ARRAY_DTYPE(node) (TYPE_LANG_SPECIFIC(node)->dtype) + #define GFC_TYPE_ARRAY_DATAPTR_TYPE(node) \ + (TYPE_LANG_SPECIFIC(node)->dataptr_type) +-#define GFC_TYPE_ARRAY_SPAN(node) (TYPE_LANG_SPECIFIC(node)->span) + #define GFC_TYPE_ARRAY_BASE_DECL(node, internal) \ + (TYPE_LANG_SPECIFIC(node)->base_decl[(internal)]) + diff --git a/SOURCES/gcc8-pr92950.patch b/SOURCES/gcc8-pr92950.patch new file mode 100644 index 0000000..9116f3d --- /dev/null +++ b/SOURCES/gcc8-pr92950.patch @@ -0,0 +1,72 @@ +Fix PR92950: Wrong code emitted for movv1qi + +The backend emits 16 bit memory loads for single element character +vector. As a result the character will not be right justified in the +GPR. + +2019-12-17 Andreas Krebbel + + Backport from mainline + 2019-12-16 Andreas Krebbel + + PR target/92950 + * config/s390/vector.md ("mov" for V_8): Replace lh, lhy, + and lhrl with llc. + +--- gcc/config/s390/vector.md ++++ gcc/config/s390/vector.md +@@ -289,9 +289,9 @@ + ; However, this would probably be slower. + + (define_insn "mov" +- [(set (match_operand:V_8 0 "nonimmediate_operand" "=v,v,d,v,R, v, v, v, v,d, Q, S, Q, S, d, d,d,d,d,R,T") +- (match_operand:V_8 1 "general_operand" " v,d,v,R,v,j00,jm1,jyy,jxx,d,j00,j00,jm1,jm1,j00,jm1,R,T,b,d,d"))] +- "" ++ [(set (match_operand:V_8 0 "nonimmediate_operand" "=v,v,d,v,R, v, v, v, v,d, Q, S, Q, S, d, d,d,R,T") ++ (match_operand:V_8 1 "general_operand" " v,d,v,R,v,j00,jm1,jyy,jxx,d,j00,j00,jm1,jm1,j00,jm1,T,d,d"))] ++ "TARGET_VX" + "@ + vlr\t%v0,%v1 + vlvgb\t%v0,%1,0 +@@ -309,12 +309,10 @@ + mviy\t%0,-1 + lhi\t%0,0 + lhi\t%0,-1 +- lh\t%0,%1 +- lhy\t%0,%1 +- lhrl\t%0,%1 ++ llc\t%0,%1 + stc\t%1,%0 + stcy\t%1,%0" +- [(set_attr "op_type" "VRR,VRS,VRS,VRX,VRX,VRI,VRI,VRI,VRI,RR,SI,SIY,SI,SIY,RI,RI,RX,RXY,RIL,RX,RXY")]) ++ [(set_attr "op_type" "VRR,VRS,VRS,VRX,VRX,VRI,VRI,VRI,VRI,RR,SI,SIY,SI,SIY,RI,RI,RXY,RX,RXY")]) + + (define_insn "mov" + [(set (match_operand:V_16 0 "nonimmediate_operand" "=v,v,d,v,R, v, v, v, v,d, Q, Q, d, d,d,d,d,R,T,b") +--- /dev/null ++++ gcc/testsuite/gcc.target/s390/vector/pr92950.c +@@ -0,0 +1,24 @@ ++/* { dg-do run } */ ++/* { dg-options "-O3 -mzarch -march=z13" } */ ++ ++struct a { ++ int b; ++ char c; ++}; ++struct a d = {1, 16}; ++struct a *e = &d; ++ ++int f = 0; ++ ++int main() { ++ struct a g = {0, 0 }; ++ f = 0; ++ ++ for (; f <= 1; f++) { ++ g = d; ++ *e = g; ++ } ++ ++ if (d.c != 16) ++ __builtin_abort(); ++} diff --git a/SPECS/gcc.spec b/SPECS/gcc.spec index 0f385fc..3aaeb83 100644 --- a/SPECS/gcc.spec +++ b/SPECS/gcc.spec @@ -104,7 +104,7 @@ Summary: Various compilers (C, C++, Objective-C, ...) Name: gcc Version: %{gcc_version} -Release: %{gcc_release}%{?dist} +Release: %{gcc_release}.1%{?dist} # libgcc, libgfortran, libgomp, libstdc++ and crtstuff have # GCC Runtime Exception. License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD @@ -272,6 +272,9 @@ Patch15: gcc8-rh1670535.patch Patch17: gcc8-libgomp-20190503.patch Patch18: gcc8-pr86747.patch Patch19: gcc8-libgomp-testsuite.patch +Patch20: gcc8-pr91601.patch +Patch21: gcc8-pr92775.patch +Patch22: gcc8-pr92950.patch Patch30: gcc8-rh1668903-1.patch Patch31: gcc8-rh1668903-2.patch @@ -849,6 +852,9 @@ to NVidia PTX capable devices if available. %patch17 -p0 -b .libgomp-20190503~ %patch18 -p0 -b .pr86747~ %patch19 -p0 -b .libgomp-testsuite~ +%patch20 -p0 -b .pr91601~ +%patch21 -p0 -b .pr92775~ +%patch22 -p0 -b .pr92950~ %patch30 -p0 -b .rh1668903-1~ %patch31 -p0 -b .rh1668903-2~ @@ -3165,6 +3171,12 @@ fi %endif %changelog +* Tue May 12 2020 Marek Polacek 8.3.1-5.1 +- consider negative edges in cycle detection (#1817991, PR gcov-profile/91601) +- fix Fortran debug info for arrays with descriptors (#1655624, + PR fortran/92775) +- fix wrong code emitted for movv1qi on s390x (#1784758, PR target/92950) + * Thu Nov 21 2019 Marek Polacek 8.3.1-5 - update from Fedora gcc-8.3.1-5 (#1747157) - use unspec_volatile for darn (PR target/91481, #1760205, CVE-2019-15847)