aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2021-12-20 11:00:50 +0100
committerMartin Liska <mliska@suse.cz>2021-12-20 11:00:50 +0100
commit303634cc437784660b59f96b7ab9d4d52acf7dc3 (patch)
treee2949a253192c834e5fdc3be5ec7a01aa3a34f82 /gcc
parenta29aa2eafa30efffed38b14fcbad9513c5dd2590 (diff)
parent8d1e342b4afbad77cb92f8057cf6d1e996bfb077 (diff)
downloadgcc-303634cc437784660b59f96b7ab9d4d52acf7dc3.zip
gcc-303634cc437784660b59f96b7ab9d4d52acf7dc3.tar.gz
gcc-303634cc437784660b59f96b7ab9d4d52acf7dc3.tar.bz2
Merge branch 'master' into devel/sphinx
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog184
-rw-r--r--gcc/DATESTAMP2
-rw-r--r--gcc/attribs.c28
-rw-r--r--gcc/attribs.h2
-rw-r--r--gcc/c-family/ChangeLog5
-rw-r--r--gcc/c/ChangeLog8
-rw-r--r--gcc/c/c-decl.c2
-rw-r--r--gcc/c/c-parser.c4
-rw-r--r--gcc/common.opt4
-rw-r--r--gcc/config.gcc4
-rw-r--r--gcc/config/darwin-driver.c6
-rw-r--r--gcc/config/i386/i386.md49
-rw-r--r--gcc/config/i386/sse.md16
-rw-r--r--gcc/config/rs6000/rs6000-builtins.def12
-rw-r--r--gcc/config/rs6000/rs6000-call.c6
-rw-r--r--gcc/config/rs6000/rs6000-overload.def2
-rw-r--r--gcc/config/rs6000/rs6000.md47
-rwxr-xr-xgcc/configure2
-rw-r--r--gcc/configure.ac2
-rw-r--r--gcc/cp/ChangeLog66
-rw-r--r--gcc/cp/constraint.cc4
-rw-r--r--gcc/cp/coroutines.cc16
-rw-r--r--gcc/cp/decl.c10
-rw-r--r--gcc/cp/lambda.c9
-rw-r--r--gcc/cp/module.cc5
-rw-r--r--gcc/cp/parser.c6
-rw-r--r--gcc/cp/pt.c7
-rw-r--r--gcc/doc/invoke.texi9
-rw-r--r--gcc/fortran/ChangeLog5
-rw-r--r--gcc/fortran/check.c3
-rw-r--r--gcc/ipa-modref.c62
-rw-r--r--gcc/lto-wrapper.c7
-rw-r--r--gcc/optc-save-gen.awk2
-rw-r--r--gcc/opts.c10
-rw-r--r--gcc/print-tree.c2
-rw-r--r--gcc/testsuite/ChangeLog157
-rw-r--r--gcc/testsuite/c-c++-common/Wno-attributes-6.c16
-rw-r--r--gcc/testsuite/g++.dg/coroutines/pr100127.C65
-rw-r--r--gcc/testsuite/g++.dg/coroutines/pr100772-a.C77
-rw-r--r--gcc/testsuite/g++.dg/coroutines/pr100772-b.C93
-rw-r--r--gcc/testsuite/g++.dg/coroutines/pr96517.C29
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested9a.C42
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/concepts-uneval5.C17
-rw-r--r--gcc/testsuite/g++.dg/diagnostic/redeclaration-2.C19
-rw-r--r--gcc/testsuite/g++.dg/template/redecl4.C2
-rw-r--r--gcc/testsuite/g++.dg/torture/pr103669.C22
-rw-r--r--gcc/testsuite/gcc.dg/darwin-minversion-link.c3
-rw-r--r--gcc/testsuite/gcc.dg/pr100509.c1
-rw-r--r--gcc/testsuite/gcc.dg/pragma-diag-10.c3
-rw-r--r--gcc/testsuite/gcc.dg/uninit-pr89230-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr103744-1.c20
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr103744-2.c31
-rw-r--r--gcc/testsuite/gcc.target/i386/pr103611-2.c43
-rw-r--r--gcc/testsuite/gcc.target/i386/pr32803.c10
-rw-r--r--gcc/testsuite/gcc.target/i386/pr98468.c35
-rw-r--r--gcc/testsuite/gcc.target/powerpc/darn-0.c2
-rw-r--r--gcc/testsuite/gcc.target/powerpc/darn-1.c5
-rw-r--r--gcc/testsuite/gcc.target/powerpc/darn-2.c5
-rw-r--r--gcc/testsuite/gcc.target/powerpc/darn-3.c2
-rw-r--r--gcc/testsuite/gcc.target/powerpc/fold-vec-insert-float-p9.c4
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr97142.c2
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pragma-optimize.c1
-rw-r--r--gcc/testsuite/gfortran.dg/illegal_boz_arg_2.f906
-rw-r--r--gcc/testsuite/obj-c++.dg/cxx-ivars-3.mm2
-rw-r--r--gcc/testsuite/obj-c++.dg/objc-gc-3.mm2
-rw-r--r--gcc/testsuite/objc.dg/objc-gc-4.m2
-rw-r--r--gcc/tree-core.h4
-rw-r--r--gcc/tree-object-size.c27
-rw-r--r--gcc/tree-ssa-phiopt.c4
-rw-r--r--gcc/tree-vect-stmts.c6
70 files changed, 1248 insertions, 123 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 02e8f71..5ab864a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,187 @@
+2021-12-19 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/103766
+ * ipa-modref.c (modref_merge_call_site_flags): Fix early exit condition
+
+2021-12-19 Patrick Palka <ppalka@redhat.com>
+
+ * print-tree.c (print_node) <case tcc_declaration>: Dump
+ DECL_LANG_FLAG_8.
+
+2021-12-19 Andrew Pinski <apinski@marvell.com>
+
+ * tree-ssa-phiopt.c (gimple_simplify_phiopt): Annotate the
+ new sequence with the location of the conditional statement.
+
+2021-12-18 Roger Sayle <roger@nextmovesoftware.com>
+ Uroš Bizjak <ubizjak@gmail.com>
+
+ PR target/103611
+ * config/i386/i386.md (any_or_plus): New code iterator.
+ (define_split): Split (HI<<32)|zext(LO) into piece-wise
+ move instructions on !TARGET_64BIT.
+ * config/i386/sse.md (*vec_extractv4si_0_zext_sse4):
+ Restrict to TARGET_64BIT.
+
+2021-12-18 Roger Sayle <roger@nextmovesoftware.com>
+
+ PR target/32803
+ * common.opt (Oz): New command line option.
+ * doc/invoke.texi: Document the new -Oz option.
+ * lto-wrapper.c (merge_and_complain, append_compiler_options):
+ Treat OPT_Oz as synonymous with OPT_Os.
+ * optc-save-gen.awk: Increase maximum value of optimize_size to 2.
+ * opts.c (default_options_optimization) [OPT_Oz]: Handle OPT_Oz
+ just like OPT_Os, except set opt->x_optimize_size to 2.
+ (common_handle_option): Skip OPT_Oz just like OPT_Os.
+ * config/i386/i386.md (*movdi_internal): Use a push/pop sequence
+ for suitable SImode TYPE_IMOV moves when optimize_size > 1.
+ (*movsi_internal): Likewise.
+
+2021-12-18 Siddhesh Poyarekar <siddhesh@gotplt.org>
+
+ PR tree-optimization/103759
+ * tree-object-size.c (unknown, initval): Remove functions.
+ (size_unknown, size_initval, size_unknown_p): Operate directly
+ on trees.
+
+2021-12-18 François-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ * config/darwin-driver.c: Make version code more future-proof.
+ * config.gcc: Homogeneize darwin versions.
+ * configure.ac: Homogeneize darwin versions.
+ * configure: Regenerate.
+
+2021-12-17 Marek Polacek <polacek@redhat.com>
+
+ PR c/103649
+ * attribs.c (handle_ignored_attributes_option): Create the fake
+ attribute with max_length == -2.
+ (attribute_ignored_p): New overloads.
+ * attribs.h (attribute_ignored_p): Declare them.
+ * tree-core.h (struct attribute_spec): Document that max_length
+ can be -2.
+
+2021-12-17 Segher Boessenkool <segher@kernel.crashing.org>
+
+ PR target/103624
+ * config/rs6000/rs6000-builtins.def (__builtin_darn): Expand to
+ darn_64_di. Add {32bit} attribute. Return long.
+ (__builtin_darn_32): Expand to darn_32_di. Add {32bit} attribute.
+ Return long.
+ (__builtin_darn_raw): Expand to darn_raw_di. Add {32bit} attribute.
+ Return long.
+ * config/rs6000/rs6000-call.c (rs6000_expand_builtin): Expand the darn
+ builtins to the _si variants for -m32.
+ * config/rs6000/rs6000.md (UNSPECV_DARN_32, UNSPECV_DARN_RAW): Delete.
+ (UNSPECV_DARN): Update comment.
+ (darn_32, darn_raw, darn): Delete.
+ (darn_32_<mode>, darn_64_<mode>, darn_raw_<mode> for GPR): New.
+ (@darn<mode> for GPR): New.
+
+2021-12-17 Bill Schmidt <wschmidt@linux.ibm.com>
+
+ * config/rs6000/rs6000-overload.def (__builtin_vec_promote): Add second
+ argument.
+
+2021-12-17 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR tree-optimization/103744
+ * tree-vect-stmts.c (vectorizable_load): Handle multi-vector
+ SLP gather loads.
+
+2021-12-17 Martin Liska <mliska@suse.cz>
+
+ * doc/invoke.texi: Rename to -fstack-protector.
+
+2021-12-17 Martin Liska <mliska@suse.cz>
+
+ * doc/invoke.texi: Fix spelling issues.
+
+2021-12-17 Tamar Christina <tamar.christina@arm.com>
+
+ PR tree-optimization/103741
+ * tree-vect-stmts.c (vectorizable_operation): Check for boolean.
+
+2021-12-17 Iain Sandoe <iain@sandoe.co.uk>
+
+ * config/darwin-driver.c (darwin_driver_init): Exit from the
+ option handling early if the command line is definitely enpty.
+ * config/darwin.h (SUBTARGET_DRIVER_SELF_SPECS): Remove
+ setting for the default content of weak_reference_mismatches.
+
+2021-12-17 Iain Sandoe <iain@sandoe.co.uk>
+
+ * config/rs6000/darwin.h: Drop trailing _x from the
+ builtin_decls array name.
+
+2021-12-17 Haochen Jiang <haochen.jiang@intel.com>
+
+ PR target/100738
+ * config/i386/sse.md (*avx_cmp<mode>3_lt, *avx_cmp<mode>3_ltint):
+ Remove MEM_P restriction and add force_reg for operands[2].
+ (*avx_cmp<mode>3_ltint_not): Add new define_insn_and_split.
+
+2021-12-17 Siddhesh Poyarekar <siddhesh@gotplt.org>
+
+ * builtins.def (BUILT_IN_DYNAMIC_OBJECT_SIZE): New builtin.
+ * tree-object-size.h: Move object size type bits enum from
+ tree-object-size.c and add new value OST_DYNAMIC.
+ * builtins.c (expand_builtin, fold_builtin_2): Handle it.
+ (fold_builtin_object_size): Handle new builtin and adjust for
+ change to compute_builtin_object_size.
+ * tree-object-size.c: Include builtins.h.
+ (compute_builtin_object_size): Adjust.
+ (early_object_sizes_execute_one,
+ dynamic_object_sizes_execute_one): New functions.
+ (object_sizes_execute): Rename insert_min_max_p argument to
+ early. Handle BUILT_IN_DYNAMIC_OBJECT_SIZE and call the new
+ functions.
+ * doc/extend.texi (__builtin_dynamic_object_size): Document new
+ builtin.
+
+2021-12-17 Siddhesh Poyarekar <siddhesh@gotplt.org>
+
+ * tree-object-size.h (compute_builtin_object_size): Return tree
+ instead of HOST_WIDE_INT.
+ * builtins.c (fold_builtin_object_size): Adjust.
+ * gimple-fold.c (gimple_fold_builtin_strncat): Likewise.
+ * ubsan.c (instrument_object_size): Likewise.
+ * tree-object-size.c (object_size): New structure.
+ (object_sizes): Change type to vec<object_size>.
+ (initval): New function.
+ (unknown): Use it.
+ (size_unknown_p, size_initval, size_unknown): New functions.
+ (object_sizes_unknown_p): Use it.
+ (object_sizes_get): Return tree.
+ (object_sizes_initialize): Rename from object_sizes_set_force
+ and set VAL parameter type as tree. Add new parameter WHOLEVAL.
+ (object_sizes_set): Set VAL parameter type as tree and adjust
+ implementation. Add new parameter WHOLEVAL.
+ (size_for_offset): New function.
+ (decl_init_size): Adjust comment.
+ (addr_object_size): Change PSIZE parameter to tree and adjust
+ implementation. Add new parameter PWHOLESIZE.
+ (alloc_object_size): Return tree.
+ (compute_builtin_object_size): Return tree in PSIZE.
+ (expr_object_size, call_object_size, unknown_object_size):
+ Adjust for object_sizes_set change.
+ (merge_object_sizes): Drop OFFSET parameter and adjust
+ implementation for tree change.
+ (plus_stmt_object_size): Call collect_object_sizes_for directly
+ instead of merge_object_size and call size_for_offset to get net
+ size.
+ (cond_expr_object_size, collect_object_sizes_for,
+ object_sizes_execute): Adjust for change of type from
+ HOST_WIDE_INT to tree.
+ (check_for_plus_in_loops_1): Likewise and skip non-positive
+ offsets.
+
+2021-12-17 Jason Merrill <jason@redhat.com>
+
+ PR c++/103681
+ * common.opt (fabi-version): Add v17.
+
2021-12-16 Uroš Bizjak <ubizjak@gmail.com>
PR target/103571
diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP
index 7b090eb..40a9145 100644
--- a/gcc/DATESTAMP
+++ b/gcc/DATESTAMP
@@ -1 +1 @@
-20211217
+20211220
diff --git a/gcc/attribs.c b/gcc/attribs.c
index 29703e7..9e7b7c1 100644
--- a/gcc/attribs.c
+++ b/gcc/attribs.c
@@ -304,7 +304,7 @@ handle_ignored_attributes_option (vec<char *> *v)
We can't free it here, so squirrel away the pointers. */
attribute_spec *table = new attribute_spec[2];
ignored_attributes_table.safe_push (table);
- table[0] = { attr, 0, 0, false, false, false, false, nullptr, nullptr };
+ table[0] = { attr, 0, -2, false, false, false, false, nullptr, nullptr };
table[1] = { nullptr, 0, 0, false, false, false, false, nullptr,
nullptr };
register_scoped_attributes (table, IDENTIFIER_POINTER (vendor_id), !attr);
@@ -569,6 +569,32 @@ attr_namespace_ignored_p (tree ns)
return r && r->ignored_p;
}
+/* Return true if the attribute ATTR should not be warned about. */
+
+bool
+attribute_ignored_p (tree attr)
+{
+ if (!cxx11_attribute_p (attr))
+ return false;
+ if (tree ns = get_attribute_namespace (attr))
+ {
+ if (attr_namespace_ignored_p (ns))
+ return true;
+ const attribute_spec *as = lookup_attribute_spec (TREE_PURPOSE (attr));
+ if (as && as->max_length == -2)
+ return true;
+ }
+ return false;
+}
+
+/* Like above, but takes an attribute_spec AS, which must be nonnull. */
+
+bool
+attribute_ignored_p (const attribute_spec *const as)
+{
+ return as->max_length == -2;
+}
+
/* Process the attributes listed in ATTRIBUTES and install them in *NODE,
which is either a DECL (including a TYPE_DECL) or a TYPE. If a DECL,
it should be modified in place; if a TYPE, a copy should be created
diff --git a/gcc/attribs.h b/gcc/attribs.h
index f5899d8..4928b12 100644
--- a/gcc/attribs.h
+++ b/gcc/attribs.h
@@ -39,6 +39,8 @@ extern tree get_attribute_name (const_tree);
extern tree get_attribute_namespace (const_tree);
extern void apply_tm_attr (tree, tree);
extern tree make_attribute (const char *, const char *, tree);
+extern bool attribute_ignored_p (tree);
+extern bool attribute_ignored_p (const attribute_spec *const);
extern struct scoped_attributes* register_scoped_attributes (const struct attribute_spec *,
const char *,
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index e2dcb93..da83507 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,8 @@
+2021-12-17 Jason Merrill <jason@redhat.com>
+
+ PR c++/103681
+ * c-opts.c (c_common_post_options): Update defaults.
+
2021-12-16 Martin Liska <mliska@suse.cz>
PR target/103709
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index e9c054d..212d4c7 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,11 @@
+2021-12-17 Marek Polacek <polacek@redhat.com>
+
+ PR c/103649
+ * c-decl.c (c_warn_unused_attributes): Don't warn for
+ attribute_ignored_p.
+ * c-parser.c (c_parser_std_attribute): Skip parsing of the attribute
+ arguments when the attribute is ignored.
+
2021-12-14 Jakub Jelinek <jakub@redhat.com>
PR c/103587
diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
index 4b5481c..516e3c2 100644
--- a/gcc/c/c-decl.c
+++ b/gcc/c/c-decl.c
@@ -4643,7 +4643,7 @@ c_warn_unused_attributes (tree attrs)
constraint violation. */
pedwarn (input_location, OPT_Wattributes, "%qE attribute ignored",
get_attribute_name (t));
- else
+ else if (!attribute_ignored_p (t))
warning (OPT_Wattributes, "%qE attribute ignored",
get_attribute_name (t));
}
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
index d7e5f05..b09ad30 100644
--- a/gcc/c/c-parser.c
+++ b/gcc/c/c-parser.c
@@ -4943,7 +4943,9 @@ c_parser_std_attribute (c_parser *parser, bool for_tm)
parens.skip_until_found_close (parser);
return error_mark_node;
}
- if (as)
+ /* If this is a fake attribute created to handle -Wno-attributes,
+ we must skip parsing the arguments. */
+ if (as && !attribute_ignored_p (as))
{
bool takes_identifier
= (ns != NULL_TREE
diff --git a/gcc/common.opt b/gcc/common.opt
index 4af89ce..2ed818d 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -483,6 +483,10 @@ Og
Common Optimization
Optimize for debugging experience rather than speed or size.
+Oz
+Common Optimization
+Optimize for space aggressively rather than speed.
+
Q
Driver
diff --git a/gcc/config.gcc b/gcc/config.gcc
index c882436..c8c0ef9 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1847,7 +1847,7 @@ hppa[12]*-*-hpux11*)
dwarf2=no
fi
;;
-i[34567]86-*-darwin1[89]* | i[34567]86-*-darwin2[0-9]*)
+i[34567]86-*-darwin1[89]* | i[34567]86-*-darwin2*)
echo "Error: 32bit target is not supported after Darwin17" 1>&2
;;
i[34567]86-*-darwin*)
@@ -1857,7 +1857,7 @@ i[34567]86-*-darwin*)
tmake_file="${tmake_file} ${cpu_type}/t-darwin32-biarch t-slibgcc"
tm_file="${cpu_type}/darwin32-biarch.h ${tm_file} "
;;
-x86_64-*-darwin1[89]* | x86_64-*-darwin2[01]*)
+x86_64-*-darwin1[89]* | x86_64-*-darwin2*)
# Only 64b from now
tm_defines="${tm_defines} TARGET_64BIT_DEFAULT=(OPTION_MASK_ISA_64BIT|OPTION_MASK_ABI_64)"
tm_defines="${tm_defines} TARGET_BI_ARCH=0"
diff --git a/gcc/config/darwin-driver.c b/gcc/config/darwin-driver.c
index 688fe8f..e459a72 100644
--- a/gcc/config/darwin-driver.c
+++ b/gcc/config/darwin-driver.c
@@ -64,7 +64,8 @@ validate_macosx_version_min (const char *version_str)
major = strtoul (version_str, &end, 10);
- if (major < 10 || major > 12 ) /* macOS 10, 11, and 12 are known. */
+ /* macOS 10, 11, and 12 are known. clang accepts up to 99. */
+ if (major < 10 || major > 99)
return NULL;
/* Skip a separating period, if there's one. */
@@ -160,8 +161,7 @@ darwin_find_version_from_kernel (void)
/* Darwin20 sees a transition to macOS 11. In this, it seems that the
mapping to macOS minor version is now shifted to the kernel minor
- version - 1 (at least for the initial releases). At this stage, we
- don't know what macOS version will correspond to Darwin21. */
+ version - 1 (at least for the initial releases). */
if (major_vers >= 20)
{
int minor_vers = *version_p++ - '0';
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index f6d9c4b..d25453f 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -2213,7 +2213,14 @@
case TYPE_IMOV:
gcc_assert (!flag_pic || LEGITIMATE_PIC_OPERAND_P (operands[1]));
if (get_attr_mode (insn) == MODE_SI)
- return "mov{l}\t{%k1, %k0|%k0, %k1}";
+ {
+ if (optimize_size > 1
+ && TARGET_64BIT
+ && CONST_INT_P (operands[1])
+ && IN_RANGE (INTVAL (operands[1]), -128, 127))
+ return "push{q}\t%1\n\tpop{q}\t%0";
+ return "mov{l}\t{%k1, %k0|%k0, %k1}";
+ }
else if (which_alternative == 4)
return "movabs{q}\t{%1, %0|%0, %1}";
else if (ix86_use_lea_for_mov (insn, operands))
@@ -2431,6 +2438,14 @@
gcc_assert (!flag_pic || LEGITIMATE_PIC_OPERAND_P (operands[1]));
if (ix86_use_lea_for_mov (insn, operands))
return "lea{l}\t{%E1, %0|%0, %E1}";
+ else if (optimize_size > 1
+ && CONST_INT_P (operands[1])
+ && IN_RANGE (INTVAL (operands[1]), -128, 127))
+ {
+ if (TARGET_64BIT)
+ return "push{q}\t%1\n\tpop{q}\t%q0";
+ return "push{l}\t%1\n\tpop{l}\t%0";
+ }
else
return "mov{l}\t{%1, %0|%0, %1}";
@@ -10629,6 +10644,38 @@
[(set_attr "isa" "*,nox64")
(set_attr "type" "alu")
(set_attr "mode" "QI")])
+
+;; Split DST = (HI<<32)|LO early to minimize register usage.
+(define_code_iterator any_or_plus [plus ior xor])
+(define_split
+ [(set (match_operand:DI 0 "register_operand")
+ (any_or_plus:DI
+ (ashift:DI (match_operand:DI 1 "register_operand")
+ (const_int 32))
+ (zero_extend:DI (match_operand:SI 2 "register_operand"))))]
+ "!TARGET_64BIT"
+ [(set (match_dup 3) (match_dup 4))
+ (set (match_dup 5) (match_dup 2))]
+{
+ operands[3] = gen_highpart (SImode, operands[0]);
+ operands[4] = gen_lowpart (SImode, operands[1]);
+ operands[5] = gen_lowpart (SImode, operands[0]);
+})
+
+(define_split
+ [(set (match_operand:DI 0 "register_operand")
+ (any_or_plus:DI
+ (zero_extend:DI (match_operand:SI 1 "register_operand"))
+ (ashift:DI (match_operand:DI 2 "register_operand")
+ (const_int 32))))]
+ "!TARGET_64BIT"
+ [(set (match_dup 3) (match_dup 4))
+ (set (match_dup 5) (match_dup 1))]
+{
+ operands[3] = gen_highpart (SImode, operands[0]);
+ operands[4] = gen_lowpart (SImode, operands[2]);
+ operands[5] = gen_lowpart (SImode, operands[0]);
+})
;; Negation instructions
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 97ce5b3..5196149 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -4465,6 +4465,18 @@
(const_string "<sseinsnmode>")
(const_string "XI")))])
+;; Generic part doesn't support the simpliciation of logic operation with
+;; float_vector_all_ones_operand since it's not valid rtl. Add combine spiltter
+;; for them, it should be safe since there's no SIMD Floating-Point Exceptions.
+(define_insn_and_split "*bit_and_float_vector_all_ones"
+ [(set (match_operand:VFB 0 "nonimmediate_operand")
+ (and:VFB (match_operand:VFB 1 "nonimmediate_operand")
+ (match_operand:VFB 2 "float_vector_all_ones_operand")))]
+ "TARGET_SSE && ix86_pre_reload_split ()"
+ "#"
+ "&& 1"
+ [(set (match_dup 0) (match_dup 1))])
+
(define_expand "copysign<mode>3"
[(set (match_dup 4)
(and:VFB
@@ -18747,9 +18759,9 @@
(vec_select:SI
(match_operand:V4SI 1 "register_operand" "v,x,v")
(parallel [(const_int 0)]))))]
- "TARGET_SSE4_1"
+ "TARGET_64BIT && TARGET_SSE4_1"
"#"
- [(set_attr "isa" "x64,*,avx512f")
+ [(set_attr "isa" "*,*,avx512f")
(set (attr "preferred_for_speed")
(cond [(eq_attr "alternative" "0")
(symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC")
diff --git a/gcc/config/rs6000/rs6000-builtins.def b/gcc/config/rs6000/rs6000-builtins.def
index 45ce160..3ad5a13 100644
--- a/gcc/config/rs6000/rs6000-builtins.def
+++ b/gcc/config/rs6000/rs6000-builtins.def
@@ -2798,14 +2798,14 @@
; Miscellaneous P9 functions
[power9]
- signed long long __builtin_darn ();
- DARN darn {}
+ signed long __builtin_darn ();
+ DARN darn_64_di {32bit}
- signed int __builtin_darn_32 ();
- DARN_32 darn_32 {}
+ signed long __builtin_darn_32 ();
+ DARN_32 darn_32_di {32bit}
- signed long long __builtin_darn_raw ();
- DARN_RAW darn_raw {}
+ signed long __builtin_darn_raw ();
+ DARN_RAW darn_raw_di {32bit}
const signed int __builtin_dtstsfi_eq_dd (const int<6>, _Decimal64);
TSTSFI_EQ_DD dfptstsfi_eq_dd {}
diff --git a/gcc/config/rs6000/rs6000-call.c b/gcc/config/rs6000/rs6000-call.c
index b98f4a4..cc55174 100644
--- a/gcc/config/rs6000/rs6000-call.c
+++ b/gcc/config/rs6000/rs6000-call.c
@@ -5631,6 +5631,12 @@ rs6000_expand_builtin (tree exp, rtx target, rtx /* subtarget */,
icode = CODE_FOR_rs6000_mftb_si;
else if (fcode == RS6000_BIF_BPERMD)
icode = CODE_FOR_bpermd_si;
+ else if (fcode == RS6000_BIF_DARN)
+ icode = CODE_FOR_darn_64_si;
+ else if (fcode == RS6000_BIF_DARN_32)
+ icode = CODE_FOR_darn_32_si;
+ else if (fcode == RS6000_BIF_DARN_RAW)
+ icode = CODE_FOR_darn_raw_si;
else
gcc_unreachable ();
}
diff --git a/gcc/config/rs6000/rs6000-overload.def b/gcc/config/rs6000/rs6000-overload.def
index 531a4fc..2b28539 100644
--- a/gcc/config/rs6000/rs6000-overload.def
+++ b/gcc/config/rs6000/rs6000-overload.def
@@ -3021,7 +3021,7 @@
; is replaced by a constructor. The single overload here causes
; __builtin_vec_promote to be registered with the front end so that can happen.
[VEC_PROMOTE, vec_promote, __builtin_vec_promote]
- vsi __builtin_vec_promote (vsi);
+ vsi __builtin_vec_promote (vsi, const int);
ABS_V4SI PROMOTE_FAKERY
[VEC_RE, vec_re, __builtin_vec_re]
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 4122acb..9be484c 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -172,9 +172,7 @@
UNSPECV_EH_RR ; eh_reg_restore
UNSPECV_ISYNC ; isync instruction
UNSPECV_MFTB ; move from time base
- UNSPECV_DARN ; darn 1 (deliver a random number)
- UNSPECV_DARN_32 ; darn 2
- UNSPECV_DARN_RAW ; darn 0
+ UNSPECV_DARN ; darn (deliver a random number)
UNSPECV_NLGR ; non-local goto receiver
UNSPECV_MFFS ; Move from FPSCR
UNSPECV_MFFSL ; Move from FPSCR light instruction version
@@ -15065,25 +15063,36 @@
;; Miscellaneous ISA 3.0 (power9) instructions
-(define_insn "darn_32"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec_volatile:SI [(const_int 0)] UNSPECV_DARN_32))]
+(define_expand "darn_32_<mode>"
+ [(use (match_operand:GPR 0 "register_operand"))]
"TARGET_P9_MISC"
- "darn %0,0"
- [(set_attr "type" "integer")])
+{
+ emit_insn (gen_darn (<MODE>mode, operands[0], const0_rtx));
+ DONE;
+})
-(define_insn "darn_raw"
- [(set (match_operand:DI 0 "register_operand" "=r")
- (unspec_volatile:DI [(const_int 0)] UNSPECV_DARN_RAW))]
- "TARGET_P9_MISC && TARGET_64BIT"
- "darn %0,2"
- [(set_attr "type" "integer")])
+(define_expand "darn_64_<mode>"
+ [(use (match_operand:GPR 0 "register_operand"))]
+ "TARGET_P9_MISC"
+{
+ emit_insn (gen_darn (<MODE>mode, operands[0], const1_rtx));
+ DONE;
+})
-(define_insn "darn"
- [(set (match_operand:DI 0 "register_operand" "=r")
- (unspec_volatile:DI [(const_int 0)] UNSPECV_DARN))]
- "TARGET_P9_MISC && TARGET_64BIT"
- "darn %0,1"
+(define_expand "darn_raw_<mode>"
+ [(use (match_operand:GPR 0 "register_operand"))]
+ "TARGET_P9_MISC"
+{
+ emit_insn (gen_darn (<MODE>mode, operands[0], const2_rtx));
+ DONE;
+})
+
+(define_insn "@darn<mode>"
+ [(set (match_operand:GPR 0 "register_operand" "=r")
+ (unspec_volatile:GPR [(match_operand 1 "const_int_operand" "n")]
+ UNSPECV_DARN))]
+ "TARGET_P9_MISC"
+ "darn %0,%1"
[(set_attr "type" "integer")])
;; Test byte within range.
diff --git a/gcc/configure b/gcc/configure
index 5470987..992a9d7 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -26947,7 +26947,7 @@ $as_echo "$as_me: WARNING: LTO for $target requires binutils >= 2.20.1, but vers
;;
esac
case $target_os in
- darwin2[0-9]* | darwin19*)
+ darwin2* | darwin19*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for llvm assembler x86-pad-for-align option" >&5
$as_echo_n "checking assembler for llvm assembler x86-pad-for-align option... " >&6; }
if ${gcc_cv_as_mllvm_x86_pad_for_align+:} false; then :
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 2b4914b..0db9c4c 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -4692,7 +4692,7 @@ foo: nop
;;
esac
case $target_os in
- darwin2[[0-9]]* | darwin19*)
+ darwin2* | darwin19*)
gcc_GAS_CHECK_FEATURE([llvm assembler x86-pad-for-align option],
gcc_cv_as_mllvm_x86_pad_for_align,
[-mllvm -x86-pad-for-align=false], [.text],,
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b8a0726..bf5c30c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,69 @@
+2021-12-19 Matthias Kretz <m.kretz@gsi.de>
+
+ * module.cc (trees_out::get_merge_kind): NAMESPACE_DECLs also
+ cannot have a DECL_TEMPLATE_INFO.
+
+2021-12-19 Patrick Palka <ppalka@redhat.com>
+
+ PR c++/94376
+ * lambda.c (lambda_capture_field_type): Strip location wrappers
+ before checking for a capture proxy.
+ (is_capture_proxy): Assert that we don't see a location wrapper.
+ (mark_const_cap_r): Don't call is_constant_capture_proxy on a
+ location wrapper.
+
+2021-12-19 Patrick Palka <ppalka@redhat.com>
+
+ PR c++/103714
+ * constraint.cc (satisfy_declaration_constraints): Do
+ push_to_top_level and pop_from_top_level around the call to
+ satisfy_normalized_constraints.
+
+2021-12-17 Marek Polacek <polacek@redhat.com>
+
+ PR c/103649
+ * parser.c (cp_parser_declaration): Don't warn for attribute_ignored_p.
+ (cp_parser_std_attribute): Skip parsing of the attribute
+ arguments when the attribute is ignored.
+
+2021-12-17 Marek Polacek <polacek@redhat.com>
+
+ PR c++/103749
+ * decl.c (lookup_and_check_tag): Give an error when a class was
+ declared as template but no template header has been provided.
+ * pt.c (do_class_deduction): Don't deduce CLASSTYPE_ERRONEOUS
+ types.
+
+2021-12-17 Iain Sandoe <iain@sandoe.co.uk>
+
+ PR c++/100127
+ * coroutines.cc (coro_rewrite_function_body): Handle initial
+ await expressions that try to produce a reference value.
+
+2021-12-17 Iain Sandoe <iain@sandoe.co.uk>
+
+ PR c++/100772
+ * coroutines.cc (morph_fn_to_coro): Convert function parms
+ from reference before constructing any operator-new args
+ list.
+
+2021-12-17 Jason Merrill <jason@redhat.com>
+
+ * constraint.cc (deduce_concept_introduction): Adjust comment.
+
+2021-12-17 Jason Merrill <jason@redhat.com>
+
+ PR c++/103681
+ * cp-tree.h (struct lang_type): Add non_pod_aggregate.
+ (CLASSTYPE_NON_POD_AGGREGATE): New.
+ * class.c (check_field_decls): Set it.
+ (check_bases_and_members): Check it.
+ (check_non_pod_aggregate): New.
+ (enum eoc_mode): New.
+ (end_of_class): Always include non-empty fields.
+ Add eoc_nv_or_dsize mode.
+ (include_empty_classes, layout_class_type): Adjust.
+
2021-12-16 Marek Polacek <polacek@redhat.com>
PR c++/99980
diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc
index 8386a7d..96fa6a7 100644
--- a/gcc/cp/constraint.cc
+++ b/gcc/cp/constraint.cc
@@ -3177,9 +3177,11 @@ satisfy_declaration_constraints (tree t, sat_info info)
{
if (!push_tinst_level (t))
return result;
+ push_to_top_level ();
push_access_scope (t);
result = satisfy_normalized_constraints (norm, args, info);
pop_access_scope (t);
+ pop_from_top_level ();
pop_tinst_level ();
}
@@ -3235,9 +3237,11 @@ satisfy_declaration_constraints (tree t, tree args, sat_info info)
if (!push_tinst_level (t, args))
return result;
tree pattern = DECL_TEMPLATE_RESULT (t);
+ push_to_top_level ();
push_access_scope (pattern);
result = satisfy_normalized_constraints (norm, args, info);
pop_access_scope (pattern);
+ pop_from_top_level ();
pop_tinst_level ();
}
diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index c00672e..25931c9 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -4211,9 +4211,15 @@ coro_rewrite_function_body (location_t fn_start, tree fnbody, tree orig,
{
/* Build a compound expression that sets the
initial-await-resume-called variable true and then calls the
- initial suspend expression await resume. */
+ initial suspend expression await resume.
+ In the case that the user decides to make the initial await
+ await_resume() return a value, we need to discard it and, it is
+ a reference type, look past the indirection. */
+ if (INDIRECT_REF_P (initial_await))
+ initial_await = TREE_OPERAND (initial_await, 0);
tree vec = TREE_OPERAND (initial_await, 3);
tree aw_r = TREE_VEC_ELT (vec, 2);
+ aw_r = convert_to_void (aw_r, ICV_STATEMENT, tf_warning_or_error);
tree update = build2 (MODIFY_EXPR, boolean_type_node, i_a_r_c,
boolean_true_node);
aw_r = cp_build_compound_expr (update, aw_r, tf_warning_or_error);
@@ -4595,8 +4601,8 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer)
If the lookup finds an allocation function in the scope of the promise
type, overload resolution is performed on a function call created by
assembling an argument list. The first argument is the amount of space
- requested, and has type std::size_t. The succeeding arguments are
- those of the original function. */
+ requested, and has type std::size_t. The lvalues p1...pn are the
+ succeeding arguments.. */
vec<tree, va_gc> *args = make_tree_vector ();
vec_safe_push (args, resizeable); /* Space needed. */
@@ -4614,10 +4620,10 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer)
this_ref = convert_to_reference (tt, this_ref, CONV_STATIC,
LOOKUP_NORMAL , NULL_TREE,
tf_warning_or_error);
- vec_safe_push (args, this_ref);
+ vec_safe_push (args, convert_from_reference (this_ref));
}
else
- vec_safe_push (args, arg);
+ vec_safe_push (args, convert_from_reference (arg));
}
/* Note the function selected; we test to see if it's NOTHROW. */
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 7ca8770..982fca8 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -15439,6 +15439,16 @@ lookup_and_check_tag (enum tag_types tag_code, tree name,
}
if (DECL_CLASS_TEMPLATE_P (decl)
+ && !template_header_p
+ && how == TAG_how::CURRENT_ONLY)
+ {
+ error ("class template %qD redeclared as non-template", name);
+ inform (location_of (decl), "previous declaration here");
+ CLASSTYPE_ERRONEOUS (TREE_TYPE (decl)) = true;
+ return error_mark_node;
+ }
+
+ if (DECL_CLASS_TEMPLATE_P (decl)
/* If scope is TAG_how::CURRENT_ONLY we're defining a class,
so ignore a template template parameter. */
|| (how != TAG_how::CURRENT_ONLY && DECL_TEMPLATE_TEMPLATE_PARM_P (decl)))
diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c
index c39a2bc..b1cbe27 100644
--- a/gcc/cp/lambda.c
+++ b/gcc/cp/lambda.c
@@ -221,6 +221,8 @@ lambda_capture_field_type (tree expr, bool explicit_init_p,
}
else
{
+ STRIP_ANY_LOCATION_WRAPPER (expr);
+
if (!by_reference_p && is_capture_proxy (expr))
{
/* When capturing by-value another capture proxy from an enclosing
@@ -246,6 +248,10 @@ lambda_capture_field_type (tree expr, bool explicit_init_p,
bool
is_capture_proxy (tree decl)
{
+ /* Location wrappers should be stripped or otherwise handled by the
+ caller before using this predicate. */
+ gcc_checking_assert (!location_wrapper_p (decl));
+
return (VAR_P (decl)
&& DECL_HAS_VALUE_EXPR_P (decl)
&& !DECL_ANON_UNION_VAR_P (decl)
@@ -1496,7 +1502,8 @@ mark_const_cap_r (tree *t, int *walk_subtrees, void *data)
*walk_subtrees = 0;
}
}
- else if (is_constant_capture_proxy (*t))
+ else if (!location_wrapper_p (*t) /* is_capture_proxy dislikes them. */
+ && is_constant_capture_proxy (*t))
var = DECL_CAPTURED_VARIABLE (*t);
if (var)
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index f3e7af2..8451e3d 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -10067,9 +10067,10 @@ trees_out::get_merge_kind (tree decl, depset *dep)
tree ctx = CP_DECL_CONTEXT (decl);
if (TREE_CODE (ctx) == FUNCTION_DECL)
{
- /* USING_DECLs cannot have DECL_TEMPLATE_INFO -- this isn't
- permitting them to have one. */
+ /* USING_DECLs and NAMESPACE_DECLs cannot have DECL_TEMPLATE_INFO --
+ this isn't permitting them to have one. */
gcc_checking_assert (TREE_CODE (decl) == USING_DECL
+ || TREE_CODE (decl) == NAMESPACE_DECL
|| !DECL_LANG_SPECIFIC (decl)
|| !DECL_TEMPLATE_INFO (decl));
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 44eed7e..33fb40a 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -14776,7 +14776,7 @@ cp_parser_declaration (cp_parser* parser, tree prefix_attrs)
}
}
- if (std_attrs != NULL_TREE)
+ if (std_attrs != NULL_TREE && !attribute_ignored_p (std_attrs))
warning_at (make_location (attrs_loc, attrs_loc, parser->lexer),
OPT_Wattributes, "attribute ignored");
if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
@@ -28979,7 +28979,9 @@ cp_parser_std_attribute (cp_parser *parser, tree attr_ns)
/* A GNU attribute that takes an identifier in parameter. */
attr_flag = id_attr;
- if (as == NULL)
+ /* If this is a fake attribute created to handle -Wno-attributes,
+ we must skip parsing the arguments. */
+ if (as == NULL || attribute_ignored_p (as))
{
if ((flag_openmp || flag_openmp_simd) && attr_ns == omp_identifier)
{
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 18c6f11..4f0ae6d 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -29601,6 +29601,13 @@ do_class_deduction (tree ptype, tree tmpl, tree init,
if (DECL_TEMPLATE_TEMPLATE_PARM_P (tmpl))
return ptype;
+ /* If the class was erroneous, don't try to deduce, because that
+ can generate a lot of diagnostic. */
+ if (TREE_TYPE (tmpl)
+ && TYPE_LANG_SPECIFIC (TREE_TYPE (tmpl))
+ && CLASSTYPE_ERRONEOUS (TREE_TYPE (tmpl)))
+ return ptype;
+
/* Wait until the enclosing scope is non-dependent. */
if (DECL_CLASS_SCOPE_P (tmpl)
&& dependent_type_p (DECL_CONTEXT (tmpl)))
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 03028c2..06b38f9 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -551,7 +551,7 @@ Objective-C and Objective-C++ Dialects}.
-fipa-ra -fvariable-expansion-in-unroller -fvect-cost-model -fvpt @gol
-fweb -fwhole-program -fwpa -fuse-linker-plugin -fzero-call-used-regs @gol
--param @var{name}=@var{value}
--O -O0 -O1 -O2 -O3 -Os -Ofast -Og}
+-O -O0 -O1 -O2 -O3 -Os -Ofast -Og -Oz}
@item Program Instrumentation Options
@xref{Instrumentation Options,,Program Instrumentation Options}.
@@ -10697,6 +10697,13 @@ optimization flags except for those that may interfere with debugging:
-fmove-loop-invariants -fmove-loop-stores -fssa-phiopt @gol
-ftree-bit-ccp -ftree-dse -ftree-pta -ftree-sra}
+@item -Oz
+@opindex Oz
+Optimize aggressively for size rather than speed. This may increase
+the number of instructions executed if those instructions require
+fewer bytes to encode. @option{-Oz} behaves similarly to @option{-Os}
+including enabling most @option{-O2} optimizations.
+
@end table
If you use multiple @option{-O} options, with or without level numbers,
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 264fa1b..5efbba8 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,8 @@
+2021-12-18 Harald Anlauf <anlauf@gmx.de>
+
+ PR fortran/103412
+ * check.c (gfc_check_sizeof): Reject BOZ type argument.
+
2021-12-14 Harald Anlauf <anlauf@gmx.de>
PR fortran/103717
diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c
index 3934336..625473c 100644
--- a/gcc/fortran/check.c
+++ b/gcc/fortran/check.c
@@ -5135,6 +5135,9 @@ gfc_check_sizeof (gfc_expr *arg)
return false;
}
+ if (illegal_boz_arg (arg))
+ return false;
+
/* TYPE(*) is acceptable if and only if it uses an array descriptor. */
if (arg->ts.type == BT_ASSUMED
&& (arg->symtree->n.sym->as == NULL
diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c
index d3590f0..733fc21 100644
--- a/gcc/ipa-modref.c
+++ b/gcc/ipa-modref.c
@@ -2232,7 +2232,7 @@ class modref_eaf_analysis
{
public:
/* Mark NAME as relevant for analysis. */
- void analyze_ssa_name (tree name);
+ void analyze_ssa_name (tree name, bool deferred = false);
/* Dataflow slover. */
void propagate ();
/* Return flags computed earlier for NAME. */
@@ -2373,33 +2373,36 @@ callee_to_caller_flags (int call_flags, bool ignore_stores,
are processed later) */
void
-modref_eaf_analysis::analyze_ssa_name (tree name)
+modref_eaf_analysis::analyze_ssa_name (tree name, bool deferred)
{
imm_use_iterator ui;
gimple *use_stmt;
int index = SSA_NAME_VERSION (name);
- /* See if value is already computed. */
- if (m_lattice[index].known || m_lattice[index].do_dataflow)
- return;
- if (m_lattice[index].open)
+ if (!deferred)
{
- if (dump_file)
- fprintf (dump_file,
- "%*sCycle in SSA graph\n",
- m_depth * 4, "");
- return;
- }
- /* Recursion guard. */
- m_lattice[index].init ();
- if (m_depth == param_modref_max_depth)
- {
- if (dump_file)
- fprintf (dump_file,
- "%*sMax recursion depth reached; postponing\n",
- m_depth * 4, "");
- m_deferred_names.safe_push (name);
- return;
+ /* See if value is already computed. */
+ if (m_lattice[index].known || m_lattice[index].do_dataflow)
+ return;
+ if (m_lattice[index].open)
+ {
+ if (dump_file)
+ fprintf (dump_file,
+ "%*sCycle in SSA graph\n",
+ m_depth * 4, "");
+ return;
+ }
+ /* Recursion guard. */
+ m_lattice[index].init ();
+ if (m_depth == param_modref_max_depth)
+ {
+ if (dump_file)
+ fprintf (dump_file,
+ "%*sMax recursion depth reached; postponing\n",
+ m_depth * 4, "");
+ m_deferred_names.safe_push (name);
+ return;
+ }
}
if (dump_file)
@@ -2742,10 +2745,9 @@ modref_eaf_analysis::propagate ()
while (m_deferred_names.length ())
{
tree name = m_deferred_names.pop ();
- m_lattice[SSA_NAME_VERSION (name)].open = false;
if (dump_file)
fprintf (dump_file, "Analyzing deferred SSA name\n");
- analyze_ssa_name (name);
+ analyze_ssa_name (name, true);
}
if (!m_names_to_propagate.length ())
@@ -5019,9 +5021,15 @@ modref_merge_call_site_flags (escape_summary *sum,
bool changed = false;
bool ignore_stores = ignore_stores_p (caller, callee_ecf_flags);
- /* If we have no useful info to propagate. */
- if ((!cur_summary || !cur_summary->arg_flags.length ())
- && (!cur_summary_lto || !cur_summary_lto->arg_flags.length ()))
+ /* Return early if we have no useful info to propagate. */
+ if ((!cur_summary
+ || (!cur_summary->arg_flags.length ()
+ && !cur_summary->static_chain_flags
+ && !cur_summary->retslot_flags))
+ && (!cur_summary_lto
+ || (!cur_summary_lto->arg_flags.length ()
+ && !cur_summary_lto->static_chain_flags
+ && !cur_summary_lto->retslot_flags)))
return false;
FOR_EACH_VEC_ELT (sum->esc, i, ee)
diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
index 54f642d..7d2b7e5 100644
--- a/gcc/lto-wrapper.c
+++ b/gcc/lto-wrapper.c
@@ -370,12 +370,14 @@ merge_and_complain (vec<cl_decoded_option> &decoded_options,
case OPT_Ofast:
case OPT_Og:
case OPT_Os:
+ case OPT_Oz:
existing_opt = -1;
for (j = 0; j < decoded_options.length (); ++j)
if (decoded_options[j].opt_index == OPT_O
|| decoded_options[j].opt_index == OPT_Ofast
|| decoded_options[j].opt_index == OPT_Og
- || decoded_options[j].opt_index == OPT_Os)
+ || decoded_options[j].opt_index == OPT_Os
+ || decoded_options[j].opt_index == OPT_Oz)
{
existing_opt = j;
break;
@@ -407,6 +409,7 @@ merge_and_complain (vec<cl_decoded_option> &decoded_options,
level = MAX (level, 1);
break;
case OPT_Os:
+ case OPT_Oz:
level = MAX (level, 2);
break;
default:
@@ -428,6 +431,7 @@ merge_and_complain (vec<cl_decoded_option> &decoded_options,
level = MAX (level, 1);
break;
case OPT_Os:
+ case OPT_Oz:
level = MAX (level, 2);
break;
default:
@@ -725,6 +729,7 @@ append_compiler_options (obstack *argv_obstack, vec<cl_decoded_option> opts)
case OPT_Ofast:
case OPT_Og:
case OPT_Os:
+ case OPT_Oz:
break;
case OPT_Xassembler:
diff --git a/gcc/optc-save-gen.awk b/gcc/optc-save-gen.awk
index e363ac7..81c2db0 100644
--- a/gcc/optc-save-gen.awk
+++ b/gcc/optc-save-gen.awk
@@ -93,7 +93,7 @@ var_opt_char[1] = "optimize_size";
var_opt_char[2] = "optimize_debug";
var_opt_char[3] = "optimize_fast";
var_opt_range["optimize"] = "0, 255";
-var_opt_range["optimize_size"] = "0, 1";
+var_opt_range["optimize_size"] = "0, 2";
var_opt_range["optimize_debug"] = "0, 1";
var_opt_range["optimize_fast"] = "0, 1";
diff --git a/gcc/opts.c b/gcc/opts.c
index 870ccec..f45ecc5 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -745,6 +745,15 @@ default_options_optimization (struct gcc_options *opts,
opts->x_optimize_debug = 0;
break;
+ case OPT_Oz:
+ opts->x_optimize_size = 2;
+
+ /* Optimizing for size forces optimize to be 2. */
+ opts->x_optimize = 2;
+ opts->x_optimize_fast = 0;
+ opts->x_optimize_debug = 0;
+ break;
+
case OPT_Ofast:
/* -Ofast only adds flags to -O3. */
opts->x_optimize_size = 0;
@@ -2609,6 +2618,7 @@ common_handle_option (struct gcc_options *opts,
case OPT_Os:
case OPT_Ofast:
case OPT_Og:
+ case OPT_Oz:
/* Currently handled in a prescan. */
break;
diff --git a/gcc/print-tree.c b/gcc/print-tree.c
index b5dc523..297492a 100644
--- a/gcc/print-tree.c
+++ b/gcc/print-tree.c
@@ -484,6 +484,8 @@ print_node (FILE *file, const char *prefix, tree node, int indent,
fputs (" decl_6", file);
if (DECL_LANG_FLAG_7 (node))
fputs (" decl_7", file);
+ if (DECL_LANG_FLAG_8 (node))
+ fputs (" decl_8", file);
mode = DECL_MODE (node);
fprintf (file, " %s", GET_MODE_NAME (mode));
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 919710f..87e4a2a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,160 @@
+2021-12-19 Andrew Pinski <apinski@marvell.com>
+
+ * gcc.dg/uninit-pr89230-1.c: Change the dg-bogus messages
+ around and xfail both of them.
+
+2021-12-19 Patrick Palka <ppalka@redhat.com>
+
+ PR c++/94376
+ * g++.dg/cpp0x/lambda/lambda-nested9a.C: New test.
+
+2021-12-19 Patrick Palka <ppalka@redhat.com>
+
+ PR c++/103714
+ * g++.dg/cpp2a/concepts-uneval5.C: New test.
+
+2021-12-19 Francois-Xavier Coudert <fxcoudert@gmail.com>
+
+ * gcc.dg/pr100509.c: Needs alias.
+ * gcc.dg/pragma-diag-10.c: Needs alias.
+
+2021-12-18 Harald Anlauf <anlauf@gmx.de>
+
+ PR fortran/103412
+ * gfortran.dg/illegal_boz_arg_2.f90: New test.
+
+2021-12-18 Roger Sayle <roger@nextmovesoftware.com>
+ Uroš Bizjak <ubizjak@gmail.com>
+
+ PR target/103611
+ * gcc.target/i386/pr103611-2.c: New test case.
+
+2021-12-18 Roger Sayle <roger@nextmovesoftware.com>
+
+ PR target/32803
+ * gcc.target/i386/pr32803.c: New test case.
+
+2021-12-18 François-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ * gcc.dg/darwin-minversion-link.c: Test darwin21.
+ * obj-c++.dg/cxx-ivars-3.mm: Homogeneize darwin versions.
+ * obj-c++.dg/objc-gc-3.mm: Homogeneize darwin versions.
+ * objc.dg/objc-gc-4.m: Homogeneize darwin versions.
+
+2021-12-17 Marek Polacek <polacek@redhat.com>
+
+ PR c/103649
+ * c-c++-common/Wno-attributes-6.c: New test.
+
+2021-12-17 David Edelsohn <dje.gcc@gmail.com>
+
+ * gcc.target/powerpc/fold-vec-insert-float-p9.c
+
+2021-12-17 Olivier Hainque <hainque@adacore.com>
+
+ * gcc.target/powerpc/pr97142.c: Add -mdejagnu-cpu=power7
+ to the dg-options.
+
+2021-12-17 Marek Polacek <polacek@redhat.com>
+
+ PR c++/103749
+ * g++.dg/template/redecl4.C: Adjust dg-error.
+ * g++.dg/diagnostic/redeclaration-2.C: New test.
+
+2021-12-17 Segher Boessenkool <segher@kernel.crashing.org>
+
+ PR target/103624
+ * gcc.target/powerpc/darn-0.c: Remove target clause.
+ * gcc.target/powerpc/darn-1.c: Remove target clause. Remove lp64
+ requirement. Change return type to long.
+ * gcc.target/powerpc/darn-2.c: Ditto.
+ * gcc.target/powerpc/darn-3.c: Remove target clause.
+
+2021-12-17 Iain Sandoe <iain@sandoe.co.uk>
+
+ PR c++/100127
+ * g++.dg/coroutines/pr100127.C: New test.
+
+2021-12-17 Iain Sandoe <iain@sandoe.co.uk>
+
+ PR c++/100772
+ * g++.dg/coroutines/pr100772-a.C: New test.
+ * g++.dg/coroutines/pr100772-b.C: New test.
+
+2021-12-17 Iain Sandoe <iain@sandoe.co.uk>
+
+ PR c++/96517
+ * g++.dg/coroutines/pr96517.C: New test.
+
+2021-12-17 David Edelsohn <dje.gcc@gmail.com>
+
+ * gcc.target/powerpc/pragma-optimize.c: Require ifunc support.
+
+2021-12-17 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR tree-optimization/103744
+ * gcc.dg/vect/pr103744-1.c: New test.
+ * gcc.dg/vect/pr103744-2.c: Likewise.
+
+2021-12-17 Tamar Christina <tamar.christina@arm.com>
+
+ PR tree-optimization/103741
+ * gcc.target/aarch64/pr103741.c: New test.
+
+2021-12-17 Haochen Jiang <haochen.jiang@intel.com>
+
+ PR target/100738
+ * g++.target/i386/avx512vl-pr100738-1.C: New test.
+
+2021-12-17 Siddhesh Poyarekar <siddhesh@gotplt.org>
+
+ * g++.dg/ext/builtin-dynamic-object-size1.C: New test.
+ * g++.dg/ext/builtin-dynamic-object-size2.C: Likewise.
+ * gcc.dg/builtin-dynamic-alloc-size.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-1.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-10.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-11.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-12.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-13.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-14.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-15.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-16.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-17.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-18.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-19.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-2.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-3.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-4.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-5.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-6.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-7.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-8.c: Likewise.
+ * gcc.dg/builtin-dynamic-object-size-9.c: Likewise.
+ * gcc.dg/builtin-object-size-16.c: Adjust to allow inclusion
+ from builtin-dynamic-object-size-16.c.
+ * gcc.dg/builtin-object-size-17.c: Likewise.
+
+2021-12-17 Siddhesh Poyarekar <siddhesh@gotplt.org>
+
+ * gcc.dg/builtin-object-size-1.c (test9): New test.
+ (main): Call it.
+ * gcc.dg/builtin-object-size-2.c (test8): New test.
+ (main): Call it.
+ * gcc.dg/builtin-object-size-3.c (test9): New test.
+ (main): Call it.
+ * gcc.dg/builtin-object-size-4.c (test8): New test.
+ (main): Call it.
+ * gcc.dg/builtin-object-size-5.c (test5, test6, test7): New
+ tests.
+
+2021-12-17 Jason Merrill <jason@redhat.com>
+
+ PR c++/103681
+ * g++.dg/abi/macro0.C: Update value.
+ * g++.dg/abi/no_unique_address6.C: New test.
+ * g++.dg/abi/nsdmi-aggr1.C: New test.
+ * g++.dg/abi/nsdmi-aggr1a.C: New test.
+
2021-12-16 Sandra Loosemore <sandra@codesourcery.com>
* gcc.dg/20021029-1.c: Build with -G0 for nios2.
diff --git a/gcc/testsuite/c-c++-common/Wno-attributes-6.c b/gcc/testsuite/c-c++-common/Wno-attributes-6.c
new file mode 100644
index 0000000..ca3c7be
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/Wno-attributes-6.c
@@ -0,0 +1,16 @@
+/* PR c/103649 */
+/* { dg-do compile { target { c || c++11 } } } */
+/* { dg-additional-options "-Wno-attributes=foo::bar" } */
+/* { dg-additional-options "-Wno-attributes=baz::" } */
+/* { dg-additional-options "-Wno-attributes=womp::womp" } */
+/* { dg-additional-options "-Wno-attributes=qux::foo" } */
+/* { dg-additional-options "-Wno-attributes=vendor::assume" } */
+
+[[vendor::assume(1 + 1 == 2)]];
+[[foo::bar(1, 2)]];
+[[baz::bar(1, 2)]];
+[[foo::bar(1, 2)]] void f1();
+[[baz::bar(1, 2)]] void f2();
+[[qux::foo({t})]] void f3();
+[[womp::womp (another::directive (threadprivate (t)))]] void f4();
+[[womp::womp (another::directive (threadprivate (t)))]];
diff --git a/gcc/testsuite/g++.dg/coroutines/pr100127.C b/gcc/testsuite/g++.dg/coroutines/pr100127.C
new file mode 100644
index 0000000..374cd71
--- /dev/null
+++ b/gcc/testsuite/g++.dg/coroutines/pr100127.C
@@ -0,0 +1,65 @@
+#ifdef __clang__
+#include <experimental/coroutine>
+namespace std {
+ using namespace std::experimental;
+}
+#else
+#include <coroutine>
+#endif
+#include <optional>
+
+struct future
+{
+ using value_type = int;
+ struct promise_type;
+ using handle_type = std::coroutine_handle<promise_type>;
+
+ handle_type _coroutine;
+
+ future(handle_type h) : _coroutine{h} {}
+
+ ~future() noexcept{
+ if (_coroutine) {
+ _coroutine.destroy();
+ }
+ }
+
+ value_type get() {
+ auto ptr = _coroutine.promise()._value;
+ return *ptr;
+ }
+
+ struct promise_type {
+ std::optional<value_type> _value = std::nullopt;
+
+ future get_return_object() {
+ return future{handle_type::from_promise(*this)};
+ }
+ void return_value(value_type val) {
+ _value = static_cast<value_type &&>(val);
+ }
+ auto initial_suspend() noexcept {
+ class awaiter {
+ std::optional<value_type> & value;
+ public:
+ explicit awaiter(std::optional<value_type> & val) noexcept : value{val} {}
+ bool await_ready() noexcept { return value.has_value(); }
+ void await_suspend(handle_type) noexcept { }
+ value_type & await_resume() noexcept { return *value; }
+ };
+
+ return awaiter{_value};
+ }
+ std::suspend_always final_suspend() noexcept {
+ return {};
+ }
+ //void return_void() {}
+ void unhandled_exception() {}
+ };
+};
+
+future create_future()
+{ co_return 2021; }
+
+int main()
+{ auto f = create_future(); }
diff --git a/gcc/testsuite/g++.dg/coroutines/pr100772-a.C b/gcc/testsuite/g++.dg/coroutines/pr100772-a.C
new file mode 100644
index 0000000..a325d38
--- /dev/null
+++ b/gcc/testsuite/g++.dg/coroutines/pr100772-a.C
@@ -0,0 +1,77 @@
+// { dg-additional-options "-fsyntax-only " }
+#ifdef __clang__
+#include <experimental/coroutine>
+namespace std {
+ using namespace std::experimental;
+}
+#else
+#include <coroutine>
+#endif
+
+struct Task
+{
+ struct promise_type
+ {
+ void return_void() const noexcept {}
+
+ void* operator new(std::size_t, auto &&...args) noexcept
+ {
+ static_assert(sizeof...(args) > 0);
+ static_assert(sizeof...(args) == 2);
+
+ return nullptr;
+ }
+
+ void operator delete(void *, std::size_t) noexcept
+ {
+ }
+
+ static Task get_return_object_on_allocation_failure() noexcept
+ {
+ return {};
+ }
+
+ Task get_return_object() noexcept
+ {
+ return Task{ *this };
+ }
+
+ std::suspend_always initial_suspend() noexcept
+ {
+ return {};
+ }
+
+ std::suspend_always final_suspend() noexcept
+ {
+ return {};
+ }
+
+ void unhandled_exception() noexcept {}
+ };
+
+ using promise_handle = std::coroutine_handle<promise_type>;
+
+ Task() = default;
+ Task(promise_type & promise) noexcept
+ : m_handle{ promise_handle::from_promise(promise) }
+ {}
+
+ ~Task()
+ {
+ if (m_handle.address()) { m_handle.destroy(); }
+ }
+
+ promise_handle m_handle{};
+};
+
+
+Task Foo(auto && ... args) noexcept
+{
+ co_return;
+}
+
+int main()
+{
+ int v;
+ Foo(v, 2134);
+}
diff --git a/gcc/testsuite/g++.dg/coroutines/pr100772-b.C b/gcc/testsuite/g++.dg/coroutines/pr100772-b.C
new file mode 100644
index 0000000..6cdf8d1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/coroutines/pr100772-b.C
@@ -0,0 +1,93 @@
+#ifdef __clang__
+#include <experimental/coroutine>
+namespace std {
+ using namespace std::experimental;
+}
+#else
+#include <coroutine>
+#endif
+#include <cstdio>
+#include <typeinfo>
+#include <cxxabi.h> // needed for abi::__cxa_demangle
+#include <memory>
+
+std::shared_ptr<char> cppDemangle(const char *abiName)
+{
+ int status;
+ char *ret = abi::__cxa_demangle(abiName, 0, 0, &status);
+
+ /* NOTE: must free() the returned char when done with it! */
+ std::shared_ptr<char> retval;
+ retval.reset( (char *)ret, [](char *mem) { if (mem) free((void*)mem); } );
+ return retval;
+}
+
+template <typename T>
+struct Id{};
+struct Task
+{
+ struct promise_type
+ {
+ void return_void() const noexcept {}
+
+ static void is_int (std::string x) {
+ if (x != "Id<int>")
+ abort() ;
+ }
+ template <typename ... Args>
+ void* operator new(std::size_t len, Args ...args) noexcept
+ {
+ (is_int (cppDemangle(typeid(Id<Args>).name()).get()), ...);
+ (std::puts (cppDemangle(typeid(Id<Args>).name()).get()), ...);
+ return nullptr;
+ }
+
+ static Task get_return_object_on_allocation_failure() noexcept
+ {
+ return {};
+ }
+
+ Task get_return_object() noexcept
+ {
+ return Task{ *this };
+ }
+
+ std::suspend_always initial_suspend() noexcept
+ {
+ return {};
+ }
+
+ std::suspend_always final_suspend() noexcept
+ {
+ return {};
+ }
+
+ void unhandled_exception() noexcept {}
+ };
+
+ using promise_handle = std::coroutine_handle<promise_type>;
+
+ Task() = default;
+ Task(promise_type & promise) noexcept
+ : m_handle{ promise_handle::from_promise(promise) }
+ {}
+
+ ~Task()
+ {
+ if (m_handle.address()) { m_handle.destroy(); }
+ }
+
+ promise_handle m_handle{};
+};
+
+
+Task Foo(auto && ... args) noexcept
+{
+ co_return;
+}
+
+int main()
+{
+ int v;
+ Foo(v, 2134);
+}
diff --git a/gcc/testsuite/g++.dg/coroutines/pr96517.C b/gcc/testsuite/g++.dg/coroutines/pr96517.C
new file mode 100644
index 0000000..9cbac3e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/coroutines/pr96517.C
@@ -0,0 +1,29 @@
+// { dg-additional-options " -O1 " }
+#include <coroutine>
+
+struct coroutine {
+ struct promise_type {
+ coroutine get_return_object() { return {}; }
+ void return_void() {}
+ void unhandled_exception() {}
+ auto initial_suspend() noexcept { return std::suspend_never{}; }
+ auto final_suspend() noexcept { return std::suspend_never{}; }
+ };
+};
+
+struct data {
+ constexpr int get() { return 5; }
+};
+
+struct test {
+ data _data;
+
+ void foo() {
+ [this]() -> coroutine {
+ _data.get();
+ co_return;
+ };
+ }
+};
+
+int main() {}
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested9a.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested9a.C
new file mode 100644
index 0000000..d62f8f0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested9a.C
@@ -0,0 +1,42 @@
+// PR c++/94376
+// Like lambda-nested9.C but using explicit captures in the inner lambda.
+// { dg-do compile { target c++11 } }
+
+int main() {
+ // We used to incorrectly reject the first two cases.
+ int i = 0;
+ [=] () {
+ [i] () mutable {
+ ++i;
+ };
+ };
+
+#if __cpp_init_captures
+ [j=0] () {
+ [j] () mutable {
+ ++j;
+ };
+ };
+#endif
+
+ [=] () {
+ [&i] () mutable {
+ ++i; // { dg-error "read-only" }
+ };
+ };
+
+ const int j = 0;
+ [=] () {
+ [j] () mutable {
+ ++j; // { dg-error "read-only" }
+ };
+ };
+
+#if __cpp_init_captures
+ [j=0] () {
+ [&j] () mutable {
+ ++j; // { dg-error "read-only" "" { target c++14 } }
+ };
+ };
+#endif
+}
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-uneval5.C b/gcc/testsuite/g++.dg/cpp2a/concepts-uneval5.C
new file mode 100644
index 0000000..a315a59
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-uneval5.C
@@ -0,0 +1,17 @@
+// PR c++/103714
+// { dg-do compile { target c++20 } }
+
+template<int I>
+struct A {
+ static const int i = I;
+
+ template<int J>
+ void f(A<J> d = {}) requires (d.i != i) {
+ f<I>(); // { dg-error "no match" }
+ }
+};
+
+int main() {
+ A<0> a;
+ a.f<1>();
+}
diff --git a/gcc/testsuite/g++.dg/diagnostic/redeclaration-2.C b/gcc/testsuite/g++.dg/diagnostic/redeclaration-2.C
new file mode 100644
index 0000000..4423e12
--- /dev/null
+++ b/gcc/testsuite/g++.dg/diagnostic/redeclaration-2.C
@@ -0,0 +1,19 @@
+// PR c++/103749
+
+struct foo {
+ template<typename>
+ friend struct bar;
+};
+
+struct bar { // { dg-error "redeclared as non-template" }
+ int baz;
+};
+
+template<typename>
+struct T; // { dg-message "previous" }
+
+struct T { // { dg-error "redeclared as non-template" }
+};
+
+bar var; // { dg-error "" }
+T t; // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/template/redecl4.C b/gcc/testsuite/g++.dg/template/redecl4.C
index 5638bde..c9282cd 100644
--- a/gcc/testsuite/g++.dg/template/redecl4.C
+++ b/gcc/testsuite/g++.dg/template/redecl4.C
@@ -2,4 +2,4 @@
// { dg-do compile }
template<int> union A; // { dg-message "previous" }
-struct A; // { dg-error "non-template" }
+struct A; // { dg-error "redeclared as non-template" }
diff --git a/gcc/testsuite/g++.dg/torture/pr103669.C b/gcc/testsuite/g++.dg/torture/pr103669.C
new file mode 100644
index 0000000..a9509c3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr103669.C
@@ -0,0 +1,22 @@
+// { dg-do run }
+/* { dg-additional-options "--param=modref-max-depth=1" } */
+#include <list>
+
+typedef std::list<void *> PtrList;
+
+void
+SlList (PtrList *l)
+{
+ PtrList temp = *l;
+ PtrList::iterator iter;
+ for (iter = temp.begin (); iter != temp.end (); ++iter)
+ __builtin_abort ();
+}
+
+int
+main (void)
+{
+ PtrList list;
+ SlList (&list);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/darwin-minversion-link.c b/gcc/testsuite/gcc.dg/darwin-minversion-link.c
index 765fb79..b6ede31 100644
--- a/gcc/testsuite/gcc.dg/darwin-minversion-link.c
+++ b/gcc/testsuite/gcc.dg/darwin-minversion-link.c
@@ -15,7 +15,8 @@
/* { dg-additional-options "-mmacosx-version-min=010.013.06 -DCHECK=101306" { target *-*-darwin17* } } */
/* { dg-additional-options "-mmacosx-version-min=010.014.05 -DCHECK=101405" { target *-*-darwin18* } } */
/* { dg-additional-options "-mmacosx-version-min=010.015.06 -DCHECK=101506" { target *-*-darwin19* } } */
-/* { dg-additional-options "-mmacosx-version-min=011.000.00 -DCHECK=110000" { target *-*-darwin20 } } */
+/* { dg-additional-options "-mmacosx-version-min=011.000.00 -DCHECK=110000" { target *-*-darwin20* } } */
+/* { dg-additional-options "-mmacosx-version-min=012.000.00 -DCHECK=120000" { target *-*-darwin21* } } */
int
main ()
diff --git a/gcc/testsuite/gcc.dg/pr100509.c b/gcc/testsuite/gcc.dg/pr100509.c
index 9405e2a..38e7002 100644
--- a/gcc/testsuite/gcc.dg/pr100509.c
+++ b/gcc/testsuite/gcc.dg/pr100509.c
@@ -1,5 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-O" } */
+/* { dg-require-alias "" } */
struct X {
int a;
diff --git a/gcc/testsuite/gcc.dg/pragma-diag-10.c b/gcc/testsuite/gcc.dg/pragma-diag-10.c
index 127b299..a1637be 100644
--- a/gcc/testsuite/gcc.dg/pragma-diag-10.c
+++ b/gcc/testsuite/gcc.dg/pragma-diag-10.c
@@ -1,7 +1,8 @@
/* PR middle-end/98512 - #pragma GCC diagnostic ignored ineffective
in conjunction with alias attribute
{ dg-do compile }
- { dg-options "-O2 -Wall" } */
+ { dg-options "-O2 -Wall" }
+ { dg-require-alias "" } */
void *
__rawmemchr_ppc (const void *s, int c)
diff --git a/gcc/testsuite/gcc.dg/uninit-pr89230-1.c b/gcc/testsuite/gcc.dg/uninit-pr89230-1.c
index dfc87a5..bf536e2 100644
--- a/gcc/testsuite/gcc.dg/uninit-pr89230-1.c
+++ b/gcc/testsuite/gcc.dg/uninit-pr89230-1.c
@@ -9,7 +9,7 @@ struct S { int i, j; };
int g (void)
{
struct S *p = f ();
- struct S *q; // { dg-bogus "may be used uninitialized" "uninitialized" { xfail *-*-* } }
+ struct S *q; // { dg-bogus "" "uninitialized" { xfail *-*-* } }
if (p->i || !(q = f ()) || p->j != q->i)
{
@@ -18,7 +18,7 @@ int g (void)
if (p->i)
return 1;
- if (!q) // { dg-bogus "\\\[-Wmaybe-uninitialized" }
+ if (!q) // { dg-bogus "\\\[-Wmaybe-uninitialized" "" { xfail *-*-* } }
return 2;
}
diff --git a/gcc/testsuite/gcc.dg/vect/pr103744-1.c b/gcc/testsuite/gcc.dg/vect/pr103744-1.c
new file mode 100644
index 0000000..1bc81e2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr103744-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+int r;
+
+void
+foo (short int *s, short int *d1, short int *d2, int z)
+{
+ int *a;
+
+ while (z < 1)
+ {
+ int i;
+
+ i = *s++ - (*d1++ + *d2++);
+ r += a[i];
+ i = *s++ - (*d1++ + *d2++);
+ r += a[i];
+ ++z;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/vect/pr103744-2.c b/gcc/testsuite/gcc.dg/vect/pr103744-2.c
new file mode 100644
index 0000000..52307ab
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr103744-2.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+
+int
+f1 (int *restrict x, unsigned short *restrict y)
+{
+ int res = 0;
+ for (int i = 0; i < 100; i += 2)
+ {
+ unsigned short i1 = y[i + 0] + 1;
+ unsigned short i2 = y[i + 1] + 2;
+ res += x[i1];
+ res += x[i2];
+ }
+ return res;
+}
+
+void
+f2 (int *restrict x, unsigned short *restrict y)
+{
+ int res1 = 0;
+ int res2 = 0;
+ for (int i = 0; i < 100; i += 2)
+ {
+ unsigned short i1 = y[i + 0] + 1;
+ unsigned short i2 = y[i + 1] + 2;
+ res1 += x[i1];
+ res2 += x[i2];
+ }
+ x[0] = res1;
+ x[1] = res2;
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr103611-2.c b/gcc/testsuite/gcc.target/i386/pr103611-2.c
new file mode 100644
index 0000000..1555e99
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr103611-2.c
@@ -0,0 +1,43 @@
+/* { dg-do compile } */
+/* { dg-options "-m32 -O2 -msse4" } */
+typedef int __v4si __attribute__ ((__vector_size__ (16)));
+
+long long test1(__v4si v) {
+ unsigned int loVal = (unsigned int)v[0];
+ unsigned int hiVal = (unsigned int)v[1];
+ return (long long)(loVal) | ((long long)(hiVal) << 32);
+}
+
+long long test2(__v4si v) {
+ unsigned int loVal = (unsigned int)v[2];
+ unsigned int hiVal = (unsigned int)v[3];
+ return (long long)(loVal) | ((long long)(hiVal) << 32);
+}
+
+long long test3(__v4si v) {
+ unsigned int loVal = (unsigned int)v[0];
+ unsigned int hiVal = (unsigned int)v[1];
+ return (long long)(loVal) ^ ((long long)(hiVal) << 32);
+}
+
+long long test4(__v4si v) {
+ unsigned int loVal = (unsigned int)v[2];
+ unsigned int hiVal = (unsigned int)v[3];
+ return (long long)(loVal) ^ ((long long)(hiVal) << 32);
+}
+
+long long test5(__v4si v) {
+ unsigned int loVal = (unsigned int)v[0];
+ unsigned int hiVal = (unsigned int)v[1];
+ return (long long)(loVal) + ((long long)(hiVal) << 32);
+}
+
+long long test6(__v4si v) {
+ unsigned int loVal = (unsigned int)v[2];
+ unsigned int hiVal = (unsigned int)v[3];
+ return (long long)(loVal) + ((long long)(hiVal) << 32);
+}
+
+/* { dg-final { scan-assembler-not "\tor" } } */
+/* { dg-final { scan-assembler-not "\txor" } } */
+/* { dg-final { scan-assembler-not "\tadd" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr32803.c b/gcc/testsuite/gcc.target/i386/pr32803.c
new file mode 100644
index 0000000..f26f07a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr32803.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-Oz" } */
+
+int foo()
+{
+ return 25;
+}
+
+/* { dg-final { scan-assembler "push" } } */
+/* { dg-final { scan-assembler "pop" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr98468.c b/gcc/testsuite/gcc.target/i386/pr98468.c
new file mode 100644
index 0000000..ca3aa256
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr98468.c
@@ -0,0 +1,35 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -mavx512vl -O2" } */
+/* { dg-final { scan-assembler-not "vxorp" } } */
+/* { dg-final { scan-assembler-not "vandnp" } } */
+
+#include<immintrin.h>
+__m128 f(__m128 val)
+{
+ return _mm_andnot_ps(_mm_set_ps1(0.0f), val);
+}
+
+__m256 f2(__m256 val)
+{
+ return _mm256_andnot_ps(_mm256_set1_ps(0.0f), val);
+}
+
+__m512 f3(__m512 val)
+{
+ return _mm512_andnot_ps(_mm512_set1_ps(0.0f), val);
+}
+
+__m128d f4(__m128d val)
+{
+ return _mm_andnot_pd(_mm_set_pd1(0.0), val);
+}
+
+__m256d f5(__m256d val)
+{
+ return _mm256_andnot_pd(_mm256_set1_pd(0.0), val);
+}
+
+__m512d f6(__m512d val)
+{
+ return _mm512_andnot_pd(_mm512_set1_pd(0.0), val);
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/darn-0.c b/gcc/testsuite/gcc.target/powerpc/darn-0.c
index f446f49..64d98f5 100644
--- a/gcc/testsuite/gcc.target/powerpc/darn-0.c
+++ b/gcc/testsuite/gcc.target/powerpc/darn-0.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-do compile } */
/* { dg-require-effective-target powerpc_p9vector_ok } */
/* { dg-skip-if "" { powerpc*-*-aix* } } */
/* { dg-options "-mdejagnu-cpu=power9" } */
diff --git a/gcc/testsuite/gcc.target/powerpc/darn-1.c b/gcc/testsuite/gcc.target/powerpc/darn-1.c
index 0938718..f483a89 100644
--- a/gcc/testsuite/gcc.target/powerpc/darn-1.c
+++ b/gcc/testsuite/gcc.target/powerpc/darn-1.c
@@ -1,12 +1,11 @@
-/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-do compile } */
/* { dg-require-effective-target powerpc_p9vector_ok } */
-/* { dg-require-effective-target lp64 } */
/* { dg-skip-if "" { powerpc*-*-aix* } } */
/* { dg-options "-mdejagnu-cpu=power9" } */
#include <altivec.h>
-long long get_conditioned_random ()
+long get_conditioned_random ()
{
return __builtin_darn ();
}
diff --git a/gcc/testsuite/gcc.target/powerpc/darn-2.c b/gcc/testsuite/gcc.target/powerpc/darn-2.c
index 64e44b2..56a9ffb 100644
--- a/gcc/testsuite/gcc.target/powerpc/darn-2.c
+++ b/gcc/testsuite/gcc.target/powerpc/darn-2.c
@@ -1,12 +1,11 @@
-/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-do compile } */
/* { dg-require-effective-target powerpc_p9vector_ok } */
-/* { dg-require-effective-target lp64 } */
/* { dg-skip-if "" { powerpc*-*-aix* } } */
/* { dg-options "-mdejagnu-cpu=power9" } */
#include <altivec.h>
-long long get_raw_random ()
+long get_raw_random ()
{
return __builtin_darn_raw ();
}
diff --git a/gcc/testsuite/gcc.target/powerpc/darn-3.c b/gcc/testsuite/gcc.target/powerpc/darn-3.c
index 477901f..4c68fad 100644
--- a/gcc/testsuite/gcc.target/powerpc/darn-3.c
+++ b/gcc/testsuite/gcc.target/powerpc/darn-3.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-do compile } */
/* { dg-skip-if "" { powerpc*-*-aix* } } */
/* { dg-options "-O2 -mdejagnu-cpu=power9" } */
diff --git a/gcc/testsuite/gcc.target/powerpc/fold-vec-insert-float-p9.c b/gcc/testsuite/gcc.target/powerpc/fold-vec-insert-float-p9.c
index 4541768..1c57672 100644
--- a/gcc/testsuite/gcc.target/powerpc/fold-vec-insert-float-p9.c
+++ b/gcc/testsuite/gcc.target/powerpc/fold-vec-insert-float-p9.c
@@ -31,5 +31,5 @@ testf_cst (float f, vector float vf)
/* { dg-final { scan-assembler-times {\mstfs\M} 2 { target ilp32 } } } */
/* { dg-final { scan-assembler-times {\mlxv\M} 2 { target ilp32 } } } */
/* { dg-final { scan-assembler-times {\mlvewx\M} 1 { target ilp32 } } } */
-/* { dg-final { scan-assembler-times {\mvperm\M} 2 { target ilp32 } } } */
-/* { dg-final { scan-assembler-times {\mxxperm\M} 1 { target ilp32 } } } */
+/* { dg-final { scan-assembler-times {\mvperm\M} 1 { target ilp32 } } } */
+/* { dg-final { scan-assembler-times {\mxxperm\M} 2 { target ilp32 } } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/pr97142.c b/gcc/testsuite/gcc.target/powerpc/pr97142.c
index 0e5f1c1..dd10b06 100644
--- a/gcc/testsuite/gcc.target/powerpc/pr97142.c
+++ b/gcc/testsuite/gcc.target/powerpc/pr97142.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-Ofast" } */
+/* { dg-options "-Ofast -mdejagnu-cpu=power7" } */
#include <math.h>
diff --git a/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
index e8ba63a..3b1fc6d 100644
--- a/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
+++ b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
@@ -1,3 +1,4 @@
+/* { dg-require-ifunc "" } */
/* { dg-options "-O2 -mlong-double-128 -mabi=ibmlongdouble" } */
extern unsigned long int x;
diff --git a/gcc/testsuite/gfortran.dg/illegal_boz_arg_2.f90 b/gcc/testsuite/gfortran.dg/illegal_boz_arg_2.f90
new file mode 100644
index 0000000..3e5f6b6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/illegal_boz_arg_2.f90
@@ -0,0 +1,6 @@
+! { dg-do compile }
+! PR fortran/103412
+
+program p
+ integer, parameter :: a = sizeof(z'1') ! { dg-error "cannot be an actual" }
+end
diff --git a/gcc/testsuite/obj-c++.dg/cxx-ivars-3.mm b/gcc/testsuite/obj-c++.dg/cxx-ivars-3.mm
index 0712355..27bae63 100644
--- a/gcc/testsuite/obj-c++.dg/cxx-ivars-3.mm
+++ b/gcc/testsuite/obj-c++.dg/cxx-ivars-3.mm
@@ -2,7 +2,7 @@
// { dg-do run { target *-*-darwin* } }
// { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } }
-// { dg-skip-if "Headers incompatible with 10.4 APIs" { *-*-darwin1[1-9]* *-*-darwin2[0-9]* } { "-fnext-runtime" } { "" } }
+// { dg-skip-if "Headers incompatible with 10.4 APIs" { *-*-darwin1[1-9]* *-*-darwin2* } { "-fnext-runtime" } { "" } }
// { dg-additional-options "-fobjc-call-cxx-cdtors -mmacosx-version-min=10.4 -framework Foundation" }
// This test has no equivalent or meaning for m64/ABI V2
// { dg-xfail-run-if "No Test Avail" { *-*-darwin* && lp64 } { "-fnext-runtime" } { "" } }
diff --git a/gcc/testsuite/obj-c++.dg/objc-gc-3.mm b/gcc/testsuite/obj-c++.dg/objc-gc-3.mm
index 45ffbc5..18f2cbe 100644
--- a/gcc/testsuite/obj-c++.dg/objc-gc-3.mm
+++ b/gcc/testsuite/obj-c++.dg/objc-gc-3.mm
@@ -3,7 +3,7 @@
/* Contributed by Ziemowit Laski <zlaski@apple.com> */
/* { dg-do compile } */
-/* { dg-skip-if "GC API is an error from Darwin16." { *-*-darwin1[6-9]* *-*-darwin2[0-9]* } { "-fnext-runtime" } { "" } } */
+/* { dg-skip-if "GC API is an error from Darwin16." { *-*-darwin1[6-9]* *-*-darwin2* } { "-fnext-runtime" } { "" } } */
/* { dg-options "-fobjc-gc" } */
/* { dg-prune-output "cc1objplus: warning: '-fobjc-gc' is ignored for '-fgnu-runtime'" } */
diff --git a/gcc/testsuite/objc.dg/objc-gc-4.m b/gcc/testsuite/objc.dg/objc-gc-4.m
index 8102a5a..1b2d9674 100644
--- a/gcc/testsuite/objc.dg/objc-gc-4.m
+++ b/gcc/testsuite/objc.dg/objc-gc-4.m
@@ -3,7 +3,7 @@
/* Contributed by Ziemowit Laski <zlaski@apple.com> */
/* { dg-do compile } */
-/* { dg-skip-if "GC API is an error from Darwin16." { *-*-darwin1[6-9]* *-*-darwin2[0-9]* } { "-fnext-runtime" } { "" } } */
+/* { dg-skip-if "GC API is an error from Darwin16." { *-*-darwin1[6-9]* *-*-darwin2* } { "-fnext-runtime" } { "" } } */
/* { dg-options "-fobjc-gc" } */
/* { dg-prune-output "cc1obj: warning: '-fobjc-gc' is ignored for '-fgnu-runtime'" } */
diff --git a/gcc/tree-core.h b/gcc/tree-core.h
index 91ae523..9b37a06 100644
--- a/gcc/tree-core.h
+++ b/gcc/tree-core.h
@@ -2077,7 +2077,9 @@ struct attribute_spec {
/* The minimum length of the list of arguments of the attribute. */
int min_length;
/* The maximum length of the list of arguments of the attribute
- (-1 for no maximum). */
+ (-1 for no maximum). It can also be -2 for fake attributes
+ created for the sake of -Wno-attributes; in that case, we
+ should skip the balanced token sequence when parsing the attribute. */
int max_length;
/* Whether this attribute requires a DECL. If it does, it will be passed
from types of DECLs, function return types and array element types to
diff --git a/gcc/tree-object-size.c b/gcc/tree-object-size.c
index 71f6b74..ee9ea1b 100644
--- a/gcc/tree-object-size.c
+++ b/gcc/tree-object-size.c
@@ -83,30 +83,13 @@ static bitmap computed[OST_END];
/* Maximum value of offset we consider to be addition. */
static unsigned HOST_WIDE_INT offset_limit;
-/* Initial value of object sizes; zero for maximum and SIZE_MAX for minimum
- object size. */
-
-static inline unsigned HOST_WIDE_INT
-initval (int object_size_type)
-{
- return (object_size_type & OST_MINIMUM) ? HOST_WIDE_INT_M1U : 0;
-}
-
-/* Unknown object size value; it's the opposite of initval. */
-
-static inline unsigned HOST_WIDE_INT
-unknown (int object_size_type)
-{
- return ~initval (object_size_type);
-}
-
/* Return true if VAL is represents an unknown size for OBJECT_SIZE_TYPE. */
static inline bool
size_unknown_p (tree val, int object_size_type)
{
- return (tree_fits_uhwi_p (val)
- && tree_to_uhwi (val) == unknown (object_size_type));
+ return ((object_size_type & OST_MINIMUM)
+ ? integer_zerop (val) : integer_all_onesp (val));
}
/* Return a tree with initial value for OBJECT_SIZE_TYPE. */
@@ -114,7 +97,8 @@ size_unknown_p (tree val, int object_size_type)
static inline tree
size_initval (int object_size_type)
{
- return size_int (initval (object_size_type));
+ return ((object_size_type & OST_MINIMUM)
+ ? TYPE_MAX_VALUE (sizetype) : size_zero_node);
}
/* Return a tree with unknown value for OBJECT_SIZE_TYPE. */
@@ -122,7 +106,8 @@ size_initval (int object_size_type)
static inline tree
size_unknown (int object_size_type)
{
- return size_int (unknown (object_size_type));
+ return ((object_size_type & OST_MINIMUM)
+ ? size_zero_node : TYPE_MAX_VALUE (sizetype));
}
/* Grow object_sizes[OBJECT_SIZE_TYPE] to num_ssa_names. */
diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
index 3eac9b1..714deab 100644
--- a/gcc/tree-ssa-phiopt.c
+++ b/gcc/tree-ssa-phiopt.c
@@ -900,6 +900,8 @@ gimple_simplify_phiopt (bool early_p, tree type, gimple *comp_stmt,
result = maybe_push_res_to_seq (&op, &seq1);
if (result)
{
+ if (loc != UNKNOWN_LOCATION)
+ annotate_all_with_location (seq1, loc);
gimple_seq_add_seq_without_update (seq, seq1);
return result;
}
@@ -929,6 +931,8 @@ gimple_simplify_phiopt (bool early_p, tree type, gimple *comp_stmt,
result = maybe_push_res_to_seq (&op1, &seq1);
if (result)
{
+ if (loc != UNKNOWN_LOCATION)
+ annotate_all_with_location (seq1, loc);
gimple_seq_add_seq_without_update (seq, seq1);
return result;
}
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index ad90cdb..c842d50 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -9249,6 +9249,8 @@ vectorizable_load (vec_info *vinfo,
group_size = vec_num = 1;
group_gap_adj = 0;
ref_type = reference_alias_ptr_type (DR_REF (first_dr_info->dr));
+ if (slp)
+ vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
}
gcc_assert (alignment_support_scheme);
@@ -9594,7 +9596,7 @@ vectorizable_load (vec_info *vinfo,
final_mask = prepare_vec_mask (loop_vinfo, mask_vectype,
final_mask, vec_mask, gsi);
- if (i > 0)
+ if (i > 0 && !STMT_VINFO_GATHER_SCATTER_P (stmt_info))
dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr, ptr_incr,
gsi, stmt_info, bump);
@@ -9611,7 +9613,7 @@ vectorizable_load (vec_info *vinfo,
&& gs_info.ifn != IFN_LAST)
{
if (STMT_VINFO_GATHER_SCATTER_P (stmt_info))
- vec_offset = vec_offsets[j];
+ vec_offset = vec_offsets[vec_num * j + i];
tree zero = build_zero_cst (vectype);
tree scale = size_int (gs_info.scale);
gcall *call;