Commit Graph

203838 Commits

Author SHA1 Message Date
Ian Lance Taylor
08dfde5a30 libgo: fix DejaGNU testsuite compiler when using build sysroot
Patch from Thomas Schwinge.

PR testsuite/109951
* configure.ac: 'AC_SUBST(SYSROOT_CFLAGS_FOR_TARGET)'.
* Makefile.in: Regenerate.
* configure: Likewise.
* testsuite/Makefile.in: Likewise.
* testsuite/lib/libgo.exp (libgo_init): If
'--with-build-sysroot=[...]' was specified, use it for build-tree
testing.
* testsuite/libgo-test-support.exp.in (GOC_UNDER_TEST): Don't set.
(SYSROOT_CFLAGS_FOR_TARGET): Set.

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/527755
2023-09-12 13:19:42 -07:00
Jason Merrill
f73d2d61a5 c++: __integer_pack with class argument [PR111357]
The argument might not already be an integer.

	PR c++/111357

gcc/cp/ChangeLog:

	* pt.cc (expand_integer_pack): Convert argument to int.

gcc/testsuite/ChangeLog:

	* g++.dg/ext/integer-pack7.C: New test.
2023-09-12 13:27:13 -04:00
Jason Merrill
ea5abbb263 c++: ICE with -fno-exceptions and array init [PR107198]
The removed line no longer has an effect on anew5.C error recovery, and
removing it improves error recovery for this testcase.

	PR c++/107198

gcc/cp/ChangeLog:

	* typeck2.cc (process_init_constructor_array): Use VEC_INIT_EXPR
	regardless of seen_error.

gcc/testsuite/ChangeLog:

	* g++.dg/eh/no-exceptions1.C: New test.
2023-09-12 13:26:23 -04:00
Martin Jambor
27e2e7c93e
math-opts: Add dbgcounter for FMA formation
This patch is a simple addition of a debug counter to FMA formation in
tree-ssa-math-opts.cc.  Given that issues with FMAs do occasionally
pop up, it seems genuinely useful.

I simply added an if right after the initial checks in
convert_mult_to_fma even though when FMA formation deferring is
active (i.e. when targeting Zen CPUs) this would interact with it (and
at this moment lead to producing all deferred candidates), so when
using the dbg counter to find a harmful set of FMAs, it is probably
best to also set param_avoid_fma_max_bits to zero.  I could not find a
better place which would not also make the code unnecessarily more
complicated.

gcc/ChangeLog:

2023-09-06  Martin Jambor  <mjambor@suse.cz>

	* dbgcnt.def (form_fma): New.
	* tree-ssa-math-opts.cc: Include dbgcnt.h.
	(convert_mult_to_fma): Bail out if the debug counter say so.
2023-09-12 19:23:20 +02:00
Edwin Lu
2e36c4a04a MAINTAINERS: Add myself to write after approval
ChangeLog:

	* MAINTAINERS: Add myself
2023-09-12 09:49:43 -07:00
Edwin Lu
360c8cad6a RISC-V: Finish Typing Un-Typed Instructions and Turn on Assert
Updates autovec instruction that was added after last patch and turns on the
assert statement to ensure all new instructions have a type.

	* config/riscv/autovec-opt.md: Update type
	* config/riscv/riscv.cc (riscv_sched_variable_issue): Enable assert

Reviewed-by: Jeff Law <jlaw@ventanamicro.com>
Signed-off-by: Edwin Lu <ewlu@rivosinc.com>
2023-09-12 09:31:40 -07:00
Patrick Palka
52f65d17c8 libstdc++: Fix std::not_fn perfect forwarding [PR111327]
The previous patch fixed perfect forwarding in std::bind_front.
This patch fixes the same issue in std::not_fn.

	PR libstdc++/111327

libstdc++-v3/ChangeLog:

	* include/std/functional (_GLIBCXX_NOT_FN_CALL_OP): Also define
	a deleted fallback operator() overload.  Constrain both the
	enabled and deleted overloads accordingly.
	* testsuite/20_util/function_objects/not_fn/111327.cc: New test.
2023-09-12 11:26:50 -04:00
Patrick Palka
4289f6ceef libstdc++: Fix std::bind_front perfect forwarding [PR111327]
In order to properly implement a perfect forwarding call wrapper (without
C++23 deducing 'this') we need a total of 8 operator() overloads, 4
enabled ones and 4 deleted ones, i.e. two for each const/ref qual pair,
as described in section 5.5 of P0847R6.  Otherwise the wrapper may not
do the right thing if the underlying function object has a deleted
const/ref-qualified operator() overload.  This patch fixes this issue in
std::bind_front.

	PR libstdc++/111327

libstdc++-v3/ChangeLog:

	* include/std/functional (_Bind_front::operator()): Add deleted
	fallback overloads for each const/ref qualifier pair.  Give the
	enabled overloads dummy constraints to make each one more
	specialized than the corresponding deleted overload.
	* testsuite/20_util/function_objects/bind_front/111327.cc: New test.
2023-09-12 11:23:12 -04:00
Patrick Palka
f1e87aee5b libstdc++: Remove std::bind_front specialization for no bound args
The specialization used by std::bind_front when there are no bound args
(added by r13-4214-gcbd05ca5ab1231) seems to be mostly obsoleted by
r13-5033-ge2eab3c4edb6aa which added [[no_unique_address]] to the main
template's data members.  What's left to consider is the compile time
advantage of the specialization, which doesn't seem huge since it just
avoids using tuple<> (which is an explicit specialization anyway) and
expanding some pack expansions with an empty argument pack.  So this
patch removes this specialization; this means we have one less spot to
fix the PR libstdc++/111327 perfect forwarding bug.

libstdc++-v3/ChangeLog:

	* include/std/functional (_Bind_front0): Remove.
	(_Bind_front_t): Adjust.
2023-09-12 11:23:08 -04:00
Richard Sandiford
3e4afea3b1 aarch64: Make stack smash canary protect saved registers
AArch64 normally puts the saved registers near the bottom of the frame,
immediately above any dynamic allocations.  But this means that a
stack-smash attack on those dynamic allocations could overwrite the
saved registers without needing to reach as far as the stack smash
canary.

The same thing could also happen for variable-sized arguments that are
passed by value, since those are allocated before a call and popped on
return.

This patch avoids that by putting the locals (and thus the canary) below
the saved registers when stack smash protection is active.

The patch fixes CVE-2023-4039.

gcc/
	* config/aarch64/aarch64.cc (aarch64_save_regs_above_locals_p):
	New function.
	(aarch64_layout_frame): Use it to decide whether locals should
	go above or below the saved registers.
	(aarch64_expand_prologue): Update stack layout comment.
	Emit a stack tie after the final adjustment.

gcc/testsuite/
	* gcc.target/aarch64/stack-protector-8.c: New test.
	* gcc.target/aarch64/stack-protector-9.c: Likewise.
2023-09-12 16:05:13 +01:00
Richard Sandiford
2abfc867d3 aarch64: Remove below_hard_fp_saved_regs_size
After previous patches, it's no longer necessary to store
saved_regs_size and below_hard_fp_saved_regs_size in the frame info.
All measurements instead use the top or bottom of the frame as
reference points.

gcc/
	* config/aarch64/aarch64.h (aarch64_frame::saved_regs_size)
	(aarch64_frame::below_hard_fp_saved_regs_size): Delete.
	* config/aarch64/aarch64.cc (aarch64_layout_frame): Update accordingly.
2023-09-12 16:05:12 +01:00
Richard Sandiford
5ce957484e aarch64: Explicitly record probe registers in frame info
The stack frame is currently divided into three areas:

A: the area above the hard frame pointer
B: the SVE saves below the hard frame pointer
C: the outgoing arguments

If the stack frame is allocated in one chunk, the allocation needs a
probe if the frame size is >= guard_size - 1KiB.  In addition, if the
function is not a leaf function, it must probe an address no more than
1KiB above the outgoing SP.  We ensured the second condition by

(1) using single-chunk allocations for non-leaf functions only if
    the link register save slot is within 512 bytes of the bottom
    of the frame; and

(2) using the link register save as a probe (meaning, for instance,
    that it can't be individually shrink wrapped)

If instead the stack is allocated in multiple chunks, then:

* an allocation involving only the outgoing arguments (C above) requires
  a probe if the allocation size is > 1KiB

* any other allocation requires a probe if the allocation size
  is >= guard_size - 1KiB

* second and subsequent allocations require the previous allocation
  to probe at the bottom of the allocated area, regardless of the size
  of that previous allocation

The final point means that, unlike for single allocations,
it can be necessary to have both a non-SVE register probe and
an SVE register probe.  For example:

* allocate A, probe using a non-SVE register save
* allocate B, probe using an SVE register save
* allocate C

The non-SVE register used in this case was again the link register.
It was previously used even if the link register save slot was some
bytes above the bottom of the non-SVE register saves, but an earlier
patch avoided that by putting the link register save slot first.

As a belt-and-braces fix, this patch explicitly records which
probe registers we're using and allows the non-SVE probe to be
whichever register comes first (as for SVE).

The patch also avoids unnecessary probes in sve/pcs/stack_clash_3.c.

gcc/
	* config/aarch64/aarch64.h (aarch64_frame::sve_save_and_probe)
	(aarch64_frame::hard_fp_save_and_probe): New fields.
	* config/aarch64/aarch64.cc (aarch64_layout_frame): Initialize them.
	Rather than asserting that a leaf function saves LR, instead assert
	that a leaf function saves something.
	(aarch64_get_separate_components): Prevent the chosen probe
	registers from being individually shrink-wrapped.
	(aarch64_allocate_and_probe_stack_space): Remove workaround for
	probe registers that aren't at the bottom of the previous allocation.

gcc/testsuite/
	* gcc.target/aarch64/sve/pcs/stack_clash_3.c: Avoid redundant probes.
2023-09-12 16:05:12 +01:00
Richard Sandiford
f87028a905 aarch64: Simplify probe of final frame allocation
Previous patches ensured that the final frame allocation only needs
a probe when the size is strictly greater than 1KiB.  It's therefore
safe to use the normal 1024 probe offset in all cases.

The main motivation for doing this is to simplify the code and
remove the number of special cases.

gcc/
	* config/aarch64/aarch64.cc (aarch64_allocate_and_probe_stack_space):
	Always probe the residual allocation at offset 1024, asserting
	that that is in range.

gcc/testsuite/
	* gcc.target/aarch64/stack-check-prologue-17.c: Expect the probe
	to be at offset 1024 rather than offset 0.
	* gcc.target/aarch64/stack-check-prologue-18.c: Likewise.
	* gcc.target/aarch64/stack-check-prologue-19.c: Likewise.
2023-09-12 16:05:11 +01:00
Richard Sandiford
fee0a18abf aarch64: Put LR save probe in first 16 bytes
-fstack-clash-protection uses the save of LR as a probe for the next
allocation.  The next allocation could be:

* another part of the static frame, e.g. when allocating SVE save slots
  or outgoing arguments

* an alloca in the same function

* an allocation made by a callee function

However, when -fomit-frame-pointer is used, the LR save slot is placed
above the other GPR save slots.  It could therefore be up to 80 bytes
above the base of the GPR save area (which is also the hard fp address).

aarch64_allocate_and_probe_stack_space took this into account when
deciding how much subsequent space could be allocated without needing
a probe.  However, it interacted badly with:

      /* If doing a small final adjustment, we always probe at offset 0.
	 This is done to avoid issues when LR is not at position 0 or when
	 the final adjustment is smaller than the probing offset.  */
      else if (final_adjustment_p && rounded_size == 0)
	residual_probe_offset = 0;

which forces any allocation that is smaller than the guard page size
to be probed at offset 0 rather than the usual offset 1024.  It was
therefore possible to construct cases in which we had:

* a probe using LR at SP + 80 bytes (or some other value >= 16)
* an allocation of the guard page size - 16 bytes
* a probe at SP + 0

which allocates guard page size + 64 consecutive unprobed bytes.

This patch requires the LR probe to be in the first 16 bytes of the
save area when stack clash protection is active.  Doing it
unconditionally would cause code-quality regressions.

Putting LR before other registers prevents push/pop allocation
when shadow call stacks are enabled, since LR is restored
separately from the other callee-saved registers.

The new comment doesn't say that the probe register is required
to be LR, since a later patch removes that restriction.

gcc/
	* config/aarch64/aarch64.cc (aarch64_layout_frame): Ensure that
	the LR save slot is in the first 16 bytes of the register save area.
	Only form STP/LDP push/pop candidates if both registers are valid.
	(aarch64_allocate_and_probe_stack_space): Remove workaround for
	when LR was not in the first 16 bytes.

gcc/testsuite/
	* gcc.target/aarch64/stack-check-prologue-18.c: New test.
	* gcc.target/aarch64/stack-check-prologue-19.c: Likewise.
	* gcc.target/aarch64/stack-check-prologue-20.c: Likewise.
2023-09-12 16:05:11 +01:00
Richard Sandiford
1785b8077c aarch64: Tweak stack clash boundary condition
The AArch64 ABI says that, when stack clash protection is used,
there can be a maximum of 1KiB of unprobed space at sp on entry
to a function.  Therefore, we need to probe when allocating
>= guard_size - 1KiB of data (>= rather than >).  This is what
GCC does.

If an allocation is exactly guard_size bytes, it is enough to allocate
those bytes and probe once at offset 1024.  It isn't possible to use a
single probe at any other offset: higher would conmplicate later code,
by leaving more unprobed space than usual, while lower would risk
leaving an entire page unprobed.  For simplicity, the code probes all
allocations at offset 1024.

Some register saves also act as probes.  If we need to allocate
more space below the last such register save probe, we need to
probe the allocation if it is > 1KiB.  Again, this allocation is
then sometimes (but not always) probed at offset 1024.  This sort of
allocation is currently only used for outgoing arguments, which are
rarely this big.

However, the code also probed if this final outgoing-arguments
allocation was == 1KiB, rather than just > 1KiB.  This isn't
necessary, since the register save then probes at offset 1024
as required.  Continuing to probe allocations of exactly 1KiB
would complicate later patches.

gcc/
	* config/aarch64/aarch64.cc (aarch64_allocate_and_probe_stack_space):
	Don't probe final allocations that are exactly 1KiB in size (after
	unprobed space above the final allocation has been deducted).

gcc/testsuite/
	* gcc.target/aarch64/stack-check-prologue-17.c: New test.
2023-09-12 16:05:10 +01:00
Richard Sandiford
ee5466ff4f aarch64: Minor initial adjustment tweak
This patch just changes a calculation of initial_adjust
to one that makes it slightly more obvious that the total
adjustment is frame.frame_size.

gcc/
	* config/aarch64/aarch64.cc (aarch64_layout_frame): Tweak
	calculation of initial_adjust for frames in which all saves
	are SVE saves.
2023-09-12 16:05:10 +01:00
Richard Sandiford
bc9dcdde80 aarch64: Simplify top of frame allocation
After previous patches, it no longer really makes sense to allocate
the top of the frame in terms of varargs_and_saved_regs_size and
saved_regs_and_above.

gcc/
	* config/aarch64/aarch64.cc (aarch64_layout_frame): Simplify
	the allocation of the top of the frame.
2023-09-12 16:05:09 +01:00
Richard Sandiford
67a36b6f5d aarch64: Measure reg_offset from the bottom of the frame
reg_offset was measured from the bottom of the saved register area.
This made perfect sense with the original layout, since the bottom
of the saved register area was also the hard frame pointer address.
It became slightly less obvious with SVE, since we save SVE
registers below the hard frame pointer, but it still made sense.

However, if we want to allow different frame layouts, it's more
convenient and obvious to measure reg_offset from the bottom of
the frame.  After previous patches, it's also a slight simplification
in its own right.

gcc/
	* config/aarch64/aarch64.h (aarch64_frame): Add comment above
	reg_offset.
	* config/aarch64/aarch64.cc (aarch64_layout_frame): Walk offsets
	from the bottom of the frame, rather than the bottom of the saved
	register area.  Measure reg_offset from the bottom of the frame
	rather than the bottom of the saved register area.
	(aarch64_save_callee_saves): Update accordingly.
	(aarch64_restore_callee_saves): Likewise.
	(aarch64_get_separate_components): Likewise.
	(aarch64_process_components): Likewise.
2023-09-12 16:05:09 +01:00
Richard Sandiford
492b60670e aarch64: Tweak frame_size comment
This patch fixes another case in which a value was described with
an “upside-down” view.

gcc/
	* config/aarch64/aarch64.h (aarch64_frame::frame_size): Tweak comment.
2023-09-12 16:05:08 +01:00
Richard Sandiford
ed61c87f04 aarch64: Rename hard_fp_offset to bytes_above_hard_fp
Similarly to the previous locals_offset patch, hard_fp_offset
was described as:

  /* Offset from the base of the frame (incomming SP) to the
     hard_frame_pointer.  This value is always a multiple of
     STACK_BOUNDARY.  */
  poly_int64 hard_fp_offset;

which again took an “upside-down” view: higher offsets meant lower
addresses.  This patch renames the field to bytes_above_hard_fp instead.

gcc/
	* config/aarch64/aarch64.h (aarch64_frame::hard_fp_offset): Rename
	to...
	(aarch64_frame::bytes_above_hard_fp): ...this.
	* config/aarch64/aarch64.cc (aarch64_layout_frame)
	(aarch64_expand_prologue): Update accordingly.
	(aarch64_initial_elimination_offset): Likewise.
2023-09-12 16:05:08 +01:00
Richard Sandiford
28034dbb5e aarch64: Rename locals_offset to bytes_above_locals
locals_offset was described as:

  /* Offset from the base of the frame (incomming SP) to the
     top of the locals area.  This value is always a multiple of
     STACK_BOUNDARY.  */

This is implicitly an “upside down” view of the frame: the incoming
SP is at offset 0, and anything N bytes below the incoming SP is at
offset N (rather than -N).

However, reg_offset instead uses a “right way up” view; that is,
it views offsets in address terms.  Something above X is at a
positive offset from X and something below X is at a negative
offset from X.

Also, even on FRAME_GROWS_DOWNWARD targets like AArch64,
target-independent code views offsets in address terms too:
locals are allocated at negative offsets to virtual_stack_vars.

It seems confusing to have *_offset fields of the same structure
using different polarities like this.  This patch tries to avoid
that by renaming locals_offset to bytes_above_locals.

gcc/
	* config/aarch64/aarch64.h (aarch64_frame::locals_offset): Rename to...
	(aarch64_frame::bytes_above_locals): ...this.
	* config/aarch64/aarch64.cc (aarch64_layout_frame)
	(aarch64_initial_elimination_offset): Update accordingly.
2023-09-12 16:05:07 +01:00
Richard Sandiford
aa8b57ee02 aarch64: Only calculate chain_offset if there is a chain
After previous patches, it is no longer necessary to calculate
a chain_offset in cases where there is no chain record.

gcc/
	* config/aarch64/aarch64.cc (aarch64_expand_prologue): Move the
	calculation of chain_offset into the emit_frame_chain block.
2023-09-12 16:05:07 +01:00
Richard Sandiford
3869896726 aarch64: Tweak aarch64_save/restore_callee_saves
aarch64_save_callee_saves and aarch64_restore_callee_saves took
a parameter called start_offset that gives the offset of the
bottom of the saved register area from the current stack pointer.
However, it's more convenient for later patches if we use the
bottom of the entire frame as the reference point, rather than
the bottom of the saved registers.

Doing that removes the need for the callee_offset field.
Other than that, this is not a win on its own.  It only really
makes sense in combination with the follow-on patches.

gcc/
	* config/aarch64/aarch64.h (aarch64_frame::callee_offset): Delete.
	* config/aarch64/aarch64.cc (aarch64_layout_frame): Remove
	callee_offset handling.
	(aarch64_save_callee_saves): Replace the start_offset parameter
	with a bytes_below_sp parameter.
	(aarch64_restore_callee_saves): Likewise.
	(aarch64_expand_prologue): Update accordingly.
	(aarch64_expand_epilogue): Likewise.
2023-09-12 16:05:06 +01:00
Richard Sandiford
99305f3062 aarch64: Add bytes_below_hard_fp to frame info
Following on from the previous bytes_below_saved_regs patch, this one
records the number of bytes that are below the hard frame pointer.
This eventually replaces below_hard_fp_saved_regs_size.

If a frame pointer is not needed, the epilogue adds final_adjust
to the stack pointer before restoring registers:

     aarch64_add_sp (tmp1_rtx, tmp0_rtx, final_adjust, true);

Therefore, if the epilogue needs to restore the stack pointer from
the hard frame pointer, the directly corresponding offset is:

     -bytes_below_hard_fp + final_adjust

i.e. go from the hard frame pointer to the bottom of the frame,
then add the same amount as if we were using the stack pointer
from the outset.

gcc/
	* config/aarch64/aarch64.h (aarch64_frame::bytes_below_hard_fp): New
	field.
	* config/aarch64/aarch64.cc (aarch64_layout_frame): Initialize it.
	(aarch64_expand_epilogue): Use it instead of
	below_hard_fp_saved_regs_size.
2023-09-12 16:05:06 +01:00
Richard Sandiford
7b792ecaa9 aarch64: Add bytes_below_saved_regs to frame info
The frame layout code currently hard-codes the assumption that
the number of bytes below the saved registers is equal to the
size of the outgoing arguments.  This patch abstracts that
value into a new field of aarch64_frame.

gcc/
	* config/aarch64/aarch64.h (aarch64_frame::bytes_below_saved_regs): New
	field.
	* config/aarch64/aarch64.cc (aarch64_layout_frame): Initialize it,
	and use it instead of crtl->outgoing_args_size.
	(aarch64_get_separate_components): Use bytes_below_saved_regs instead
	of outgoing_args_size.
	(aarch64_process_components): Likewise.
2023-09-12 16:05:05 +01:00
Richard Sandiford
c601c918c9 aarch64: Explicitly handle frames with no saved registers
If a frame has no saved registers, it can be allocated in one go.
There is no need to treat the areas below and above the saved
registers as separate.

And if we allocate the frame in one go, it should be allocated
as the initial_adjust rather than the final_adjust.  This allows the
frame size to grow to guard_size - guard_used_by_caller before a stack
probe is needed.  (A frame with no register saves is necessarily a
leaf frame.)

This is a no-op as thing stand, since a leaf function will have
no outgoing arguments, and so all the frame will be above where
the saved registers normally go.

gcc/
	* config/aarch64/aarch64.cc (aarch64_layout_frame): Explicitly
	allocate the frame in one go if there are no saved registers.
2023-09-12 16:05:05 +01:00
Richard Sandiford
f9ab771fa8 aarch64: Avoid a use of callee_offset
When we emit the frame chain, i.e. when we reach Here in this statement
of aarch64_expand_prologue:

  if (emit_frame_chain)
    {
      // Here
      ...
    }

the stack is in one of two states:

- We've allocated up to the frame chain, but no more.

- We've allocated the whole frame, and the frame chain is within easy
  reach of the new SP.

The offset of the frame chain from the current SP is available
in aarch64_frame as callee_offset.  It is also available as the
chain_offset local variable, where the latter is calculated from other
data.  (However, chain_offset is not always equal to callee_offset when
!emit_frame_chain, so chain_offset isn't redundant.)

In c600df9a40 I switched to using
chain_offset for the initialisation of the hard frame pointer:

       aarch64_add_offset (Pmode, hard_frame_pointer_rtx,
-                         stack_pointer_rtx, callee_offset,
+                         stack_pointer_rtx, chain_offset,
                          tmp1_rtx, tmp0_rtx, frame_pointer_needed);

But the later REG_CFA_ADJUST_CFA handling still used callee_offset.

I think the difference is harmless, but it's more logical for the
CFA note to be in sync, and it's more convenient for later patches
if it uses chain_offset.

gcc/
	* config/aarch64/aarch64.cc (aarch64_expand_prologue): Use
	chain_offset rather than callee_offset.
2023-09-12 16:05:04 +01:00
Richard Sandiford
76d89da25a aarch64: Use local frame vars in shrink-wrapping code
aarch64_layout_frame uses a shorthand for referring to
cfun->machine->frame:

  aarch64_frame &frame = cfun->machine->frame;

This patch does the same for some other heavy users of the structure.
No functional change intended.

gcc/
	* config/aarch64/aarch64.cc (aarch64_save_callee_saves): Use
	a local shorthand for cfun->machine->frame.
	(aarch64_restore_callee_saves, aarch64_get_separate_components):
	(aarch64_process_components): Likewise.
	(aarch64_allocate_and_probe_stack_space): Likewise.
	(aarch64_expand_prologue, aarch64_expand_epilogue): Likewise.
	(aarch64_layout_frame): Use existing shorthand for one more case.
2023-09-12 16:05:04 +01:00
Andrew Pinski
895e476f64 MATCH: Simplify (a CMP1 b) ^ (a CMP2 b)
This adds the missing optimizations here.
Note we don't need to match where CMP1 and CMP2 are complements of each
other as that is already handled elsewhere.

I added a new executable testcase to make sure we optimize it correctly
as I had originally messed up one of the entries for the resulting
comparison to make sure they were 100% correct.

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

	PR tree-optimization/107881

gcc/ChangeLog:

	* match.pd (`(a CMP1 b) ^ (a CMP2 b)`): New pattern.
	(`(a CMP1 b) == (a CMP2 b)`): New pattern.

gcc/testsuite/ChangeLog:

	* gcc.c-torture/execute/pr107881-1.c: New test.
	* gcc.dg/tree-ssa/cmpeq-4.c: New test.
	* gcc.dg/tree-ssa/cmpxor-1.c: New test.
2023-09-12 08:02:06 -07:00
Pan Li
75f069a640 RISC-V: Remove unused structure in cost model
The struct range is unused, remove it.

gcc/ChangeLog:

	* config/riscv/riscv-vector-costs.h (struct range): Removed.

Signed-off-by: Pan Li <pan2.li@intel.com>
2023-09-12 21:21:07 +08:00
Jonathan Wakely
df63338236 contrib: Quote variable in test expression [PR111360]
Without the quotes some shells will always return true and some will
print an error. It should be quoted so that a null variable works as
intended.

contrib/ChangeLog:

	PR other/111360
	* gcc_update: Quote variable.
2023-09-12 12:42:47 +01:00
Jonathan Wakely
e08559271b libstdc++: Format Python code according to PEP8
These files were filtered through autopep8 to reformat them more
conventionally.

libstdc++-v3/ChangeLog:

	* python/libstdcxx/v6/printers.py: Reformat.
	* python/libstdcxx/v6/xmethods.py: Likewise.
2023-09-12 12:41:27 +01:00
Juzhe-Zhong
af6d089b4d RISC-V: Support Dynamic LMUL Cost model
This patch support dynamic LMUL cost modeling with --param=riscv-autovec-lmul=dynamic.

Consider this following case:
void
foo (int32_t *__restrict a, int32_t *__restrict b,    int32_t *__restrict c,
      int32_t *__restrict a2, int32_t *__restrict b2, int32_t *__restrict c2,
      int32_t *__restrict a3, int32_t *__restrict b3, int32_t *__restrict c3,
      int32_t *__restrict a4, int32_t *__restrict b4, int32_t *__restrict c4,
      int32_t *__restrict a5, int32_t *__restrict b5, int32_t *__restrict c5,
      int32_t *__restrict d,
      int32_t *__restrict d2,
      int32_t *__restrict d3,
      int32_t *__restrict d4,
      int32_t *__restrict d5,
      int n)
{
  for (int i = 0; i < n; i++)
    {
      a[i] = b[i] + c[i];
      b5[i] = b[i] + c[i];
      a2[i] = b2[i] + c2[i];
      a3[i] = b3[i] + c3[i];
      a4[i] = b4[i] + c4[i];
      a5[i] = a[i] + a4[i];
      d2[i] = a2[i] + c2[i];
      d3[i] = a3[i] + c3[i];
      d4[i] = a4[i] + c4[i];
      d5[i] = a[i] + a4[i];
      a[i] = a5[i] + b5[i] + a[i];

      c2[i] = a[i] + c[i];
      c3[i] = b5[i] * a5[i];
      c4[i] = a2[i] * a3[i];
      c5[i] = b5[i] * a2[i];
      c[i] = a[i] + c3[i];
      c2[i] = a[i] + c4[i];
      a5[i] = a[i] + a4[i];
      a[i] = a[i] + b5[i] + a[i] * a2[i] * a3[i] * a4[i]
      * a5[i] * c[i] * c2[i] * c3[i] * c4[i] * c5[i]
      * d[i] * d2[i] * d3[i] * d4[i] * d5[i];
    }
}

Demo: https://godbolt.org/z/x1acoMxGT

You can see it will produce register spilling if you specify LMUL >= 4

Now, with --param=riscv-autovec-lmul=dynamic.

GCC is able to pick LMUL = 2 to optimized this case.

This feature is supported by linear scan based local live ranges analysis and
compute maximum live V_REGS in specific program point of the function to determine the VF/LMUL.

Note that this patch can well handle both SLP and non-SLP loop.

Currenty approach didn't consider the later instruction scheduler which may improve the register pressure.
In this case, we are conservatively applying smaller VF/LMUL. (Not sure whether we should support live range shrink for such corner case since we don't known whether it can improve performance a lot.)

gcc/ChangeLog:

	* config/riscv/riscv-vector-costs.cc (get_last_live_range): New function.
	(compute_nregs_for_mode): Ditto.
	(live_range_conflict_p): Ditto.
	(max_number_of_live_regs): Ditto.
	(compute_lmul): Ditto.
	(costs::prefer_new_lmul_p): Ditto.
	(costs::better_main_loop_than_p): Ditto.
	* config/riscv/riscv-vector-costs.h (struct stmt_point): New struct.
	(struct var_live_range): Ditto.
	(struct autovec_info): Ditto.
	* config/riscv/t-riscv: Update makefile for COST model.

gcc/testsuite/ChangeLog:

	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul-mixed-1.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-1.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-2.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-3.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-4.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-5.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-6.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-7.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-1.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-2.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-3.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-4.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-5.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-6.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-1.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-2.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-3.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-4.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-5.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-6.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-7.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-8.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-1.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-10.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-2.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-3.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-4.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-5.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-6.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-7.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-8.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-9.c: New test.
	* gcc.dg/vect/costmodel/riscv/rvv/rvv-costmodel-vect.exp: New test.
2023-09-12 19:32:26 +08:00
Jakub Jelinek
b24fd3bccf fold-const: Handle BITINT_TYPE in range_check_type
When discussing PR111369 with Andrew Pinski, I've realized that
I haven't added BITINT_TYPE handling to range_check_type.  Right now
(unsigned) max + 1 == (unsigned) min for signed _BitInt,l so I think we
don't need to do the extra hops for BITINT_TYPE (though possibly we don't
need them for INTEGER_TYPE either in the two's complement word and we don't
support anything else, though I really don't know if Ada or some other
FEs don't create weird INTEGER_TYPEs).

2023-09-12  Jakub Jelinek  <jakub@redhat.com>

	* fold-const.cc (range_check_type): Handle BITINT_TYPE like
	OFFSET_TYPE.
2023-09-12 13:08:54 +02:00
Jakub Jelinek
6067dbdcf7 sccvn: Avoid ICEs on _BitInt load BIT_AND_EXPR mask [PR111338]
The following testcase ICEs, because vn_walk_cb_data::push_partial_def
uses a fixed size buffer (64 target bytes) for its
construction/deconstruction of partial stores and fails if larger precision
than that is needed, and the PR93582 changes assert push_partial_def
succeeds (and check the various other conditions much earlier when seeing
the BIT_AND_EXPR statement, like CHAR_BIT == 8, BITS_PER_UNIT == 8,
BYTES_BIG_ENDIAN == WORDS_BIG_ENDIAN, etc.).  So, just removing the assert
and allowing it fail there doesn't really work and ICEs later on.

The following patch moves the bufsize out of the method and tests it
together with the other checks.

BTW, perhaps we could increase the bufsize as well or in addition to
increasing it make the buffer allocated using XALLOCAVEC, but still I think
it is useful to have some upper bound and so I think this patch is useful
even in that case.

2023-09-12  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/111338
	* tree-ssa-sccvn.cc (struct vn_walk_cb_data): Add bufsize non-static
	data member.
	(vn_walk_cb_data::push_partial_def): Remove bufsize variable.
	(visit_nary_op): Avoid the BIT_AND_EXPR with constant rhs2
	optimization if type's precision is too large for
	vn_walk_cb_data::bufsize.

	* gcc.dg/bitint-37.c: New test.
2023-09-12 12:23:13 +02:00
Gaius Mulley
89b5866742 modula2: new option -Wcase-enum and associated fixes
This patch introduces -Wcase-enum which enumerates each missing
field in a case statement without an else clause providing the selector
expression type is an enum.

gcc/ChangeLog:

	* doc/gm2.texi (Compiler options): Document new option
	-Wcase-enum.

gcc/m2/ChangeLog:

	* gm2-compiler/M2CaseList.def (PushCase): Rename parameters
	r to rec and v to va.  Add expr parameter.
	(MissingCaseStatementBounds): New procedure function.
	* gm2-compiler/M2CaseList.mod (RangePair): Add expression.
	(PushCase): Rename parameters r to rec and v to va.  Add
	expr parameter.
	(RemoveRange): New procedure function.
	(SubBitRange): Detect the case when the range in the set matches
	lo..hi.
	(CheckLowHigh): New procedure.
	(ExcludeCaseRanges): Rename parameter c to cd.  Rename local
	variables q to cl and r to rp.
	(High): Remove.
	(Low): Remove.
	(DoEnumValues): Remove.
	(IncludeElement): New procedure.
	(IncludeElements): New procedure.
	(ErrorRangeEnum): New procedure.
	(ErrorRange): Remove.
	(ErrorRanges): Remove.
	(appendEnum): New procedure.
	(appendStr): New procedure.
	(EnumerateErrors): New procedure.
	(MissingCaseBounds): Re-implement.
	(InRangeList): Remove.
	(MissingCaseStatementBounds): New procedure function.
	(checkTypes): Re-format.
	(inRange): Re-format.
	(TypeCaseBounds): Re-format.
	* gm2-compiler/M2Error.mod (GetAnnounceScope): Add noscope to
	case label list.
	* gm2-compiler/M2GCCDeclare.mod: Replace ForeachFieldEnumerationDo
	with ForeachLocalSymDo.
	* gm2-compiler/M2Options.def (SetCaseEnumChecking): New procedure.
	(CaseEnumChecking): New variable.
	* gm2-compiler/M2Options.mod (SetCaseEnumChecking): New procedure.
	(Module initialization): set CaseEnumChecking to FALSE.
	* gm2-compiler/M2Quads.def (QuadOperator): Alphabetically ordered.
	* gm2-compiler/M2Quads.mod (IsBackReferenceConditional): Add else
	clause.
	(BuildCaseStart): Pass selector expression to InitCaseBounds.
	(CheckUninitializedVariablesAreUsed): Remove.
	(IsInlineWithinBlock): Remove.
	(AsmStatementsInBlock): Remove.
	(CheckVariablesInBlock): Remove commented code.
	(BeginVarient): Pass NulSym to InitCaseBounds.
	* gm2-compiler/M2Range.mod (FoldCaseBounds): New local variable
	errorGenerated.  Add call to MissingCaseStatementBounds.
	* gm2-compiler/P3Build.bnf (CaseEndStatement): Call ElseCase.
	* gm2-compiler/PCSymBuild.mod (InitDesExpr): Add else clause.
	(InitFunction): Add else clause.
	(InitConvert): Add else clause.
	(InitLeaf): Add else clause.
	(InitBinary): Add else clause.
	(InitUnary): Add else clause.
	* gm2-compiler/SymbolTable.def (GetNth): Re-write comment.
	(ForeachFieldEnumerationDo): Re-write comment stating alphabetical
	traversal.
	* gm2-compiler/SymbolTable.mod (GetNth): Re-write comment.
	Add case label for EnumerationSym and call GetItemFromList.
	(ForeachFieldEnumerationDo): Re-write comment stating alphabetical
	traversal.
	(SymEnumeration): Add ListOfFields used for declaration order.
	(MakeEnumeration): Initialize ListOfFields.
	(PutFieldEnumeration): Include Field in ListOfFields.
	* gm2-gcc/m2options.h (M2Options_SetCaseEnumChecking): New
	function.
	* gm2-lang.cc (gm2_langhook_handle_option): Add
	OPT_Wcase_enum case and call M2Options_SetCaseEnumChecking.
	* lang.opt (Wcase-enum): Add.

gcc/testsuite/ChangeLog:

	* gm2/switches/case/fail/missingclause.mod: New test.
	* gm2/switches/case/fail/switches-case-fail.exp: New test.
	* gm2/switches/case/pass/enumcase.mod: New test.
	* gm2/switches/case/pass/enumcase2.mod: New test.
	* gm2/switches/case/pass/switches-case-pass.exp: New test.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2023-09-12 10:50:44 +01:00
Thomas Schwinge
56004123ab nvptx: stack size limits are relevant for execution only
For non-'dg-do run' test cases, that means: big 'dg-require-stack-size' need
not be UNSUPPORTED (and indeed now do all PASS), 'dg-add-options stack_size'
need not define (and thus limit) 'STACK_SIZE' (and still do all PASS).

Re "Find 'dg-do-what' in an outer frame", currently (sources not completely
clean, though), we've got:

    $ git grep -F 'check_effective_target_stack_size: found dg-do-what at level ' -- build-gcc/\*.log | sort | uniq -c
          6 build-gcc/gcc/testsuite/gcc/gcc.log:check_effective_target_stack_size: found dg-do-what at level 2
        267 build-gcc/gcc/testsuite/gcc/gcc.log:check_effective_target_stack_size: found dg-do-what at level 3
        239 build-gcc/gcc/testsuite/gcc/gcc.log:check_effective_target_stack_size: found dg-do-what at level 4

	gcc/testsuite/
	* lib/target-supports.exp (check_effective_target_stack_size): For
	nvptx target, stack size limits are relevant for execution only.
	gcc/
	* doc/sourcebuild.texi (stack_size): Update.
2023-09-12 11:43:07 +02:00
Christoph Müllner
949f1ccf1b riscv: Add support for str(n)cmp inline expansion
This patch implements expansions for the cmpstrsi and cmpstrnsi
builtins for RV32/RV64 for xlen-aligned strings if Zbb or XTheadBb
instructions are available.  The expansion basically emits a comparison
sequence which compares XLEN bits per step if possible.

This allows to inline calls to strcmp() and strncmp() if both strings
are xlen-aligned.  For strncmp() the length parameter needs to be known.
The benefits over calls to libc are:
* no call/ret instructions
* no stack frame allocation
* no register saving/restoring
* no alignment tests

The inlining mechanism is gated by a new switches ('-minline-strcmp' and
'-minline-strncmp') and by the variable 'optimize_size'.
The amount of emitted unrolled loop iterations can be controlled by the
parameter '--param=riscv-strcmp-inline-limit=N', which defaults to 64.

The comparision sequence is inspired by the strcmp example
in the appendix of the Bitmanip specification (incl. the fast
result calculation in case the first word does not contain
a NULL byte).  Additional inspiration comes from rs6000-string.c.

The emitted sequence is not triggering any readahead pagefault issues,
because only aligned strings are accessed by aligned xlen-loads.

This patch has been tested using the glibc string tests on QEMU:
* rv64gc_zbb/rv64gc_xtheadbb with riscv-strcmp-inline-limit=64
* rv64gc_zbb/rv64gc_xtheadbb with riscv-strcmp-inline-limit=8
* rv32gc_zbb/rv32gc_xtheadbb with riscv-strcmp-inline-limit=64

Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu>

gcc/ChangeLog:

	* config/riscv/bitmanip.md (*<optab>_not<mode>): Export INSN name.
	(<optab>_not<mode>3): Likewise.
	* config/riscv/riscv-protos.h (riscv_expand_strcmp): New
	prototype.
	* config/riscv/riscv-string.cc (GEN_EMIT_HELPER3): New helper
	macros.
	(GEN_EMIT_HELPER2): Likewise.
	(emit_strcmp_scalar_compare_byte): New function.
	(emit_strcmp_scalar_compare_subword): Likewise.
	(emit_strcmp_scalar_compare_word): Likewise.
	(emit_strcmp_scalar_load_and_compare): Likewise.
	(emit_strcmp_scalar_call_to_libc): Likewise.
	(emit_strcmp_scalar_result_calculation_nonul): Likewise.
	(emit_strcmp_scalar_result_calculation): Likewise.
	(riscv_expand_strcmp_scalar): Likewise.
	(riscv_expand_strcmp): Likewise.
	* config/riscv/riscv.md (*slt<u>_<X:mode><GPR:mode>): Export
	INSN name.
	(@slt<u>_<X:mode><GPR:mode>3): Likewise.
	(cmpstrnsi): Invoke expansion function for str(n)cmp.
	(cmpstrsi): Likewise.
	* config/riscv/riscv.opt: Add new parameter
	'-mstring-compare-inline-limit'.
	* doc/invoke.texi: Document new parameter
	'-mstring-compare-inline-limit'.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/xtheadbb-strcmp.c: New test.
	* gcc.target/riscv/zbb-strcmp-disabled-2.c: New test.
	* gcc.target/riscv/zbb-strcmp-disabled.c: New test.
	* gcc.target/riscv/zbb-strcmp-unaligned.c: New test.
	* gcc.target/riscv/zbb-strcmp.c: New test.

Signed-off-by: Philipp Tomsich <philipp.tomsich@vrull.eu>
2023-09-12 11:37:24 +02:00
Christoph Müllner
df48285b24 riscv: Add support for strlen inline expansion
This patch implements the expansion of the strlen builtin for RV32/RV64
for xlen-aligned aligned strings if Zbb or XTheadBb instructions are available.
The inserted sequences are:

rv32gc_zbb (RV64 is similar):
      add     a3,a0,4
      li      a4,-1
.L1:  lw      a5,0(a0)
      add     a0,a0,4
      orc.b   a5,a5
      beq     a5,a4,.L1
      not     a5,a5
      ctz     a5,a5
      srl     a5,a5,0x3
      add     a0,a0,a5
      sub     a0,a0,a3

rv64gc_xtheadbb (RV32 is similar):
      add       a4,a0,8
.L2:  ld        a5,0(a0)
      add       a0,a0,8
      th.tstnbz a5,a5
      beqz      a5,.L2
      th.rev    a5,a5
      th.ff1    a5,a5
      srl       a5,a5,0x3
      add       a0,a0,a5
      sub       a0,a0,a4

This allows to inline calls to strlen(), with optimized code for
xlen-aligned strings, resulting in the following benefits over
a call to libc:
* no call/ret instructions
* no stack frame allocation
* no register saving/restoring
* no alignment test

The inlining mechanism is gated by a new switch ('-minline-strlen')
and by the variable 'optimize_size'.

Tested using the glibc string tests.

Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu>

gcc/ChangeLog:

	* config.gcc: Add new object riscv-string.o.
	riscv-string.cc.
	* config/riscv/riscv-protos.h (riscv_expand_strlen):
	New function.
	* config/riscv/riscv.md (strlen<mode>): New expand INSN.
	* config/riscv/riscv.opt: New flag 'minline-strlen'.
	* config/riscv/t-riscv: Add new object riscv-string.o.
	* config/riscv/thead.md (th_rev<mode>2): Export INSN name.
	(th_rev<mode>2): Likewise.
	(th_tstnbz<mode>2): New INSN.
	* doc/invoke.texi: Document '-minline-strlen'.
	* emit-rtl.cc (emit_likely_jump_insn): New helper function.
	(emit_unlikely_jump_insn): Likewise.
	* rtl.h (emit_likely_jump_insn): New prototype.
	(emit_unlikely_jump_insn): Likewise.
	* config/riscv/riscv-string.cc: New file.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/xtheadbb-strlen-unaligned.c: New test.
	* gcc.target/riscv/xtheadbb-strlen.c: New test.
	* gcc.target/riscv/zbb-strlen-disabled-2.c: New test.
	* gcc.target/riscv/zbb-strlen-disabled.c: New test.
	* gcc.target/riscv/zbb-strlen-unaligned.c: New test.
	* gcc.target/riscv/zbb-strlen.c: New test.
2023-09-12 11:36:16 +02:00
Thomas Schwinge
fb5d27be27 libgomp: Consider '--with-build-sysroot=[...]' for target libraries' build-tree testing (instead of build-time 'CC' etc.) [PR91884, PR109951]
This is commit c8e759b421 (Subversion r279708)
"libgomp/test: Fix compilation for build sysroot" and follow-up
commit 749bd22ddc
"libgomp/test: Remove a build sysroot fix regression" done differently,
avoiding build-tree testing use of any random gunk that may appear in
build-time 'CC', 'CXX', 'FC'.

	PR testsuite/91884
	PR testsuite/109951
	libgomp/
	* configure.ac: Revert earlier changes, instead
	'AC_SUBST(SYSROOT_CFLAGS_FOR_TARGET)'.
	* Makefile.in: Regenerate.
	* configure: Likewise.
	* testsuite/Makefile.in: Likewise.
	* testsuite/lib/libgomp.exp (libgomp_init): Remove
	"Fix up '-funconfigured-libstdc++-v3' in 'GXX_UNDER_TEST'" code.
	If '--with-build-sysroot=[...]' was specified, use it for
	build-tree testing.
	* testsuite/libgomp-site-extra.exp.in (GCC_UNDER_TEST)
	(GXX_UNDER_TEST, GFORTRAN_UNDER_TEST): Don't set.
	(SYSROOT_CFLAGS_FOR_TARGET): Set.
	* testsuite/libgomp.c++/c++.exp (lang_source_re)
	(lang_include_flags): Set for build-tree testing.
	* testsuite/libgomp.oacc-c++/c++.exp (lang_source_re)
	(lang_include_flags): Likewise.

Co-authored-by: Chung-Lin Tang <cltang@codesourcery.com>
2023-09-12 11:30:37 +02:00
Thomas Schwinge
d1bff1ba4d Pass 'SYSROOT_CFLAGS_FOR_TARGET' down to target libraries [PR109951]
..., where we need to use it (separate commits) for build-tree testing, similar
to 'gcc/Makefile.in:site.exp':

    # TEST_ALWAYS_FLAGS are flags that should be passed to every compilation.
    # They are passed first to allow individual tests to override them.
    	@echo "set TEST_ALWAYS_FLAGS \"$(SYSROOT_CFLAGS_FOR_TARGET)\"" >> ./site.tmp

	PR testsuite/109951
	* Makefile.tpl (BASE_TARGET_EXPORTS): Add
	'SYSROOT_CFLAGS_FOR_TARGET'.
	* Makefile.in: Regenerate.

Co-authored-by: Chung-Lin Tang <cltang@codesourcery.com>
2023-09-12 11:30:37 +02:00
Tobias Burnus
27144cc05c OpenMP (C only): For 'omp allocate', really walk tree for 'alloctor' check
Walk expression tree of the 'allocator' clause of 'omp allocate' to
detect more cases where the allocator expression depends on code between
a variable declaration and its associated '#pragma omp allocate'. It also
contains the fix for the 'allocator((omp_allocator_handle_t)-1)' ICE, also
tested for in previous commit.

The changes of this commit were supposed to be part of
  r14-3863-g35f498d8dfc8e579eaba2ff2d2b96769c632fd58
  OpenMP (C only): omp allocate - extend parsing support, improve diagnostic
which also contains the associated testcase changes but were left out (oops!).

gcc/c/ChangeLog:

	* c-parser.cc (struct c_omp_loc_tree): New.
	(c_check_omp_allocate_allocator_r): New; checking moved from ...
	(c_parser_omp_allocate): ... here. Call it via walk_tree. Avoid
	ICE with tree_to_shwi for invalid too-large value.
2023-09-12 11:12:16 +02:00
Lehua Ding
5e19f89915 RISC-V: Add missed cond autovec testcases
This patch adds all missed cond autovec testcases. For not support
cond patterns, the following patches will be sent to fix it.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/autovec/cond/cond_arith-1.c: Add vrem op.
	* gcc.target/riscv/rvv/autovec/cond/cond_arith-2.c: Ditto.
	* gcc.target/riscv/rvv/autovec/cond/cond_arith-3.c: Ditto.
	* gcc.target/riscv/rvv/autovec/cond/cond_arith-4.c: Ditto.
	* gcc.target/riscv/rvv/autovec/cond/cond_arith-5.c: Ditto.
	* gcc.target/riscv/rvv/autovec/cond/cond_arith-6.c: Ditto.
	* gcc.target/riscv/rvv/autovec/cond/cond_arith-7.c: Ditto.
	* gcc.target/riscv/rvv/autovec/cond/cond_arith-8.c: Ditto.
	* gcc.target/riscv/rvv/autovec/cond/cond_arith-9.c: Ditto.
	* gcc.target/riscv/rvv/autovec/cond/cond_logical_run-1.c: Moved to...
	* gcc.target/riscv/rvv/autovec/cond/cond_logical_min_max_run-1.c: ...here.
	* gcc.target/riscv/rvv/autovec/cond/cond_logical_run-2.c: Moved to...
	* gcc.target/riscv/rvv/autovec/cond/cond_logical_min_max_run-2.c: ...here.
	* gcc.target/riscv/rvv/autovec/cond/cond_logical_run-3.c: Moved to...
	* gcc.target/riscv/rvv/autovec/cond/cond_logical_min_max_run-3.c: ...here.
	* gcc.target/riscv/rvv/autovec/cond/cond_logical_run-4.c: Moved to...
	* gcc.target/riscv/rvv/autovec/cond/cond_logical_min_max_run-4.c: ...here.
	* gcc.target/riscv/rvv/autovec/cond/cond_logical_run-5.c: Moved to...
	* gcc.target/riscv/rvv/autovec/cond/cond_logical_min_max_run-5.c: ...here.
	* gcc.target/riscv/rvv/autovec/cond/cond_logical-1.c: Removed.
	* gcc.target/riscv/rvv/autovec/cond/cond_logical-2.c: Removed.
	* gcc.target/riscv/rvv/autovec/cond/cond_logical-3.c: Removed.
	* gcc.target/riscv/rvv/autovec/cond/cond_logical-4.c: Removed.
	* gcc.target/riscv/rvv/autovec/cond/cond_logical-5.c: Removed.
	* gcc.target/riscv/rvv/autovec/cond/cond_logical_min_max-1.c: New test.
	* gcc.target/riscv/rvv/autovec/cond/cond_logical_min_max-2.c: New test.
	* gcc.target/riscv/rvv/autovec/cond/cond_logical_min_max-3.c: New test.
	* gcc.target/riscv/rvv/autovec/cond/cond_logical_min_max-4.c: New test.
	* gcc.target/riscv/rvv/autovec/cond/cond_logical_min_max-5.c: New test.
	* gcc.target/riscv/rvv/autovec/cond/cond_widen_complicate-1.c: New test.
	* gcc.target/riscv/rvv/autovec/cond/cond_widen_complicate-2.c: New test.
	* gcc.target/riscv/rvv/autovec/cond/cond_widen_complicate-3.c: New test.
	* gcc.target/riscv/rvv/autovec/cond/cond_widen_complicate-4.c: New test.
	* gcc.target/riscv/rvv/autovec/cond/cond_widen_complicate-5.c: New test.
	* gcc.target/riscv/rvv/autovec/cond/cond_widen_complicate-6.c: New test.
	* gcc.target/riscv/rvv/autovec/cond/cond_widen_complicate-7.c: New test.
	* gcc.target/riscv/rvv/autovec/cond/cond_widen_complicate-8.c: New test.
	* gcc.target/riscv/rvv/autovec/cond/cond_widen_complicate-9.c: New test.
2023-09-12 17:04:54 +08:00
Thomas Schwinge
537e2cc30d nvptx 'TARGET_USE_LOCAL_THUNK_ALIAS_P', 'TARGET_SUPPORTS_ALIASES'
This fixes up commit f8b15e1771
"[nvptx] Use .alias directive for mptx >= 6.3", which regressed in
particular C++ test cases if the new '-malias' flag was not active.
In that case, we have to maintain (that is now, restore) the previous
state of 'TARGET_USE_LOCAL_THUNK_ALIAS_P', 'TARGET_SUPPORTS_ALIASES'.

The remaining three regressions are to be resolved via
<https://inbox.sourceware.org/87ledgzxcl.fsf@euler.schwinge.homeip.net>
"More '#ifdef ASM_OUTPUT_DEF' -> 'if (TARGET_SUPPORTS_ALIASES)' etc.".

	gcc/
	* config/nvptx/nvptx.h (TARGET_USE_LOCAL_THUNK_ALIAS_P)
	(TARGET_SUPPORTS_ALIASES): Define.
2023-09-12 10:52:55 +02:00
Thomas Schwinge
50410234a3 testsuite: Port 'check-function-bodies' to nvptx
This extends commit 4d706ff86e
"Add dg test for matching function bodies" for nvptx.

	gcc/testsuite/
	* lib/scanasm.exp (configure_check-function-bodies): New proc.
	(parse_function_bodies, check-function-bodies): Use it.
	gcc/
	* doc/sourcebuild.texi (check-function-bodies): Update.
2023-09-12 10:37:41 +02:00
Mikael Morin
b9cbd1a2c2 fortran: Undo new symbols in all namespaces [PR110996]
Remove new symbols from all namespaces they may have been added to in case a
statement mismatches in the end and all the symbols referenced in it have to
be reverted.

This fixes memory errors and random internal compiler errors caused by
a new symbol left with dangling pointers but not properly removed from the
namespace at statement rejection.

Before this change, new symbols were removed from their own namespace
(their ns field) only.  This change additionally removes them from the
namespaces pointed to by respectively the gfc_current_ns global variable,
and the symbols' formal_ns field.

	PR fortran/110996

gcc/fortran/ChangeLog:

	* gfortran.h (gfc_release_symbol): Set return type to bool.
	* symbol.cc (gfc_release_symbol): Ditto.  Return whether symbol was
	freed.
	(delete_symbol_from_ns): New, outline code from...
	(gfc_restore_last_undo_checkpoint): ... here.  Delete new symbols
	from two more namespaces.

gcc/testsuite/ChangeLog:

	* gfortran.dg/pr110996.f90: New test.
2023-09-12 10:24:20 +02:00
Tobias Burnus
35f498d8df OpenMP (C only): omp allocate - extend parsing support, improve diagnostic
The 'allocate' directive can be used for both stack and static variables.
While the parser in C and C++ was pre-existing, it missed several
diagnostics, which this commit adds - for now only for C.

While the "sorry, unimplemented" for static variables is still issues
during parsing, the sorry for stack variables is now issued in the
middle end, preparing for the actual implementation. (Again: only for C.)

gcc/c/ChangeLog:

	* c-parser.cc (c_parser_omp_construct): Move call to
	c_parser_omp_allocate to ...
	(c_parser_pragma): ... here.
	(c_parser_omp_allocate): Avoid ICE is allocator could not be
	parsed; set 'omp allocate' attribute for stack/automatic variables
	and only reject static variables; add several additional
	restriction checks.
	* c-tree.h (c_mark_decl_jump_unsafe_in_current_scope): New prototype.
	* c-decl.cc (decl_jump_unsafe): Return true for omp-allocated decls.
	(c_mark_decl_jump_unsafe_in_current_scope): New.
	(warn_about_goto, c_check_switch_jump_warnings): Add error for
	omp-allocated decls.

gcc/ChangeLog:

	* gimplify.cc (gimplify_bind_expr): Check for
	insertion after variable cleanup.  Convert 'omp allocate'
	var-decl attribute to GOMP_alloc/GOMP_free calls.

gcc/testsuite/ChangeLog:

	* c-c++-common/gomp/allocate-5.c: Fix testcase; make some
	dg-messages for 'sorry' as c++, only.
	* c-c++-common/gomp/directive-1.c: Make a 'sorry' c++ only.
	* c-c++-common/gomp/allocate-9.c: New test.
	* c-c++-common/gomp/allocate-11.c: New test.
	* c-c++-common/gomp/allocate-12.c: New test.
	* c-c++-common/gomp/allocate-14.c: New test.
	* c-c++-common/gomp/allocate-15.c: New test.
	* c-c++-common/gomp/allocate-16.c: New test.
2023-09-12 09:19:04 +02:00
xuli
b90a4c3dd5 RISC-V: Elimilate warning in class vcreate
The following is the content of class vcreate:
class vcreate : public function_base
{
public:
  gimple *fold (gimple_folder &f) const override
  {
    ....
  }

  rtx expand (function_expander &e) const override
  {
    return NULL_RTX;
  }
};

The warning caused is:
./riscv-gcc/gcc/config/riscv/riscv-vector-builtins-bases.cc:1719:34:
  warning: unused parameter 'e' [-Wunused-parameter]
  rtx expand (function_expander &e) const override
                                 ^

gcc/ChangeLog:

	* config/riscv/riscv-vector-builtins-bases.cc: remove unused
		parameter e and replace NULL_RTX with gcc_unreachable.
2023-09-12 06:52:48 +00:00
Martin Uecker
26da1970a4 c: reorganize recursive type checking
Reorganize recursive type checking to use a structure to
store information collected during the recursion and
returned to the caller (warning_needed, enum_and_init_p,
different_types_p).

gcc/c:
	* c-typeck.cc (struct comptypes_data): Add structure.
	(tagged_types_tu_compatible_p,
	function_types_compatible_p, type_lists_compatible_p,
	comptypes_internal): Add structure to interface, change
	return type to bool, and adapt calls.
	(comptarget_types): Change return type too bool.
	(comptypes, comptypes_check_enum_int,
	comptypes_check_different_types): Adapt calls.
2023-09-12 06:49:46 +02:00
xuli
c1e4efd8ae RISC-V: Add vcreate intrinsics for RVV tuple types
gcc/ChangeLog:

	* config/riscv/riscv-vector-builtins-bases.cc (class vcreate): New class.
	(BASE): Ditto.
	* config/riscv/riscv-vector-builtins-bases.h: Ditto.
	* config/riscv/riscv-vector-builtins-functions.def (vcreate): Add vcreate support.
	* config/riscv/riscv-vector-builtins-shapes.cc (struct vcreate_def): Ditto.
	(SHAPE): Ditto.
	* config/riscv/riscv-vector-builtins-shapes.h: Ditto.
	* config/riscv/riscv-vector-builtins.cc: Add args type.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/tuple_create.c: New test.
2023-09-12 03:15:23 +00:00