Commit graph

202993 commits

Author SHA1 Message Date
Andrew Pinski
58f1e185ff MATCH: Extend min_value/max_value to pointer types
Since we already had the infrastructure to optimize
`(x == 0) && (x > y)` to false for integer types,
this extends the same to pointer types as indirectly
requested by PR 96695.

OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.

gcc/ChangeLog:

	PR tree-optimization/96695
	* match.pd (min_value, max_value): Extend to
	pointer types too.

gcc/testsuite/ChangeLog:

	PR tree-optimization/96695
	* gcc.dg/pr96695-1.c: New test.
	* gcc.dg/pr96695-10.c: New test.
	* gcc.dg/pr96695-11.c: New test.
	* gcc.dg/pr96695-12.c: New test.
	* gcc.dg/pr96695-2.c: New test.
	* gcc.dg/pr96695-3.c: New test.
	* gcc.dg/pr96695-4.c: New test.
	* gcc.dg/pr96695-5.c: New test.
	* gcc.dg/pr96695-6.c: New test.
	* gcc.dg/pr96695-7.c: New test.
	* gcc.dg/pr96695-8.c: New test.
	* gcc.dg/pr96695-9.c: New test.
2023-08-07 00:29:43 -07:00
GCC Administrator
2a0b19f525 Daily bump. 2023-08-07 00:16:55 +00:00
Roger Sayle
529909f9e9 [Committed] Avoid FAIL of gcc.target/i386/pr110792.c
My apologies (again), I managed to mess up the 64-bit version of the
test case for PR 110792.  Unlike the 32-bit version, the 64-bit case
contains exactly the same load instructions, just in a different order
making the correct and incorrect behaviours impossible to distinguish
with a scan-assembler-not.  Somewhere between checking that this test
failed in a clean tree without the patch, and getting the escaping
correct, I'd failed to notice that this also FAILs in the patched tree.
Doh!  Instead of removing the test completely, I've left it as a
compilation test.

The original fix is tested by the 32-bit test case.

Committed to mainline as obvious.  Sorry for the incovenience.

2023-08-06  Roger Sayle  <roger@nextmovesoftware.com>

gcc/testsuite/ChangeLog
	PR target/110792
	* gcc.target/i386/pr110792.c: Remove dg-final scan-assembler-not.
2023-08-06 23:19:10 +01:00
Jan Hubicka
1fc96cdd0a Add builtin_expect to predict that CPU supports cpuid to cpuid.h
This is needed to avoid impossible threading update in vectorizer testcase,
but should also reflect reality on most CPUs we care about.

gcc/ChangeLog:

	* config/i386/cpuid.h (__get_cpuid_count, __get_cpuid_max): Add
	__builtin_expect that CPU likely supports cpuid.
2023-08-06 22:53:14 +02:00
Jan Hubicka
e3e6db4364 Disable loop distribution for loops with estimated iterations 0
This prevents useless loop distribiton produced in hmmer.  With FDO we now
correctly work out that the loop created for last iteraiton is not going to
iterate however loop distribution still produces a verioned loop that has no
chance to survive loop vectorizer since we only keep distributed loops
when loop vectorization suceeds and it requires number of (header) iterations
to exceed the vectorization factor.

gcc/ChangeLog:

	* tree-loop-distribution.cc (loop_distribution::execute): Disable
	distribution for loops with estimated iterations 0.
2023-08-06 22:33:33 +02:00
Jan Hubicka
838237aeeb Fix profile update after peeled epilogues
Epilogue peeling expects the scalar loop to have same number of executions as
the vector loop which is true at the beggining of vectorization. However if the
epilogues are vectorized, this is no longer the case.  In this situation the
loop preheader is replaced by new guard code with correct profile, however
loop body is left unscaled.  This leads to loop that exists more often then
it is entered.

This patch add slogic to scale the frequencies down and also to fix profile
of original preheader where necesary.

Bootstrapped/regtested x86_64-linux, comitted.

gcc/ChangeLog:

	* tree-vect-loop-manip.cc (vect_do_peeling): Fix profile update of peeled epilogues.

gcc/testsuite/ChangeLog:

	* gcc.dg/vect/vect-bitfield-read-1.c: Check profile consistency.
	* gcc.dg/vect/vect-bitfield-read-2.c: Check profile consistency.
	* gcc.dg/vect/vect-bitfield-read-3.c: Check profile consistency.
	* gcc.dg/vect/vect-bitfield-read-4.c: Check profile consistency.
	* gcc.dg/vect/vect-bitfield-read-5.c: Check profile consistency.
	* gcc.dg/vect/vect-bitfield-read-6.c: Check profile consistency.
	* gcc.dg/vect/vect-bitfield-read-7.c: Check profile consistency.
	* gcc.dg/vect/vect-bitfield-write-1.c: Check profile consistency.
	* gcc.dg/vect/vect-bitfield-write-2.c: Check profile consistency.
	* gcc.dg/vect/vect-bitfield-write-3.c: Check profile consistency.
	* gcc.dg/vect/vect-bitfield-write-4.c: Check profile consistency.
	* gcc.dg/vect/vect-bitfield-write-5.c: Check profile consistency.
	* gcc.dg/vect/vect-epilogues-2.c: Check profile consistency.
	* gcc.dg/vect/vect-epilogues.c: Check profile consistency.
	* gcc.dg/vect/vect-mask-store-move-1.c: Check profile consistency.
2023-08-06 21:23:31 +02:00
François Dumont
3802297528 libstdc++: [_GLIBCXX_INLINE_VERSION] Add __cxa_call_terminate symbol export
libstdc++-v3/ChangeLog:

	* config/abi/pre/gnu-versioned-namespace.ver: Add __cxa_call_terminate
	symbol export.
2023-08-06 14:29:07 +02:00
GCC Administrator
87b0749cfb Daily bump. 2023-08-06 00:16:37 +00:00
Gaius Mulley
0826ebd633 PR modula2/110779 SysClock can not read the clock
This patch completes the implementation of the ISO module
SysClock.mod.  Three new testcases are provided.  wrapclock.{cc,def}
are new support files providing access to clock_settime, clock_gettime
and glibc timezone variables.

gcc/m2/ChangeLog:

	PR modula2/110779
	* gm2-libs-iso/SysClock.mod: Re-implement using wrapclock.
	* gm2-libs-iso/wrapclock.def: New file.

libgm2/ChangeLog:

	PR modula2/110779
	* config.h.in: Regenerate.
	* configure: Regenerate.
	* configure.ac (GM2_CHECK_LIB): Check for clock_gettime
	and clock_settime.
	* libm2iso/Makefile.am (M2DEFS): Add wrapclock.def.
	* libm2iso/Makefile.in: Regenerate.
	* libm2iso/wraptime.cc: Replace HAVE_TIMEVAL with
	HAVE_STRUCT_TIMEVAL.
	* libm2iso/wrapclock.cc: New file.

gcc/testsuite/ChangeLog:

	PR modula2/110779
	* gm2/iso/run/pass/m2date.mod: New test.
	* gm2/iso/run/pass/testclock.mod: New test.
	* gm2/iso/run/pass/testclock2.mod: New test.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2023-08-05 17:35:12 +01:00
Martin Uecker
39f413fc4b c: Less warnings for parameters declared as arrays [PR98536]
To avoid false positivies, tune the warnings for parameters declared
as arrays with size expressions.  Do not warn when more bounds are
specified in the declaration than before.

	PR c/98536

gcc/c-family/:
	* c-warn.cc (warn_parm_array_mismatch): Do not warn if more
	bounds are specified.

gcc/testsuite:
	* gcc.dg/Wvla-parameter-4.c: Adapt test.
	* gcc.dg/attr-access-2.c: Adapt test.
2023-08-05 18:09:58 +02:00
Martin Uecker
54be338589 c: _Generic should not warn in non-active branches [PR68193,PR97100,PR110703]
To avoid false diagnostics, use c_inhibit_evaluation_warnings when
a generic association is known to not match during parsing.  We may
still generate false positives if the default branch comes earler than
a specific association that matches.

PR c/68193
PR c/97100
PR c/110703

gcc/c/:
	* c-parser.cc (c_parser_generic_selection): Inhibit evaluation
	warnings branches that are known not be taken during parsing.

gcc/testsuite/ChangeLog:
	* gcc.dg/pr68193.c: New test.
2023-08-05 10:39:44 +02:00
GCC Administrator
5b42ee2cde Daily bump. 2023-08-05 00:17:11 +00:00
Xiao Zeng
4e87c953d1 [PATCH v3] [RISC-V] Generate Zicond instruction for select pattern with condition eq or neq to 0
This patch recognizes Zicond patterns when the select pattern
with condition eq or neq to 0 (using eq as an example), namely:

1 rd = (rs2 == 0) ? non-imm : 0
2 rd = (rs2 == 0) ? non-imm : non-imm
3 rd = (rs2 == 0) ? reg : non-imm
4 rd = (rs2 == 0) ? reg : reg

gcc/ChangeLog:

	* config/riscv/riscv.cc (riscv_expand_conditional_move): Recognize
	more Zicond patterns.  Fix whitespace typo.
	(riscv_rtx_costs): Remove accidental code duplication.

	Co-authored-by: Jeff Law <jlaw@ventanamicro.com>
2023-08-04 17:25:30 -04:00
David Malcolm
021077b947 analyzer: handle function attribute "alloc_size" [PR110426]
This patch makes -fanalyzer make use of the function attribute
"alloc_size", allowing -fanalyzer to emit -Wanalyzer-allocation-size,
-Wanalyzer-out-of-bounds, and -Wanalyzer-tainted-allocation-size on
execution paths involving allocations using such functions.

gcc/analyzer/ChangeLog:
	PR analyzer/110426
	* bounds-checking.cc (region_model::check_region_bounds): Handle
	symbolic base regions.
	* call-details.cc: Include "stringpool.h" and "attribs.h".
	(call_details::lookup_function_attribute): New function.
	* call-details.h (call_details::lookup_function_attribute): New
	function decl.
	* region-model-manager.cc
	(region_model_manager::maybe_fold_binop): Add reference to
	PR analyzer/110902.
	* region-model-reachability.cc (reachable_regions::handle_sval):
	Add symbolic regions for pointers that are conjured svalues for
	the LHS of a stmt.
	* region-model.cc (region_model::canonicalize): Purge dynamic
	extents for regions that aren't referenced.
	(get_result_size_in_bytes): New function.
	(region_model::on_call_pre): Use get_result_size_in_bytes and
	potentially set the dynamic extents of the region pointed to by
	the return value.
	(region_model::deref_rvalue): Add param "add_nonnull_constraint"
	and use it to conditionalize adding the constraint.
	(pending_diagnostic_subclass::dubious_allocation_size): Add "stmt"
	param to both ctors and use it to initialize new "m_stmt" field.
	(pending_diagnostic_subclass::operator==): Use m_stmt; don't use
	m_lhs or m_rhs.
	(pending_diagnostic_subclass::m_stmt): New field.
	(region_model::check_region_size): Generalize to any kind of
	pointer svalue by using deref_rvalue rather than checking for
	region_svalue.  Pass stmt to dubious_allocation_size ctor.
	* region-model.h (region_model::deref_rvalue): Add param
	"add_nonnull_constraint".
	* svalue.cc (conjured_svalue::lhs_value_p): New function.
	* svalue.h (conjured_svalue::lhs_value_p): New decl.

gcc/testsuite/ChangeLog:
	PR analyzer/110426
	* gcc.dg/analyzer/allocation-size-1.c: Update expected message to
	reflect consolidation of size and assignment into a single event.
	* gcc.dg/analyzer/allocation-size-2.c: Likewise.
	* gcc.dg/analyzer/allocation-size-3.c: Likewise.
	* gcc.dg/analyzer/allocation-size-4.c: Likewise.
	* gcc.dg/analyzer/allocation-size-multiline-1.c: Likewise.
	* gcc.dg/analyzer/allocation-size-multiline-2.c: Likewise.
	* gcc.dg/analyzer/allocation-size-multiline-3.c: Likewise.
	* gcc.dg/analyzer/attr-alloc_size-1.c: New test.
	* gcc.dg/analyzer/attr-alloc_size-2.c: New test.
	* gcc.dg/analyzer/attr-alloc_size-3.c: New test.
	* gcc.dg/analyzer/explode-4.c: New test.
	* gcc.dg/analyzer/taint-size-1.c: Add test coverage for
	__attribute__ alloc_size.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2023-08-04 16:18:40 -04:00
David Malcolm
187b213ddb analyzer: fix some svalue::dump_to_pp implementations
gcc/analyzer/ChangeLog:
	* svalue.cc (region_svalue::dump_to_pp): Support NULL type.
	(constant_svalue::dump_to_pp): Likewise.
	(initial_svalue::dump_to_pp): Likewise.
	(conjured_svalue::dump_to_pp): Likewise.  Fix missing print of the
	type.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2023-08-04 16:17:12 -04:00
Yan Simonaytes
567d06bb35 i386: eliminate redundant operands of VPTERNLOG
As mentioned in PR 110202, GCC may be presented with input where control
word of the VPTERNLOG intrinsic implies that some of its operands do not
affect the result.  In that case, we can eliminate redundant operands
of the instruction by substituting any other operand in their place.
This removes false dependencies.

For instance, instead of (252 = 0xfc = _MM_TERNLOG_A | _MM_TERNLOG_B)

	vpternlogq	$252, %zmm2, %zmm1, %zmm0

emit

	vpternlogq	$252, %zmm0, %zmm1, %zmm0

When VPTERNLOG is invariant w.r.t first and second operands, and the
third operand is memory, load memory into the output operand first, i.e.
instead of (85 = 0x55 = ~_MM_TERNLOG_C)

	vpternlogq	$85, (%rdi), %zmm1, %zmm0

emit

	vmovdqa64	(%rdi), %zmm0
	vpternlogq	$85, %zmm0, %zmm0, %zmm0

gcc/ChangeLog:

	PR target/110202
	* config/i386/i386-protos.h
	(vpternlog_redundant_operand_mask): Declare.
	(substitute_vpternlog_operands): Declare.
	* config/i386/i386.cc
	(vpternlog_redundant_operand_mask): New helper.
	(substitute_vpternlog_operands): New function.  Use them...
	* config/i386/sse.md: ... here in new VPTERNLOG define_splits.

gcc/testsuite/ChangeLog:

	PR target/110202
	* gcc.target/i386/invariant-ternlog-1.c: New test.
	* gcc.target/i386/invariant-ternlog-2.c: New test.
2023-08-04 19:43:51 +03:00
Roger Sayle
c572f09a75 Specify signed/unsigned/dontcare in calls to extract_bit_field_1.
This patch is inspired by Jakub's work on PR rtl-optimization/110717.
The bitfield example described in comment #2, looks like:

struct S { __int128 a : 69; };
unsigned type bar (struct S *p) {
  return p->a;
}

which on x86_64 with -O2 currently generates:

bar:    movzbl  8(%rdi), %ecx
        movq    (%rdi), %rax
        andl    $31, %ecx
        movq    %rcx, %rdx
        salq    $59, %rdx
        sarq    $59, %rdx
        ret

The ANDL $31 is interesting... we first extract an unsigned 69-bit bitfield
by masking/clearing the top bits of the most significant word, and then
it gets sign-extended, by left shifting and arithmetic right shifting.
Obviously, this bit-wise AND is redundant, for signed bit-fields, we don't
require these bits to be cleared, if we're about to set them appropriately.

This patch eliminates this redundancy in the middle-end, during RTL
expansion, but extending the extract_bit_field APIs so that the integer
UNSIGNEDP argument takes a special value; 0 indicates the field should
be sign extended, 1 (any non-zero value) indicates the field should be
zero extended, but -1 indicates a third option, that we don't care how
or whether the field is extended.  By passing and checking this sentinel
value at the appropriate places we avoid the useless bit masking (on
all targets).

For the test case above, with this patch we now generate:

bar:    movzbl  8(%rdi), %ecx
        movq    (%rdi), %rax
        movq    %rcx, %rdx
        salq    $59, %rdx
        sarq    $59, %rdx
        ret

2023-08-04  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
	* expmed.cc (extract_bit_field_1): Document that an UNSIGNEDP
	value of -1 is equivalent to don't care.
	(extract_integral_bit_field): Indicate that we don't require
	the most significant word to be zero extended, if we're about
	to sign extend it.
	(extract_fixed_bit_field_1): Document that an UNSIGNEDP value
	of -1 is equivalent to don't care.  Don't clear the most
	significant bits with AND mask when UNSIGNEDP is -1.

gcc/testsuite/ChangeLog
	* gcc.target/i386/pr110717-2.c: New test case.
2023-08-04 16:26:06 +01:00
Roger Sayle
faa2202ee7 i386: Split SUBREGs of SSE vector registers into vec_select insns.
This patch is the final piece in the series to improve the ABI issues
affecting PR 88873.  The previous patches tackled inserting DFmode
values into V2DFmode registers, by introducing insvti_{low,high}part
patterns.  This patch improves the extraction of DFmode values from
V2DFmode registers via TImode intermediates.

I'd initially thought this would require new extvti_{low,high}part
patterns to be defined, but all that's required is to recognize that
the SUBREG idioms produced by combine are equivalent to (forms of)
vec_select patterns.  The target-independent middle-end can't be sure
that the appropriate vec_select instruction exists on the target,
hence doesn't canonicalize a SUBREG of a vector mode as a vec_select,
but the backend can provide a define_split stating where and when
this is useful, for example, considering whether the operand is in
memory, or whether !TARGET_SSE_MATH and the destination is i387.

For pr88873.c, gcc -O2 -march=cascadelake currently generates:

foo:    vpunpcklqdq     %xmm3, %xmm2, %xmm7
        vpunpcklqdq     %xmm1, %xmm0, %xmm6
        vpunpcklqdq     %xmm5, %xmm4, %xmm2
        vmovdqa %xmm7, -24(%rsp)
        vmovdqa %xmm6, %xmm1
        movq    -16(%rsp), %rax
        vpinsrq $1, %rax, %xmm7, %xmm4
        vmovapd %xmm4, %xmm6
        vfmadd132pd     %xmm1, %xmm2, %xmm6
        vmovapd %xmm6, -24(%rsp)
        vmovsd  -16(%rsp), %xmm1
        vmovsd  -24(%rsp), %xmm0
        ret

with this patch, we now generate:

foo:	vpunpcklqdq     %xmm1, %xmm0, %xmm6
        vpunpcklqdq     %xmm3, %xmm2, %xmm7
        vpunpcklqdq     %xmm5, %xmm4, %xmm2
        vmovdqa %xmm6, %xmm1
        vfmadd132pd     %xmm7, %xmm2, %xmm1
        vmovsd  %xmm1, %xmm1, %xmm0
        vunpckhpd       %xmm1, %xmm1, %xmm1
        ret

The improvement is even more dramatic when compared to the original
29 instructions shown in comment #8.  GCC 13, for example, required
12 transfers to/from memory.

2023-08-04  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
	* config/i386/sse.md (define_split): Convert highpart:DF extract
	from V2DFmode register into a sse2_storehpd instruction.
	(define_split): Likewise, convert lowpart:DF extract from V2DF
	register into a sse2_storelpd instruction.

gcc/testsuite/ChangeLog
	* gcc.target/i386/pr88873.c: Tweak to check for improved code.
2023-08-04 16:23:38 +01:00
Qing Zhao
44e3f39a3d Add documentation for -Wflex-array-member-not-at-end.
'-Wflex-array-member-not-at-end (C and C++ only)'
     Warn when a structure containing a C99 flexible array member as the
     last field is not at the end of another structure.  This warning
     warns e.g.  about

          struct flex  { int length; char data[]; };
          struct mid_flex { int m; struct flex flex_data; int n; };

gcc/ChangeLog:

	* doc/invoke.texi (-Wflex-array-member-not-at-end): Document
	new option.
2023-08-04 14:24:32 +00:00
Vladimir N. Makarov
abf953042a LRA: Check input insn pattern hard regs against early clobber hard regs for live info
For the test case LRA generates wrong code for AVR cpymem_qi insn:

	(insn 16 15 17 3 (parallel [
            (set (mem:BLK (reg:HI 26 r26) [0  A8])
                (mem:BLK (reg:HI 30 r30) [0  A8]))
            (unspec [
                    (const_int 0 [0])
                ] UNSPEC_CPYMEM)
            (use (reg:QI 52))
            (clobber (reg:HI 26 r26))
            (clobber (reg:HI 30 r30))
            (clobber (reg:QI 0 r0))
            (clobber (reg:QI 52))
        ]) "t.c":16:22 132 {cpymem_qi}

The insn gets the same value in r26 and r30.  The culprit is clobbering
r30 and using r30 as input.  For such situation LRA wrongly assumes that
r30 does not live before the insn.  The patch is fixing it.

gcc/ChangeLog:

	* lra-lives.cc (process_bb_lives): Check input insn pattern hard regs
	against early clobber hard regs.

gcc/testsuite/ChangeLog:

	* gcc.target/avr/lra-cpymem_qi.c: New.
2023-08-04 09:10:46 -04:00
Tamar Christina
046640f9e5 middle-end: clean up vect testsuite using pragma novector
The support for early break vectorization breaks lots of scan vect and slp
testcases because they assume that loops with abort () in them cannot be
vectorized.  Additionally it breaks the point of having a scalar loop to check
the output of the vectorizer if that loop is also vectorized.

For that reason this adds

vectorized using this patch series.

FWIW, none of these tests were failing to vectorize or run before the pragma.
The tests that did point to some issues were copies to the early break test
suit as well.

gcc/testsuite/ChangeLog:

	* g++.dg/vect/pr84556.cc: Add novector pragma.
	* g++.dg/vect/simd-1.cc: Add novector pragma.
	* g++.dg/vect/simd-2.cc: Add novector pragma.
	* g++.dg/vect/simd-3.cc: Add novector pragma.
	* g++.dg/vect/simd-4.cc: Add novector pragma.
	* g++.dg/vect/simd-5.cc: Add novector pragma.
	* g++.dg/vect/simd-6.cc: Add novector pragma.
	* g++.dg/vect/simd-7.cc: Add novector pragma.
	* g++.dg/vect/simd-8.cc: Add novector pragma.
	* g++.dg/vect/simd-9.cc: Add novector pragma.
	* g++.dg/vect/simd-clone-6.cc: Add novector pragma.
	* gcc.dg/vect/O3-pr70130.c: Add novector pragma.
	* gcc.dg/vect/Os-vect-95.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-1.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-16.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-2.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-24.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-25.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-26.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-27.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-28.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-29.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-42.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-cond-1.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-over-widen-1.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-over-widen-2.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-pattern-1.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-pattern-2.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-pow-1.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-pr101615-2.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-pr65935.c: Add novector pragma.
	* gcc.dg/vect/bb-slp-subgroups-1.c: Add novector pragma.
	* gcc.dg/vect/costmodel/i386/costmodel-vect-31.c: Add novector pragma.
	* gcc.dg/vect/costmodel/i386/costmodel-vect-33.c: Add novector pragma.
	* gcc.dg/vect/costmodel/i386/costmodel-vect-68.c: Add novector pragma.
	* gcc.dg/vect/costmodel/ppc/costmodel-slp-12.c: Add novector pragma.
	* gcc.dg/vect/costmodel/ppc/costmodel-slp-33.c: Add novector pragma.
	* gcc.dg/vect/costmodel/ppc/costmodel-slp-34.c: Add novector pragma.
	* gcc.dg/vect/costmodel/ppc/costmodel-vect-31a.c: Add novector pragma.
	* gcc.dg/vect/costmodel/ppc/costmodel-vect-31b.c: Add novector pragma.
	* gcc.dg/vect/costmodel/ppc/costmodel-vect-31c.c: Add novector pragma.
	* gcc.dg/vect/costmodel/ppc/costmodel-vect-33.c: Add novector pragma.
	* gcc.dg/vect/costmodel/ppc/costmodel-vect-68a.c: Add novector pragma.
	* gcc.dg/vect/costmodel/ppc/costmodel-vect-68b.c: Add novector pragma.
	* gcc.dg/vect/costmodel/ppc/costmodel-vect-68c.c: Add novector pragma.
	* gcc.dg/vect/costmodel/ppc/costmodel-vect-76a.c: Add novector pragma.
	* gcc.dg/vect/costmodel/ppc/costmodel-vect-76b.c: Add novector pragma.
	* gcc.dg/vect/costmodel/ppc/costmodel-vect-76c.c: Add novector pragma.
	* gcc.dg/vect/costmodel/ppc/costmodel-vect-outer-fir.c: Add novector pragma.
	* gcc.dg/vect/costmodel/x86_64/costmodel-vect-31.c: Add novector pragma.
	* gcc.dg/vect/costmodel/x86_64/costmodel-vect-33.c: Add novector pragma.
	* gcc.dg/vect/costmodel/x86_64/costmodel-vect-68.c: Add novector pragma.
	* gcc.dg/vect/fast-math-bb-slp-call-1.c: Add novector pragma.
	* gcc.dg/vect/fast-math-bb-slp-call-2.c: Add novector pragma.
	* gcc.dg/vect/fast-math-vect-call-1.c: Add novector pragma.
	* gcc.dg/vect/fast-math-vect-call-2.c: Add novector pragma.
	* gcc.dg/vect/fast-math-vect-complex-3.c: Add novector pragma.
	* gcc.dg/vect/if-cvt-stores-vect-ifcvt-18.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-noreassoc-outer-1.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-noreassoc-outer-2.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-noreassoc-outer-3.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-noreassoc-outer-5.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-10.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-10a.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-10b.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-11.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-12.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-15.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-16.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-17.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-18.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-19.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-20.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-21.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-22.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-3.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-4.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-5.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-6-global.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-6.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-7.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-8.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-9.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-9a.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-outer-9b.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-slp-30.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-slp-31.c: Add novector pragma.
	* gcc.dg/vect/no-scevccp-vect-iv-2.c: Add novector pragma.
	* gcc.dg/vect/no-section-anchors-vect-31.c: Add novector pragma.
	* gcc.dg/vect/no-section-anchors-vect-34.c: Add novector pragma.
	* gcc.dg/vect/no-section-anchors-vect-36.c: Add novector pragma.
	* gcc.dg/vect/no-section-anchors-vect-64.c: Add novector pragma.
	* gcc.dg/vect/no-section-anchors-vect-65.c: Add novector pragma.
	* gcc.dg/vect/no-section-anchors-vect-66.c: Add novector pragma.
	* gcc.dg/vect/no-section-anchors-vect-68.c: Add novector pragma.
	* gcc.dg/vect/no-section-anchors-vect-69.c: Add novector pragma.
	* gcc.dg/vect/no-section-anchors-vect-outer-4h.c: Add novector pragma.
	* gcc.dg/vect/no-trapping-math-2.c: Add novector pragma.
	* gcc.dg/vect/no-trapping-math-vect-111.c: Add novector pragma.
	* gcc.dg/vect/no-trapping-math-vect-ifcvt-11.c: Add novector pragma.
	* gcc.dg/vect/no-trapping-math-vect-ifcvt-12.c: Add novector pragma.
	* gcc.dg/vect/no-trapping-math-vect-ifcvt-13.c: Add novector pragma.
	* gcc.dg/vect/no-trapping-math-vect-ifcvt-14.c: Add novector pragma.
	* gcc.dg/vect/no-trapping-math-vect-ifcvt-15.c: Add novector pragma.
	* gcc.dg/vect/no-tree-dom-vect-bug.c: Add novector pragma.
	* gcc.dg/vect/no-tree-pre-slp-29.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-pr29145.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-vect-101.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-vect-102.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-vect-102a.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-vect-37.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-vect-43.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-vect-45.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-vect-49.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-vect-51.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-vect-53.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-vect-57.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-vect-61.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-vect-79.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-vect-depend-1.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-vect-depend-2.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-vect-depend-3.c: Add novector pragma.
	* gcc.dg/vect/no-vfa-vect-dv-2.c: Add novector pragma.
	* gcc.dg/vect/pr101445.c: Add novector pragma.
	* gcc.dg/vect/pr103581.c: Add novector pragma.
	* gcc.dg/vect/pr105219.c: Add novector pragma.
	* gcc.dg/vect/pr108608.c: Add novector pragma.
	* gcc.dg/vect/pr18400.c: Add novector pragma.
	* gcc.dg/vect/pr18536.c: Add novector pragma.
	* gcc.dg/vect/pr20122.c: Add novector pragma.
	* gcc.dg/vect/pr25413.c: Add novector pragma.
	* gcc.dg/vect/pr30784.c: Add novector pragma.
	* gcc.dg/vect/pr37539.c: Add novector pragma.
	* gcc.dg/vect/pr40074.c: Add novector pragma.
	* gcc.dg/vect/pr45752.c: Add novector pragma.
	* gcc.dg/vect/pr45902.c: Add novector pragma.
	* gcc.dg/vect/pr46009.c: Add novector pragma.
	* gcc.dg/vect/pr48172.c: Add novector pragma.
	* gcc.dg/vect/pr51074.c: Add novector pragma.
	* gcc.dg/vect/pr51581-3.c: Add novector pragma.
	* gcc.dg/vect/pr51581-4.c: Add novector pragma.
	* gcc.dg/vect/pr53185-2.c: Add novector pragma.
	* gcc.dg/vect/pr56918.c: Add novector pragma.
	* gcc.dg/vect/pr56920.c: Add novector pragma.
	* gcc.dg/vect/pr56933.c: Add novector pragma.
	* gcc.dg/vect/pr57705.c: Add novector pragma.
	* gcc.dg/vect/pr57741-2.c: Add novector pragma.
	* gcc.dg/vect/pr57741-3.c: Add novector pragma.
	* gcc.dg/vect/pr59591-1.c: Add novector pragma.
	* gcc.dg/vect/pr59591-2.c: Add novector pragma.
	* gcc.dg/vect/pr59594.c: Add novector pragma.
	* gcc.dg/vect/pr59984.c: Add novector pragma.
	* gcc.dg/vect/pr60276.c: Add novector pragma.
	* gcc.dg/vect/pr61194.c: Add novector pragma.
	* gcc.dg/vect/pr61680.c: Add novector pragma.
	* gcc.dg/vect/pr62021.c: Add novector pragma.
	* gcc.dg/vect/pr63341-2.c: Add novector pragma.
	* gcc.dg/vect/pr64252.c: Add novector pragma.
	* gcc.dg/vect/pr64404.c: Add novector pragma.
	* gcc.dg/vect/pr64421.c: Add novector pragma.
	* gcc.dg/vect/pr64493.c: Add novector pragma.
	* gcc.dg/vect/pr64495.c: Add novector pragma.
	* gcc.dg/vect/pr66251.c: Add novector pragma.
	* gcc.dg/vect/pr66253.c: Add novector pragma.
	* gcc.dg/vect/pr68502-1.c: Add novector pragma.
	* gcc.dg/vect/pr68502-2.c: Add novector pragma.
	* gcc.dg/vect/pr69820.c: Add novector pragma.
	* gcc.dg/vect/pr70021.c: Add novector pragma.
	* gcc.dg/vect/pr70354-1.c: Add novector pragma.
	* gcc.dg/vect/pr70354-2.c: Add novector pragma.
	* gcc.dg/vect/pr71259.c: Add novector pragma.
	* gcc.dg/vect/pr78005.c: Add novector pragma.
	* gcc.dg/vect/pr78558.c: Add novector pragma.
	* gcc.dg/vect/pr80815-2.c: Add novector pragma.
	* gcc.dg/vect/pr80815-3.c: Add novector pragma.
	* gcc.dg/vect/pr80928.c: Add novector pragma.
	* gcc.dg/vect/pr81410.c: Add novector pragma.
	* gcc.dg/vect/pr81633.c: Add novector pragma.
	* gcc.dg/vect/pr81740-1.c: Add novector pragma.
	* gcc.dg/vect/pr81740-2.c: Add novector pragma.
	* gcc.dg/vect/pr85586.c: Add novector pragma.
	* gcc.dg/vect/pr87288-1.c: Add novector pragma.
	* gcc.dg/vect/pr87288-2.c: Add novector pragma.
	* gcc.dg/vect/pr87288-3.c: Add novector pragma.
	* gcc.dg/vect/pr88903-1.c: Add novector pragma.
	* gcc.dg/vect/pr88903-2.c: Add novector pragma.
	* gcc.dg/vect/pr90018.c: Add novector pragma.
	* gcc.dg/vect/pr92420.c: Add novector pragma.
	* gcc.dg/vect/pr94994.c: Add novector pragma.
	* gcc.dg/vect/pr96783-1.c: Add novector pragma.
	* gcc.dg/vect/pr96783-2.c: Add novector pragma.
	* gcc.dg/vect/pr97081-2.c: Add novector pragma.
	* gcc.dg/vect/pr97558-2.c: Add novector pragma.
	* gcc.dg/vect/pr97678.c: Add novector pragma.
	* gcc.dg/vect/section-anchors-pr27770.c: Add novector pragma.
	* gcc.dg/vect/section-anchors-vect-69.c: Add novector pragma.
	* gcc.dg/vect/slp-1.c: Add novector pragma.
	* gcc.dg/vect/slp-10.c: Add novector pragma.
	* gcc.dg/vect/slp-11a.c: Add novector pragma.
	* gcc.dg/vect/slp-11b.c: Add novector pragma.
	* gcc.dg/vect/slp-11c.c: Add novector pragma.
	* gcc.dg/vect/slp-12a.c: Add novector pragma.
	* gcc.dg/vect/slp-12b.c: Add novector pragma.
	* gcc.dg/vect/slp-12c.c: Add novector pragma.
	* gcc.dg/vect/slp-13-big-array.c: Add novector pragma.
	* gcc.dg/vect/slp-13.c: Add novector pragma.
	* gcc.dg/vect/slp-14.c: Add novector pragma.
	* gcc.dg/vect/slp-15.c: Add novector pragma.
	* gcc.dg/vect/slp-16.c: Add novector pragma.
	* gcc.dg/vect/slp-17.c: Add novector pragma.
	* gcc.dg/vect/slp-18.c: Add novector pragma.
	* gcc.dg/vect/slp-19a.c: Add novector pragma.
	* gcc.dg/vect/slp-19b.c: Add novector pragma.
	* gcc.dg/vect/slp-19c.c: Add novector pragma.
	* gcc.dg/vect/slp-2.c: Add novector pragma.
	* gcc.dg/vect/slp-20.c: Add novector pragma.
	* gcc.dg/vect/slp-21.c: Add novector pragma.
	* gcc.dg/vect/slp-22.c: Add novector pragma.
	* gcc.dg/vect/slp-23.c: Add novector pragma.
	* gcc.dg/vect/slp-24-big-array.c: Add novector pragma.
	* gcc.dg/vect/slp-24.c: Add novector pragma.
	* gcc.dg/vect/slp-25.c: Add novector pragma.
	* gcc.dg/vect/slp-26.c: Add novector pragma.
	* gcc.dg/vect/slp-28.c: Add novector pragma.
	* gcc.dg/vect/slp-3-big-array.c: Add novector pragma.
	* gcc.dg/vect/slp-3.c: Add novector pragma.
	* gcc.dg/vect/slp-33.c: Add novector pragma.
	* gcc.dg/vect/slp-34-big-array.c: Add novector pragma.
	* gcc.dg/vect/slp-34.c: Add novector pragma.
	* gcc.dg/vect/slp-35.c: Add novector pragma.
	* gcc.dg/vect/slp-37.c: Add novector pragma.
	* gcc.dg/vect/slp-4-big-array.c: Add novector pragma.
	* gcc.dg/vect/slp-4.c: Add novector pragma.
	* gcc.dg/vect/slp-41.c: Add novector pragma.
	* gcc.dg/vect/slp-43.c: Add novector pragma.
	* gcc.dg/vect/slp-45.c: Add novector pragma.
	* gcc.dg/vect/slp-46.c: Add novector pragma.
	* gcc.dg/vect/slp-47.c: Add novector pragma.
	* gcc.dg/vect/slp-48.c: Add novector pragma.
	* gcc.dg/vect/slp-49.c: Add novector pragma.
	* gcc.dg/vect/slp-5.c: Add novector pragma.
	* gcc.dg/vect/slp-6.c: Add novector pragma.
	* gcc.dg/vect/slp-7.c: Add novector pragma.
	* gcc.dg/vect/slp-8.c: Add novector pragma.
	* gcc.dg/vect/slp-9.c: Add novector pragma.
	* gcc.dg/vect/slp-cond-1.c: Add novector pragma.
	* gcc.dg/vect/slp-cond-2-big-array.c: Add novector pragma.
	* gcc.dg/vect/slp-cond-2.c: Add novector pragma.
	* gcc.dg/vect/slp-cond-3.c: Add novector pragma.
	* gcc.dg/vect/slp-cond-4.c: Add novector pragma.
	* gcc.dg/vect/slp-cond-5.c: Add novector pragma.
	* gcc.dg/vect/slp-multitypes-1.c: Add novector pragma.
	* gcc.dg/vect/slp-multitypes-10.c: Add novector pragma.
	* gcc.dg/vect/slp-multitypes-11-big-array.c: Add novector pragma.
	* gcc.dg/vect/slp-multitypes-11.c: Add novector pragma.
	* gcc.dg/vect/slp-multitypes-12.c: Add novector pragma.
	* gcc.dg/vect/slp-multitypes-2.c: Add novector pragma.
	* gcc.dg/vect/slp-multitypes-3.c: Add novector pragma.
	* gcc.dg/vect/slp-multitypes-4.c: Add novector pragma.
	* gcc.dg/vect/slp-multitypes-5.c: Add novector pragma.
	* gcc.dg/vect/slp-multitypes-6.c: Add novector pragma.
	* gcc.dg/vect/slp-multitypes-7.c: Add novector pragma.
	* gcc.dg/vect/slp-multitypes-8.c: Add novector pragma.
	* gcc.dg/vect/slp-multitypes-9.c: Add novector pragma.
	* gcc.dg/vect/slp-perm-1.c: Add novector pragma.
	* gcc.dg/vect/slp-perm-10.c: Add novector pragma.
	* gcc.dg/vect/slp-perm-11.c: Add novector pragma.
	* gcc.dg/vect/slp-perm-12.c: Add novector pragma.
	* gcc.dg/vect/slp-perm-2.c: Add novector pragma.
	* gcc.dg/vect/slp-perm-3.c: Add novector pragma.
	* gcc.dg/vect/slp-perm-4.c: Add novector pragma.
	* gcc.dg/vect/slp-perm-5.c: Add novector pragma.
	* gcc.dg/vect/slp-perm-6.c: Add novector pragma.
	* gcc.dg/vect/slp-perm-7.c: Add novector pragma.
	* gcc.dg/vect/slp-perm-8.c: Add novector pragma.
	* gcc.dg/vect/slp-perm-9.c: Add novector pragma.
	* gcc.dg/vect/slp-widen-mult-half.c: Add novector pragma.
	* gcc.dg/vect/slp-widen-mult-s16.c: Add novector pragma.
	* gcc.dg/vect/slp-widen-mult-u8.c: Add novector pragma.
	* gcc.dg/vect/vect-100.c: Add novector pragma.
	* gcc.dg/vect/vect-103.c: Add novector pragma.
	* gcc.dg/vect/vect-104.c: Add novector pragma.
	* gcc.dg/vect/vect-105-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-105.c: Add novector pragma.
	* gcc.dg/vect/vect-106.c: Add novector pragma.
	* gcc.dg/vect/vect-107.c: Add novector pragma.
	* gcc.dg/vect/vect-108.c: Add novector pragma.
	* gcc.dg/vect/vect-109.c: Add novector pragma.
	* gcc.dg/vect/vect-11.c: Add novector pragma.
	* gcc.dg/vect/vect-110.c: Add novector pragma.
	* gcc.dg/vect/vect-113.c: Add novector pragma.
	* gcc.dg/vect/vect-114.c: Add novector pragma.
	* gcc.dg/vect/vect-115.c: Add novector pragma.
	* gcc.dg/vect/vect-116.c: Add novector pragma.
	* gcc.dg/vect/vect-117.c: Add novector pragma.
	* gcc.dg/vect/vect-11a.c: Add novector pragma.
	* gcc.dg/vect/vect-12.c: Add novector pragma.
	* gcc.dg/vect/vect-122.c: Add novector pragma.
	* gcc.dg/vect/vect-124.c: Add novector pragma.
	* gcc.dg/vect/vect-13.c: Add novector pragma.
	* gcc.dg/vect/vect-14.c: Add novector pragma.
	* gcc.dg/vect/vect-15-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-15.c: Add novector pragma.
	* gcc.dg/vect/vect-17.c: Add novector pragma.
	* gcc.dg/vect/vect-18.c: Add novector pragma.
	* gcc.dg/vect/vect-19.c: Add novector pragma.
	* gcc.dg/vect/vect-2-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-2.c: Add novector pragma.
	* gcc.dg/vect/vect-20.c: Add novector pragma.
	* gcc.dg/vect/vect-21.c: Add novector pragma.
	* gcc.dg/vect/vect-22.c: Add novector pragma.
	* gcc.dg/vect/vect-23.c: Add novector pragma.
	* gcc.dg/vect/vect-24.c: Add novector pragma.
	* gcc.dg/vect/vect-25.c: Add novector pragma.
	* gcc.dg/vect/vect-26.c: Add novector pragma.
	* gcc.dg/vect/vect-27.c: Add novector pragma.
	* gcc.dg/vect/vect-28.c: Add novector pragma.
	* gcc.dg/vect/vect-29.c: Add novector pragma.
	* gcc.dg/vect/vect-3.c: Add novector pragma.
	* gcc.dg/vect/vect-30.c: Add novector pragma.
	* gcc.dg/vect/vect-31-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-31.c: Add novector pragma.
	* gcc.dg/vect/vect-32-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-32.c: Add novector pragma.
	* gcc.dg/vect/vect-33-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-33.c: Add novector pragma.
	* gcc.dg/vect/vect-34-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-34.c: Add novector pragma.
	* gcc.dg/vect/vect-35-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-35.c: Add novector pragma.
	* gcc.dg/vect/vect-36-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-36.c: Add novector pragma.
	* gcc.dg/vect/vect-38.c: Add novector pragma.
	* gcc.dg/vect/vect-4.c: Add novector pragma.
	* gcc.dg/vect/vect-40.c: Add novector pragma.
	* gcc.dg/vect/vect-42.c: Add novector pragma.
	* gcc.dg/vect/vect-44.c: Add novector pragma.
	* gcc.dg/vect/vect-46.c: Add novector pragma.
	* gcc.dg/vect/vect-48.c: Add novector pragma.
	* gcc.dg/vect/vect-5.c: Add novector pragma.
	* gcc.dg/vect/vect-50.c: Add novector pragma.
	* gcc.dg/vect/vect-52.c: Add novector pragma.
	* gcc.dg/vect/vect-54.c: Add novector pragma.
	* gcc.dg/vect/vect-56.c: Add novector pragma.
	* gcc.dg/vect/vect-58.c: Add novector pragma.
	* gcc.dg/vect/vect-6-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-6.c: Add novector pragma.
	* gcc.dg/vect/vect-60.c: Add novector pragma.
	* gcc.dg/vect/vect-62.c: Add novector pragma.
	* gcc.dg/vect/vect-63.c: Add novector pragma.
	* gcc.dg/vect/vect-64.c: Add novector pragma.
	* gcc.dg/vect/vect-65.c: Add novector pragma.
	* gcc.dg/vect/vect-66.c: Add novector pragma.
	* gcc.dg/vect/vect-67.c: Add novector pragma.
	* gcc.dg/vect/vect-68.c: Add novector pragma.
	* gcc.dg/vect/vect-7.c: Add novector pragma.
	* gcc.dg/vect/vect-70.c: Add novector pragma.
	* gcc.dg/vect/vect-71.c: Add novector pragma.
	* gcc.dg/vect/vect-72.c: Add novector pragma.
	* gcc.dg/vect/vect-73-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-73.c: Add novector pragma.
	* gcc.dg/vect/vect-74-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-74.c: Add novector pragma.
	* gcc.dg/vect/vect-75-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-75.c: Add novector pragma.
	* gcc.dg/vect/vect-76-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-76.c: Add novector pragma.
	* gcc.dg/vect/vect-77-alignchecks.c: Add novector pragma.
	* gcc.dg/vect/vect-77-global.c: Add novector pragma.
	* gcc.dg/vect/vect-77.c: Add novector pragma.
	* gcc.dg/vect/vect-78-alignchecks.c: Add novector pragma.
	* gcc.dg/vect/vect-78-global.c: Add novector pragma.
	* gcc.dg/vect/vect-78.c: Add novector pragma.
	* gcc.dg/vect/vect-8.c: Add novector pragma.
	* gcc.dg/vect/vect-80-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-80.c: Add novector pragma.
	* gcc.dg/vect/vect-82.c: Add novector pragma.
	* gcc.dg/vect/vect-82_64.c: Add novector pragma.
	* gcc.dg/vect/vect-83.c: Add novector pragma.
	* gcc.dg/vect/vect-83_64.c: Add novector pragma.
	* gcc.dg/vect/vect-85-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-85.c: Add novector pragma.
	* gcc.dg/vect/vect-86.c: Add novector pragma.
	* gcc.dg/vect/vect-87.c: Add novector pragma.
	* gcc.dg/vect/vect-88.c: Add novector pragma.
	* gcc.dg/vect/vect-89-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-89.c: Add novector pragma.
	* gcc.dg/vect/vect-9.c: Add novector pragma.
	* gcc.dg/vect/vect-92.c: Add novector pragma.
	* gcc.dg/vect/vect-93.c: Add novector pragma.
	* gcc.dg/vect/vect-95.c: Add novector pragma.
	* gcc.dg/vect/vect-96.c: Add novector pragma.
	* gcc.dg/vect/vect-97-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-97.c: Add novector pragma.
	* gcc.dg/vect/vect-98-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-98.c: Add novector pragma.
	* gcc.dg/vect/vect-99.c: Add novector pragma.
	* gcc.dg/vect/vect-alias-check-10.c: Add novector pragma.
	* gcc.dg/vect/vect-alias-check-11.c: Add novector pragma.
	* gcc.dg/vect/vect-alias-check-12.c: Add novector pragma.
	* gcc.dg/vect/vect-alias-check-14.c: Add novector pragma.
	* gcc.dg/vect/vect-alias-check-15.c: Add novector pragma.
	* gcc.dg/vect/vect-alias-check-16.c: Add novector pragma.
	* gcc.dg/vect/vect-alias-check-18.c: Add novector pragma.
	* gcc.dg/vect/vect-alias-check-19.c: Add novector pragma.
	* gcc.dg/vect/vect-alias-check-20.c: Add novector pragma.
	* gcc.dg/vect/vect-alias-check-8.c: Add novector pragma.
	* gcc.dg/vect/vect-alias-check-9.c: Add novector pragma.
	* gcc.dg/vect/vect-align-1.c: Add novector pragma.
	* gcc.dg/vect/vect-align-2.c: Add novector pragma.
	* gcc.dg/vect/vect-all-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-all.c: Add novector pragma.
	* gcc.dg/vect/vect-avg-1.c: Add novector pragma.
	* gcc.dg/vect/vect-avg-11.c: Add novector pragma.
	* gcc.dg/vect/vect-avg-15.c: Add novector pragma.
	* gcc.dg/vect/vect-avg-16.c: Add novector pragma.
	* gcc.dg/vect/vect-avg-5.c: Add novector pragma.
	* gcc.dg/vect/vect-bitfield-write-1.c: Add novector pragma.
	* gcc.dg/vect/vect-bitfield-write-2.c: Add novector pragma.
	* gcc.dg/vect/vect-bitfield-write-3.c: Add novector pragma.
	* gcc.dg/vect/vect-bitfield-write-4.c: Add novector pragma.
	* gcc.dg/vect/vect-bitfield-write-5.c: Add novector pragma.
	* gcc.dg/vect/vect-bool-cmp.c: Add novector pragma.
	* gcc.dg/vect/vect-bswap16.c: Add novector pragma.
	* gcc.dg/vect/vect-bswap32.c: Add novector pragma.
	* gcc.dg/vect/vect-bswap64.c: Add novector pragma.
	* gcc.dg/vect/vect-complex-1.c: Add novector pragma.
	* gcc.dg/vect/vect-complex-2.c: Add novector pragma.
	* gcc.dg/vect/vect-complex-4.c: Add novector pragma.
	* gcc.dg/vect/vect-cond-1.c: Add novector pragma.
	* gcc.dg/vect/vect-cond-10.c: Add novector pragma.
	* gcc.dg/vect/vect-cond-11.c: Add novector pragma.
	* gcc.dg/vect/vect-cond-3.c: Add novector pragma.
	* gcc.dg/vect/vect-cond-4.c: Add novector pragma.
	* gcc.dg/vect/vect-cond-5.c: Add novector pragma.
	* gcc.dg/vect/vect-cond-6.c: Add novector pragma.
	* gcc.dg/vect/vect-cond-7.c: Add novector pragma.
	* gcc.dg/vect/vect-cond-8.c: Add novector pragma.
	* gcc.dg/vect/vect-cond-9.c: Add novector pragma.
	* gcc.dg/vect/vect-cond-arith-1.c: Add novector pragma.
	* gcc.dg/vect/vect-cond-arith-3.c: Add novector pragma.
	* gcc.dg/vect/vect-cond-arith-4.c: Add novector pragma.
	* gcc.dg/vect/vect-cond-arith-5.c: Add novector pragma.
	* gcc.dg/vect/vect-cond-arith-6.c: Add novector pragma.
	* gcc.dg/vect/vect-cond-arith-7.c: Add novector pragma.
	* gcc.dg/vect/vect-cselim-1.c: Add novector pragma.
	* gcc.dg/vect/vect-cselim-2.c: Add novector pragma.
	* gcc.dg/vect/vect-div-bitmask-4.c: Add novector pragma.
	* gcc.dg/vect/vect-div-bitmask-5.c: Add novector pragma.
	* gcc.dg/vect/vect-div-bitmask.h: Add novector pragma.
	* gcc.dg/vect/vect-double-reduc-1.c: Add novector pragma.
	* gcc.dg/vect/vect-double-reduc-2.c: Add novector pragma.
	* gcc.dg/vect/vect-double-reduc-3.c: Add novector pragma.
	* gcc.dg/vect/vect-double-reduc-4.c: Add novector pragma.
	* gcc.dg/vect/vect-double-reduc-5.c: Add novector pragma.
	* gcc.dg/vect/vect-double-reduc-6-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-double-reduc-6.c: Add novector pragma.
	* gcc.dg/vect/vect-double-reduc-7.c: Add novector pragma.
	* gcc.dg/vect/vect-float-extend-1.c: Add novector pragma.
	* gcc.dg/vect/vect-float-truncate-1.c: Add novector pragma.
	* gcc.dg/vect/vect-floatint-conversion-1.c: Add novector pragma.
	* gcc.dg/vect/vect-floatint-conversion-2.c: Add novector pragma.
	* gcc.dg/vect/vect-fma-1.c: Add novector pragma.
	* gcc.dg/vect/vect-gather-1.c: Add novector pragma.
	* gcc.dg/vect/vect-gather-3.c: Add novector pragma.
	* gcc.dg/vect/vect-ifcvt-11.c: Add novector pragma.
	* gcc.dg/vect/vect-ifcvt-16.c: Add novector pragma.
	* gcc.dg/vect/vect-ifcvt-17.c: Add novector pragma.
	* gcc.dg/vect/vect-ifcvt-2.c: Add novector pragma.
	* gcc.dg/vect/vect-ifcvt-3.c: Add novector pragma.
	* gcc.dg/vect/vect-ifcvt-4.c: Add novector pragma.
	* gcc.dg/vect/vect-ifcvt-5.c: Add novector pragma.
	* gcc.dg/vect/vect-ifcvt-6.c: Add novector pragma.
	* gcc.dg/vect/vect-ifcvt-7.c: Add novector pragma.
	* gcc.dg/vect/vect-ifcvt-9.c: Add novector pragma.
	* gcc.dg/vect/vect-intfloat-conversion-1.c: Add novector pragma.
	* gcc.dg/vect/vect-intfloat-conversion-2.c: Add novector pragma.
	* gcc.dg/vect/vect-intfloat-conversion-3.c: Add novector pragma.
	* gcc.dg/vect/vect-intfloat-conversion-4a.c: Add novector pragma.
	* gcc.dg/vect/vect-intfloat-conversion-4b.c: Add novector pragma.
	* gcc.dg/vect/vect-iv-1.c: Add novector pragma.
	* gcc.dg/vect/vect-iv-10.c: Add novector pragma.
	* gcc.dg/vect/vect-iv-2.c: Add novector pragma.
	* gcc.dg/vect/vect-iv-3.c: Add novector pragma.
	* gcc.dg/vect/vect-iv-4.c: Add novector pragma.
	* gcc.dg/vect/vect-iv-5.c: Add novector pragma.
	* gcc.dg/vect/vect-iv-6.c: Add novector pragma.
	* gcc.dg/vect/vect-iv-7.c: Add novector pragma.
	* gcc.dg/vect/vect-iv-8-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-iv-8.c: Add novector pragma.
	* gcc.dg/vect/vect-iv-8a-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-iv-8a.c: Add novector pragma.
	* gcc.dg/vect/vect-live-1.c: Add novector pragma.
	* gcc.dg/vect/vect-live-2.c: Add novector pragma.
	* gcc.dg/vect/vect-live-3.c: Add novector pragma.
	* gcc.dg/vect/vect-live-4.c: Add novector pragma.
	* gcc.dg/vect/vect-live-5.c: Add novector pragma.
	* gcc.dg/vect/vect-live-slp-1.c: Add novector pragma.
	* gcc.dg/vect/vect-live-slp-2.c: Add novector pragma.
	* gcc.dg/vect/vect-live-slp-3.c: Add novector pragma.
	* gcc.dg/vect/vect-mask-load-1.c: Add novector pragma.
	* gcc.dg/vect/vect-mask-loadstore-1.c: Add novector pragma.
	* gcc.dg/vect/vect-mulhrs-1.c: Add novector pragma.
	* gcc.dg/vect/vect-mult-const-pattern-1.c: Add novector pragma.
	* gcc.dg/vect/vect-mult-const-pattern-2.c: Add novector pragma.
	* gcc.dg/vect/vect-multitypes-1.c: Add novector pragma.
	* gcc.dg/vect/vect-multitypes-10.c: Add novector pragma.
	* gcc.dg/vect/vect-multitypes-11.c: Add novector pragma.
	* gcc.dg/vect/vect-multitypes-12.c: Add novector pragma.
	* gcc.dg/vect/vect-multitypes-13.c: Add novector pragma.
	* gcc.dg/vect/vect-multitypes-14.c: Add novector pragma.
	* gcc.dg/vect/vect-multitypes-16.c: Add novector pragma.
	* gcc.dg/vect/vect-multitypes-17.c: Add novector pragma.
	* gcc.dg/vect/vect-multitypes-2.c: Add novector pragma.
	* gcc.dg/vect/vect-multitypes-3.c: Add novector pragma.
	* gcc.dg/vect/vect-multitypes-4.c: Add novector pragma.
	* gcc.dg/vect/vect-multitypes-5.c: Add novector pragma.
	* gcc.dg/vect/vect-multitypes-6.c: Add novector pragma.
	* gcc.dg/vect/vect-multitypes-8.c: Add novector pragma.
	* gcc.dg/vect/vect-multitypes-9.c: Add novector pragma.
	* gcc.dg/vect/vect-nb-iter-ub-1.c: Add novector pragma.
	* gcc.dg/vect/vect-nb-iter-ub-2.c: Add novector pragma.
	* gcc.dg/vect/vect-nb-iter-ub-3.c: Add novector pragma.
	* gcc.dg/vect/vect-neg-store-1.c: Add novector pragma.
	* gcc.dg/vect/vect-neg-store-2.c: Add novector pragma.
	* gcc.dg/vect/vect-nest-cycle-1.c: Add novector pragma.
	* gcc.dg/vect/vect-nest-cycle-2.c: Add novector pragma.
	* gcc.dg/vect/vect-nest-cycle-3.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-2-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-2.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-2a-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-2a.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-2b.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-2c-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-2c.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-2d.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-3-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-3.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-3a-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-3a.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-3b.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-3c.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-4.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-4d-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-4d.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-5.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-6.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-fir-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-fir-lb-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-fir-lb.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-fir.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-simd-1.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-simd-2.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-simd-3.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-slp-2.c: Add novector pragma.
	* gcc.dg/vect/vect-outer-slp-3.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-1-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-1.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-11.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-13.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-15.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-17.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-18.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-19.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-2-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-2.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-20.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-21.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-22.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-3-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-3.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-4-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-4.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-5.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-7.c: Add novector pragma.
	* gcc.dg/vect/vect-over-widen-9.c: Add novector pragma.
	* gcc.dg/vect/vect-peel-1-src.c: Add novector pragma.
	* gcc.dg/vect/vect-peel-2-src.c: Add novector pragma.
	* gcc.dg/vect/vect-peel-4-src.c: Add novector pragma.
	* gcc.dg/vect/vect-recurr-1.c: Add novector pragma.
	* gcc.dg/vect/vect-recurr-2.c: Add novector pragma.
	* gcc.dg/vect/vect-recurr-3.c: Add novector pragma.
	* gcc.dg/vect/vect-recurr-4.c: Add novector pragma.
	* gcc.dg/vect/vect-recurr-5.c: Add novector pragma.
	* gcc.dg/vect/vect-recurr-6.c: Add novector pragma.
	* gcc.dg/vect/vect-sdiv-pow2-1.c: Add novector pragma.
	* gcc.dg/vect/vect-sdivmod-1.c: Add novector pragma.
	* gcc.dg/vect/vect-shift-1.c: Add novector pragma.
	* gcc.dg/vect/vect-shift-3.c: Add novector pragma.
	* gcc.dg/vect/vect-shift-4.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-1.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-10.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-11.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-12.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-13.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-14.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-15.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-16.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-17.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-18.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-19.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-20.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-8.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-9.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-clone-1.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-clone-10.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-clone-11.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-clone-15.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-clone-2.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-clone-3.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-clone-4.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-clone-5.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-clone-6.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-clone-7.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-clone-8.c: Add novector pragma.
	* gcc.dg/vect/vect-simd-clone-9.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-a-mult.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-a-u16-i2.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-a-u16-i4.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-a-u16-mult.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-a-u32-mult.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-a-u8-i2-gap.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-a-u8-i8-gap2-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-a-u8-i8-gap2.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-a-u8-i8-gap7-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-a-u8-i8-gap7.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-float.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-mult-char-ls.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-mult.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-same-dr.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-shift-1.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-store-a-u8-i2.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-store-u16-i4.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-store-u32-i2.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-store.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-u16-i2.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-u16-i3.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-u16-i4.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-u32-i4.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-u32-i8.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-u32-mult.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-u8-i2-gap.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-u8-i2.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-u8-i8-gap2-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-u8-i8-gap2.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-u8-i8-gap4-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-u8-i8-gap4-unknown.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-u8-i8-gap4.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-u8-i8-gap7-big-array.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-u8-i8-gap7.c: Add novector pragma.
	* gcc.dg/vect/vect-strided-u8-i8.c: Add novector pragma.
	* gcc.dg/vect/vect-vfa-01.c: Add novector pragma.
	* gcc.dg/vect/vect-vfa-02.c: Add novector pragma.
	* gcc.dg/vect/vect-vfa-03.c: Add novector pragma.
	* gcc.dg/vect/vect-vfa-04.c: Add novector pragma.
	* gcc.dg/vect/vect-vfa-slp.c: Add novector pragma.
	* gcc.dg/vect/vect-widen-mult-1.c: Add novector pragma.
	* gcc.dg/vect/vect-widen-mult-const-s16.c: Add novector pragma.
	* gcc.dg/vect/vect-widen-mult-const-u16.c: Add novector pragma.
	* gcc.dg/vect/vect-widen-mult-half-u8.c: Add novector pragma.
	* gcc.dg/vect/vect-widen-mult-half.c: Add novector pragma.
	* gcc.dg/vect/vect-widen-mult-s16.c: Add novector pragma.
	* gcc.dg/vect/vect-widen-mult-s8.c: Add novector pragma.
	* gcc.dg/vect/vect-widen-mult-u16.c: Add novector pragma.
	* gcc.dg/vect/vect-widen-mult-u8-s16-s32.c: Add novector pragma.
	* gcc.dg/vect/vect-widen-mult-u8-u32.c: Add novector pragma.
	* gcc.dg/vect/vect-widen-mult-u8.c: Add novector pragma.
	* gcc.dg/vect/vect-widen-shift-s16.c: Add novector pragma.
	* gcc.dg/vect/vect-widen-shift-s8.c: Add novector pragma.
	* gcc.dg/vect/vect-widen-shift-u16.c: Add novector pragma.
	* gcc.dg/vect/vect-widen-shift-u8.c: Add novector pragma.
	* gcc.dg/vect/wrapv-vect-7.c: Add novector pragma.
2023-08-04 13:54:38 +01:00
Tamar Christina
6fb5da0310 frontend: Add novector C pragma
FORTRAN currently has a pragma NOVECTOR for indicating that vectorization should
not be applied to a particular loop.

ICC/ICX also has such a pragma for C and C++ called #pragma novector.

As part of this patch series I need a way to easily turn off vectorization of
particular loops, particularly for testsuite reasons.

This patch proposes a #pragma GCC novector that does the same for C
as gfortan does for FORTRAN and what ICX/ICX does for C.

I added only some basic tests here, but the next patch in the series uses this
in the testsuite in about ~800 tests.

gcc/c-family/ChangeLog:

	* c-pragma.h (enum pragma_kind): Add PRAGMA_NOVECTOR.
	* c-pragma.cc (init_pragma): Use it.

gcc/c/ChangeLog:

	* c-parser.cc (c_parser_while_statement, c_parser_do_statement,
	c_parser_for_statement, c_parser_statement_after_labels,
	c_parse_pragma_novector, c_parser_pragma): Wire through novector and
	default to false.

gcc/testsuite/ChangeLog:

	* gcc.dg/vect/vect-novector-pragma.c: New test.
2023-08-04 13:51:16 +01:00
Tamar Christina
73b9886076 frontend: Add novector C++ pragma
FORTRAN currently has a pragma NOVECTOR for indicating that vectorization should
not be applied to a particular loop.

ICC/ICX also has such a pragma for C and C++ called #pragma novector.

As part of this patch series I need a way to easily turn off vectorization of
particular loops, particularly for testsuite reasons.

This patch proposes a #pragma GCC novector that does the same for C++
as gfortan does for FORTRAN and what ICX/ICX does for C++.

I added only some basic tests here, but the next patch in the series uses this
in the testsuite in about ~800 tests.

gcc/cp/ChangeLog:

	* cp-tree.h (RANGE_FOR_NOVECTOR): New.
	(cp_convert_range_for, finish_while_stmt_cond, finish_do_stmt,
	finish_for_cond): Add novector param.
	* init.cc (build_vec_init): Default novector to false.
	* method.cc (build_comparison_op): Likewise.
	* parser.cc (cp_parser_statement): Likewise.
	(cp_parser_for, cp_parser_c_for, cp_parser_range_for,
	cp_convert_range_for, cp_parser_iteration_statement,
	cp_parser_omp_for_loop, cp_parser_pragma): Support novector.
	(cp_parser_pragma_novector): New.
	* pt.cc (tsubst_expr): Likewise.
	* semantics.cc (finish_while_stmt_cond, finish_do_stmt,
	finish_for_cond): Likewise.

gcc/ChangeLog:

	* doc/extend.texi: Document it.

gcc/testsuite/ChangeLog:

	* g++.dg/vect/vect.exp (support vect- prefix).
	* g++.dg/vect/vect-novector-pragma.cc: New test.
2023-08-04 13:50:53 +01:00
Tamar Christina
451391a647 AArch64: Undo vec_widen_<sur>shiftl optabs [PR106346]
In GCC 11 we implemented the vectorizer optab for widening left shifts,
however this optab is only supported for uniform shift constants.

At the moment GCC still has two loop vectorization strategy (classical loop and
SLP based loop vec) and the optab is implemented as a scalar pattern.

This means that when we apply it to a non-uniform constant inside a loop we only
find out during SLP build that the constants aren't uniform.  At this point it's
too late and we lose SLP entirely.

Over the years I've tried various options but none of it works well:

1. Dissolving patterns during SLP built (problematic, also dissolves them for
non-slp).
2. Optionally ignoring patterns for SLP build (problematic, ends up interfearing
with relevancy detection).
3. Relaxing contraint on SLP build to allow non-constant values and dissolving
them after SLP build using an SLP pattern.  (problematic, ends up breaking
shift reassociation).

As a result we've concluded that for now this pattern should just be removed
and formed during RTL.

The plan is to move this to an SLP only pattern once we remove classical loop
vectorization support from GCC, at which time we can also properly support SVE's
Top and Bottom variants.

This removes the optab and reworks the RTL to recognize both the vector variant
and the intrinsics variant.  Also just simplifies all these patterns.

gcc/ChangeLog:

	PR target/106346
	* config/aarch64/aarch64-simd.md (vec_widen_<sur>shiftl_lo_<mode>,
	vec_widen_<sur>shiftl_hi_<mode>): Remove.
	(aarch64_<sur>shll<mode>_internal): Renamed to...
	(aarch64_<su>shll<mode>): .. This.
	(aarch64_<sur>shll2<mode>_internal): Renamed to...
	(aarch64_<su>shll2<mode>): .. This.
	(aarch64_<sur>shll_n<mode>, aarch64_<sur>shll2_n<mode>): Re-use new
	optabs.
	* config/aarch64/constraints.md (D2, DL): New.
	* config/aarch64/predicates.md (aarch64_simd_shll_imm_vec): New.

gcc/testsuite/ChangeLog:

	PR target/106346
	* gcc.target/aarch64/pr98772.c: Adjust assembly.
	* gcc.target/aarch64/vect-widen-shift.c: New test.
2023-08-04 13:49:23 +01:00
Tamar Christina
6b80071a4d gensupport: Don't segfault on empty attrs list
Currently we segfault when len == 0 for an attribute list.

essentially [cons: =0, 1, 2, 3; attrs: ] segfaults but should be equivalent to
[cons: =0, 1, 2, 3] and [cons: =0, 1, 2, 3; attrs:].  This fixes it by just
returning early and leaving it to the validators whether this should error out
or not.

gcc/ChangeLog:

	* gensupport.cc (conlist): Support length 0 attribute.
2023-08-04 13:48:56 +01:00
Tamar Christina
8787b195f0 AArch64: update costing for combining vector conditionals
boolean comparisons have different cost depending on the mode. e.g.
for SVE, a && b doesn't require an additional instruction when a or b
is predicated by combining the predicate of the one operation into the
second one.  At the moment though we only fuse compares so this update
requires one of the operands to be a comparison.

Scalars also don't require this because the non-ifcvt variant is a series of
branches where following the branch sequences themselves are natural ANDs.

Advanced SIMD however does require an actual AND to combine the boolean values.

As such this patch discounts Scalar and SVE boolean operation latency and
throughput.

With this patch comparison heavy code prefers SVE as it should, especially in
cases with SVE VL == Advanced SIMD VL where previously the SVE prologue costs
would tip it towards Advanced SIMD.

gcc/ChangeLog:

	* config/aarch64/aarch64.cc (aarch64_bool_compound_p): New.
	(aarch64_adjust_stmt_cost, aarch64_vector_costs::count_ops): Use it.
2023-08-04 13:48:35 +01:00
Tamar Christina
0e52059129 AArch64: update costing for MLA by invariant
When determining issue rates we currently discount non-constant MLA accumulators
for Advanced SIMD but don't do it for the latency.

This means the costs for Advanced SIMD with a constant accumulator are wrong and
results in us costing SVE and Advanced SIMD the same.  This can cauze us to
vectorize with Advanced SIMD instead of SVE in some cases.

This patch adds the same discount for SVE and Scalar as we do for issue rate.

This gives a 5% improvement in fotonik3d_r in SPECCPU 2017 on large
Neoverse cores.

gcc/ChangeLog:

	* config/aarch64/aarch64.cc (aarch64_multiply_add_p): Update handling
	of constants.
	(aarch64_adjust_stmt_cost): Use it.
	(aarch64_vector_costs::count_ops): Likewise.
	(aarch64_vector_costs::add_stmt_cost): Pass vinfo to
	aarch64_adjust_stmt_cost.
2023-08-04 13:46:36 +01:00
Richard Biener
1a599caab8 tree-optimization/110838 - vectorization of widened right shifts
The following fixes a problem with my last attempt of avoiding
out-of-bound shift values for vectorized right shifts of widened
operands.  Instead of truncating the shift amount with a bitwise
and we actually need to saturate it to the target precision.

The following does that and adds test coverage for the constant
and invariant but variable case that would previously have failed.

	PR tree-optimization/110838
	* tree-vect-patterns.cc (vect_recog_over_widening_pattern):
	Fix right-shift value sanitizing.  Properly emit external
	def mangling in the preheader rather than in the pattern
	def sequence where it will fail vectorizing.

	* gcc.dg/vect/pr110838.c: New testcase.
2023-08-04 13:15:05 +02:00
Matthew Malcomson
0782b01c9e mid-end: Use integral time intervals in timevar.cc
On some AArch64 bootstrapped builds, we were getting a flaky test
because the floating point operations in `get_time` were being fused
with the floating point operations in `timevar_accumulate`.

This meant that the rounding behaviour of our multiplication with
`ticks_to_msec` was different when used in `timer::start` and when
performed in `timer::stop`.  These extra inaccuracies led to the
testcase `g++.dg/ext/timevar1.C` being flaky on some hardware.

------------------------------
Avoiding the inlining which was agreed to be undesirable.  Three
alternative approaches:
1) Use `-ffp-contract=on` to avoid this particular optimisation.
2) Adjusting the code so that the "tolerance" is always of the order of
   a "tick".
3) Recording times and elapsed differences in integral values.
   - Could be in terms of a standard measurement (e.g. nanoseconds or
     microseconds).
   - Could be in terms of whatever integral value ("ticks" /
     seconds&microseconds / "clock ticks") is returned from the syscall
     chosen at configure time.

While `-ffp-contract=on` removes the problem that I bumped into, there
has been a similar bug on x86 that was to do with a different floating
point problem that also happens after `get_time` and
`timevar_accumulate` both being inlined into the same function.  Hence
it seems worth choosing a different approach.

Of the two other solutions, recording measurements in integral values
seems the most robust against slightly "off" measurements being
presented to the user -- even though it could avoid the ICE that creates
a flaky test.

I considered storing time in whatever units our syscall returns and
normalising them at the time we print out rather than normalising them
to nanoseconds at the point we record our "current time".  The logic
being that normalisation could have some rounding affect (e.g. if
TICKS_PER_SECOND is 3) that would be taken into account in calculations.

I decided against it in order to give the values recorded in
`timevar_time_def` some interpretive value so it's easier to read the
code.  Compared to the small rounding that would represent a tiny amount
of time and AIUI can not trigger the same kind of ICE's as we are
attempting to fix, said interpretive value seems more valuable.

Recording time in microseconds seemed reasonable since all obvious
values for ticks and `getrusage` are at microsecond granularity or less
precise.  That said, since TICKS_PER_SECOND and CLOCKS_PER_SEC are both
variables given to use by the host system I was not sure of that enough
to make this decision.

------------------------------
timer::all_zero is ignoring rows which are inconsequential to the user
and would be printed out as all zeros.  Since upon printing rows we
convert to the same double value and print out the same precision as
before, we return true/false based on the same amount of time as before.

timer::print_row casts to a floating point measurement in units of
seconds as was printed out before.

timer::validate_phases -- I'm printing out nanoseconds here rather than
floating point seconds since this is an error message for when things
have "gone wrong" printing out the actual nanoseconds that have been
recorded seems like the best approach.
N.b. since we now print out nanoseconds instead of floating point value
the padding requirements are different.  Originally we were padding to
24 characters and printing 18 decimal places.  This looked odd with the
now visually smaller values getting printed.  I judged 13 characters
(corresponding to 2 hours) to be a reasonable point at which our
alignment could start to degrade and this provides a more compact output
for the majority of cases (checked by triggering the error case via
GDB).

------------------------------
N.b. I use a literal 1000000000 for "NANOSEC_PER_SEC".  I believe this
would fit in an integer on all hosts that GCC supports, but am not
certain there are not strange integer sizes we support hence am pointing
it out for special attention during review.

------------------------------
No expected change in generated code.
Bootstrapped and regtested on AArch64 with no regressions.

Hope this is acceptable -- I had originally planned to use
`-ffp-contract` as agreed until I saw mention of the old x86 bug in the
same area which was not to do with floating point contraction of
operations (PR 99903).

gcc/ChangeLog:

	PR middle-end/110316
	PR middle-end/9903
	* timevar.cc (NANOSEC_PER_SEC, TICKS_TO_NANOSEC,
	CLOCKS_TO_NANOSEC, nanosec_to_floating_sec, percent_of): New.
	(TICKS_TO_MSEC, CLOCKS_TO_MSEC): Remove these macros.
	(timer::validate_phases): Use integral arithmetic to check
	validity.
	(timer::print_row, timer::print): Convert from integral
	nanoseconds to floating	point seconds before printing.
	(timer::all_zero): Change limit to nanosec count instead of
	fractional count of seconds.
	(make_json_for_timevar_time_def): Convert from integral
	nanoseconds to floating point seconds before recording.
	* timevar.h (struct timevar_time_def): Update all measurements
	to use uint64_t nanoseconds rather than seconds stored in a
	double.
2023-08-04 11:26:47 +01:00
Richard Biener
04aa0edcac tree-optimization/110838 - less aggressively fold out-of-bound shifts
The following adjusts the shift simplification patterns to avoid
touching out-of-bound shift value arithmetic right shifts of
possibly negative values.  While simplifying those to zero isn't
wrong it's violating the principle of least surprise.

	PR tree-optimization/110838
	* match.pd (([rl]shift @0 out-of-bounds) -> zero): Restrict
	the arithmetic right-shift case to non-negative operands.
2023-08-04 12:16:00 +02:00
Pan Li
2d2f090e67 Revert "RISC-V: Support RVV VFMACC rounding mode intrinsic API"
This reverts commit 51e5a5cefb.
2023-08-04 17:11:26 +08:00
Pan Li
7a6b4d87d8 Revert "RISC-V: Support RVV VFNMACC rounding mode intrinsic API"
This reverts commit 62d9c1dd8e.
2023-08-04 17:11:12 +08:00
Pan Li
b87a4739a4 Revert "RISC-V: Support RVV VFMSAC rounding mode intrinsic API"
This reverts commit dccd7e8a72.
2023-08-04 17:10:49 +08:00
Pan Li
098d6fbe64 Revert "RISC-V: Support RVV VFNMSAC rounding mode intrinsic API"
This reverts commit 236ec7aac0.
2023-08-04 17:10:29 +08:00
Georg-Johann Lay
85414e25ad AVR: Add some more devices: AVR16DD*, AVR32DD*, AVR64DD*, AVR64EA*, ATtiny42*, ATtiny82*, ATtiny162*, ATtiny322*, ATtiny10*.
gcc/
	* config/avr/avr-mcus.def (avr64dd14, avr64dd20, avr64dd28, avr64dd32)
	(avr64ea28, avr64ea32, avr64ea48, attiny424, attiny426, attiny427)
	(attiny824, attiny826, attiny827, attiny1624, attiny1626, attiny1627)
	(attiny3224, attiny3226, attiny3227, avr16dd14, avr16dd20, avr16dd28)
	(avr16dd32, avr32dd14, avr32dd20, avr32dd28, avr32dd32)
	(attiny102, attiny104): New devices.
	* doc/avr-mmcu.texi: Regenerate.
2023-08-04 10:25:18 +02:00
Georg-Johann Lay
14daa69fec Fix some minor typos in avr-mcus.def.
gcc/
	* config/avr/avr-mcus.def (avr128d*, avr64d*): Fix their FLASH_SIZE
	and PM_OFFSET entries.
2023-08-04 09:51:11 +02:00
Andrew Pinski
91c963ea6f Fix PR 110874: infinite loop in gimple_bitwise_inverted_equal_p with fre
This changes gimple_bitwise_inverted_equal_p to use a 2 different match patterns
to try to match bit_not wrapped with a possible nop_convert and a comparison
also wrapped with a possible nop_convert. This is to avoid being recursive.

OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.

gcc/ChangeLog:

	PR tree-optimization/110874
	* gimple-match-head.cc (gimple_bit_not_with_nop): New declaration.
	(gimple_maybe_cmp): Likewise.
	(gimple_bitwise_inverted_equal_p): Rewrite to use gimple_bit_not_with_nop
	and gimple_maybe_cmp instead of being recursive.
	* match.pd (bit_not_with_nop): New match pattern.
	(maybe_cmp): Likewise.

gcc/testsuite/ChangeLog:

	PR tree-optimization/110874
	* gcc.c-torture/compile/pr110874-a.c: New test.
2023-08-04 00:26:42 -07:00
Drew Ross
9020da78df match.pd: Canonicalize (signed x << c) >> c [PR101955]
Canonicalizes (signed x << c) >> c into the lowest
precision(type) - c bits of x IF those bits have a mode precision or a
precision of 1. Also combines this rule with (unsigned x << c) >> c -> x &
((unsigned)-1 >> c) to prevent duplicate pattern.

	PR middle-end/101955
	* match.pd ((signed x << c) >> c): New canonicalization.

	* gcc.dg/pr101955.c: New test.
2023-08-04 09:08:05 +02:00
Pan Li
236ec7aac0 RISC-V: Support RVV VFNMSAC rounding mode intrinsic API
This patch would like to support the rounding mode API for the
VFNMSAC for the below samples.

* __riscv_vfnmsac_vv_f32m1_rm
* __riscv_vfnmsac_vv_f32m1_rm_m
* __riscv_vfnmsac_vf_f32m1_rm
* __riscv_vfnmsac_vf_f32m1_rm_m

Signed-off-by: Pan Li <pan2.li@intel.com>

gcc/ChangeLog:

	* config/riscv/riscv-vector-builtins-bases.cc
	(class vfnmsac_frm): New class for vfnmsac frm.
	(vfnmsac_frm_obj): New declaration.
	(BASE): Ditto.
	* config/riscv/riscv-vector-builtins-bases.h: Ditto.
	* config/riscv/riscv-vector-builtins-functions.def
	(vfnmsac_frm): New function definition.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/float-point-single-negate-multiply-sub.c:
	New test.
2023-08-04 14:03:10 +08:00
Pan Li
dccd7e8a72 RISC-V: Support RVV VFMSAC rounding mode intrinsic API
This patch would like to support the rounding mode API for the
VFMSAC for the below samples.

* __riscv_vfmsac_vv_f32m1_rm
* __riscv_vfmsac_vv_f32m1_rm_m
* __riscv_vfmsac_vf_f32m1_rm
* __riscv_vfmsac_vf_f32m1_rm_m

Signed-off-by: Pan Li <pan2.li@intel.com>

gcc/ChangeLog:

	* config/riscv/riscv-vector-builtins-bases.cc
	(class vfmsac_frm): New class for vfmsac frm.
	(vfmsac_frm_obj): New declaration.
	(BASE): Ditto.
	* config/riscv/riscv-vector-builtins-bases.h: Ditto.
	* config/riscv/riscv-vector-builtins-functions.def
	(vfmsac_frm): New function definition.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/float-point-single-multiply-sub.c: New test.
2023-08-04 14:02:41 +08:00
Pan Li
62d9c1dd8e RISC-V: Support RVV VFNMACC rounding mode intrinsic API
This patch would like to support the rounding mode API for the
VFNMACC for the below samples.

* __riscv_vfnmacc_vv_f32m1_rm
* __riscv_vfnmacc_vv_f32m1_rm_m
* __riscv_vfnmacc_vf_f32m1_rm
* __riscv_vfnmacc_vf_f32m1_rm_m

Signed-off-by: Pan Li <pan2.li@intel.com>

gcc/ChangeLog:

	* config/riscv/riscv-vector-builtins-bases.cc
	(class vfnmacc_frm): New class for vfnmacc.
	(vfnmacc_frm_obj): New declaration.
	(BASE): Ditto.
	* config/riscv/riscv-vector-builtins-bases.h: Ditto.
	* config/riscv/riscv-vector-builtins-functions.def
	(vfnmacc_frm): New function definition.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/float-point-single-negate-multiply-add.c:
	New test.
2023-08-04 10:37:59 +08:00
Hao Liu
4d8b556317 AArch64: Avoid the ICE on empty reduction definition in info_for_reduction [PR110625]
Fix the assertion failure on empty reduction define in info_for_reduction.
Even a stmt is live, it may still have empty reduction define.  Check the
reduction definition instead of live info before calling info_for_reduction.

gcc/ChangeLog:

	PR target/110625
	* config/aarch64/aarch64.cc (aarch64_force_single_cycle): check
	STMT_VINFO_REDUC_DEF to avoid failures in info_for_reduction.

gcc/testsuite/ChangeLog:

	* gcc.target/aarch64/pr110625_3.c: New testcase.
2023-08-04 10:34:32 +08:00
Pan Li
51e5a5cefb RISC-V: Support RVV VFMACC rounding mode intrinsic API
This patch would like to support the rounding mode API for the
VFMACC for the below samples.

* __riscv_vfmacc_vv_f32m1_rm
* __riscv_vfmacc_vv_f32m1_rm_m
* __riscv_vfmacc_vf_f32m1_rm
* __riscv_vfmacc_vf_f32m1_rm_m

Signed-off-by: Pan Li <pan2.li@intel.com>

gcc/ChangeLog:

	* config/riscv/riscv-vector-builtins-bases.cc
	(class vfmacc_frm): New class for vfmacc frm.
	(vfmacc_frm_obj): New declaration.
	(BASE): Ditto.
	* config/riscv/riscv-vector-builtins-bases.h: Ditto.
	* config/riscv/riscv-vector-builtins-functions.def
	(vfmacc_frm): New function definition.
	* config/riscv/riscv-vector-builtins.cc
	(function_expander::use_ternop_insn): Add frm operand support.
	* config/riscv/vector.md: Add vfmuladd to frm_mode.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/float-point-single-multiply-add.c: New test.
2023-08-04 09:41:24 +08:00
Pan Li
dd03fb9962 RISC-V: Support RVV VFWMUL rounding mode intrinsic API
This patch would like to support the rounding mode API for the
VFWMUL for the below samples.

* __riscv_vfwmul_vv_f64m2_rm
* __riscv_vfwmul_vv_f64m2_rm_m
* __riscv_vfwmul_vf_f64m2_rm
* __riscv_vfwmul_vf_f64m2_rm_m

Signed-off-by: Pan Li <pan2.li@intel.com>

gcc/ChangeLog:

	* config/riscv/riscv-vector-builtins-bases.cc
	(vfwmul_frm_obj): New declaration.
	(vfwmul_frm): Ditto.
	* config/riscv/riscv-vector-builtins-bases.h:
	(vfwmul_frm): Ditto.
	* config/riscv/riscv-vector-builtins-functions.def
	(vfwmul_frm): New function definition.
	* config/riscv/vector.md: (frm_mode) Add vfwmul to frm_mode.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/float-point-widening-mul.c: New test.
2023-08-04 09:40:57 +08:00
Pan Li
b7ab3938c6 RISC-V: Support RVV VFDIV and VFRDIV rounding mode intrinsic API
This patch would like to support the rounding mode API for the
VFDIV and VFRDIV for the below samples.

* __riscv_vfdiv_vv_f32m1_rm
* __riscv_vfdiv_vv_f32m1_rm_m
* __riscv_vfdiv_vf_f32m1_rm
* __riscv_vfdiv_vf_f32m1_rm_m
* __riscv_vfrdiv_vf_f32m1_rm
* __riscv_vfrdiv_vf_f32m1_rm_m

Signed-off-by: Pan Li <pan2.li@intel.com>

gcc/ChangeLog:

	* config/riscv/riscv-vector-builtins-bases.cc
	(binop_frm): New declaration.
	(reverse_binop_frm): Likewise.
	(BASE): Likewise.
	* config/riscv/riscv-vector-builtins-bases.h:
	(vfdiv_frm): New extern declaration.
	(vfrdiv_frm): Likewise.
	* config/riscv/riscv-vector-builtins-functions.def
	(vfdiv_frm): New function definition.
	(vfrdiv_frm): Likewise.
	* config/riscv/vector.md: Add vfdiv to frm_mode.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/float-point-single-div.c: New test.
	* gcc.target/riscv/rvv/base/float-point-single-rdiv.c: New test.
2023-08-04 09:38:19 +08:00
GCC Administrator
86fa443330 Daily bump. 2023-08-04 00:17:17 +00:00
Jan Hubicka
4a0633d4d4 Print entry count in print_loop_info
gcc/ChangeLog:

	* tree-cfg.cc (print_loop_info): Print entry count.
2023-08-03 22:49:22 +02:00
Jan Hubicka
d6ac3aae2a Update loop iteration estimates after splitting
Hmmer's internal function has 4 loops.  The following is the profile at start:

  loop 1:
  estimate 472
  iterations by profile: 473.497707 (reliable) count in:84821 (precise, freq 0.9979)

    loop 2:
    estimate 99
    iterations by profile: 100.000000 (reliable) count in:39848881 (precise, freq 468.8104)

    loop 3:
    estimate 99
    iterations by profile: 100.000000 (reliable) count in:39848881 (precise, freq 468.8104)

  loop 4:
  estimate 100
  iterations by profile: 100.999596 (reliable) execution count:84167 (precise, freq 0.9902)

So the first loops is outer loop and second/third loops are nesed. Fourth loop is not critical.
Precise iteraiton counts are unknown (473 and 100 comes from profile)
Nested loop has following form:

    for (k = 1; k <= M; k++) {
      mc[k] = mpp[k-1]   + tpmm[k-1];
      if ((sc = ip[k-1]  + tpim[k-1]) > mc[k])  mc[k] = sc;
      if ((sc = dpp[k-1] + tpdm[k-1]) > mc[k])  mc[k] = sc;
      if ((sc = xmb  + bp[k])         > mc[k])  mc[k] = sc;
      mc[k] += ms[k];
      if (mc[k] < -INFTY) mc[k] = -INFTY;

      dc[k] = dc[k-1] + tpdd[k-1];
      if ((sc = mc[k-1] + tpmd[k-1]) > dc[k]) dc[k] = sc;
      if (dc[k] < -INFTY) dc[k] = -INFTY;

      if (k < M) {
        ic[k] = mpp[k] + tpmi[k];
        if ((sc = ip[k] + tpii[k]) > ic[k]) ic[k] = sc;
        ic[k] += is[k];
        if (ic[k] < -INFTY) ic[k] = -INFTY;
      }

We do quite some belly dancing here.
 1) loop-ch slightly misupdates profile, so the estimates of 99
    does not match profile setimate of 100.
 2) loops-split splits on if (k < M) and produces two loops.
    It fails to notice that the second loop never iterates.
    It used to misupdate profile a lot which later caused internal
    loop to become cold.  This is fixed now.
 3) loop-dist introduces runtime aliasing checks for both loops
 4) tree vectorizer vectorizes some of the copies of the loop produces
    and drops expected iteration counts
 5) loop peeling peels the loops with expected low iteration counts
 6) complete loop unrolling kills some loops in prologues/epilogues.

We end up with quite many loops and run out of registers:

  iterations by profile: 5.312499 (unreliable, maybe flat)
    this is vectorized internal loops after loop peeling

  iterations by profile: 0.009495 (unreliable, maybe flat)
  iterations by profile: 0.009495 (unreliable, maybe flat)
  iterations by profile: 0.009495 (unreliable, maybe flat)
  iterations by profile: 0.009495 (unreliable, maybe flat)
    Those are all versioned/peeled and vectorized variants of the loop never looping

  iterations by profile: 100.000008 (unreliable)
  iterations by profile: 100.000000 (unreliable)
    Those are variants with failed aliasing checks

  iterations by profile: 9.662853 (unreliable, maybe flat)
  iterations by profile: 4.646072 (unreliable)
  iterations by profile: 100.000007 (unreliable)
  iterations by profile: 5.312500 (unreliable)
  iterations by profile: 473.497707 (reliable)
    This is loop 1

  iterations by profile: 100.999596 (reliable)
    This is the loop 4.

This patch fixes loop iteration estimate update after loop split so we get:

  iterations by profile: 5.312499 (unreliable, maybe flat) entry count:12742188 (guessed, freq 149.9081)
    This is remainder of the peeled vectorized loop 2.  It misses estimate that is correct since after peeling it 6 times it is essentially
    impossible to tell what the remaining loop profile is (without histograms)

  iterations by profile: 0.009496 (unreliable, maybe flat) entry count:374801 (guessed, freq 4.4094)
    Peeled split part of loop 2 (one that never loops).  We ought to work this out
    but at least w

  estimate 99
  iterations by profile: 100.000008 (unreliable) entry count:3945039 (guessed, freq 46.4122)
  estimate 99
  iterations by profile: 100.000000 (unreliable) entry count:35505353 (guessed, freq 417.7100)

  estimate 99
  iterations by profile: 9.662853 (unreliable, maybe flat) entry count:35505353 (guessed, freq 417.7100)
    Profile here mismatches estimate - I will need to work out why.

  estimate 5
  iterations by profile: 4.646072 (unreliable) entry count:31954818 (guessed, freq 375.9390)
    This is vectorized but not peeled loop 3
  estimate 99
  iterations by profile: 100.000007 (unreliable) entry count:7101070 (guessed, freq 83.5420)
    Unvectorized variant of loop 3
  estimate 5
  iterations by profile: 5.312500 (unreliable) entry count:25563855 (guessed, freq 300.7512)
    Another vectorized variant of loop 3
  estimate 472
  iterations by profile: 473.497707 (reliable) entry count:84821 (precise, freq 0.9979)
    Outer loop

  estimate 100
  iterations by profile: 100.999596 (reliable) entry count:84167 (precise, freq 0.9902)
    loop 4, not vectorized/peeled

So there is still work to do on this testcase, but with the patch we prevent 3 useless loops.

Bootstrapped/regtested x86_64-linux, plan to commit it later today.

gcc/ChangeLog:

	* tree-ssa-loop-split.cc (split_loop): Update estimated iteration counts.
2023-08-03 22:47:55 +02:00
Jan Hubicka
93236ad9e8 Fix profiledbootstrap
Profiledbootstrap fails with ICE in update_loop_exit_probability_scale_dom_bbs
called from loop unroling.
The reason is that under relatively rare situations, we may run into case where
loop has multiple exits and all are considered as likely but then we scale down
the profile and one of the exits becomes unlikely.

We pass around unadjusted_exit_count to scale exit probability correctly.  In this
case we may end up using uninitialized value and profile-count type intentionally
bombs on that.

gcc/ChangeLog:

	PR bootstrap/110857
	* cfgloopmanip.cc (scale_loop_profile): (Un)initialize
	unadjusted_exit_count.
2023-08-03 22:42:27 +02:00
Aldy Hernandez
c83528d236 Read global value/mask in IPA.
Instead of reading the known zero bits in IPA, read the value/mask
pair which is available.

There is a slight change of behavior here.  I have removed the check
for SSA_NAME, as the ranger can calculate the range and value/mask for
INTEGER_CST.  This simplifies the code a bit, since there's no special
casing when setting the jfunc bits.  The default range for VR is
undefined, so I think it's safe just to check for undefined_p().

gcc/ChangeLog:

	* ipa-prop.cc (ipa_compute_jump_functions_for_edge): Read global
	value/mask.

gcc/testsuite/ChangeLog:

	* g++.dg/ipa/pure-const-3.C: Move source to...
	* g++.dg/ipa/pure-const-3.h: ...here, and adjust original test
	accordingly.
	* g++.dg/ipa/pure-const-3b.C: New.
2023-08-03 22:31:34 +02:00