Commit Graph

187108 Commits

Author SHA1 Message Date
Iain Buclaw
3c13cf479b d: Generate Object class if it doesn't exist during TypeInfo emission (PR101672)
Having a stub will prevent errors from occuring when compiling D code
with an empty object.d.  Though if it were to actually be used
implicitly then an error should occur.

	PR d/101672

gcc/d/ChangeLog:

	* typeinfo.cc (make_frontend_typeinfo): Generate Object class if it
	doesn't exist.
	(check_typeinfo_type): Don't warn if there's no location.

gcc/testsuite/ChangeLog:

	* gdc.dg/pr100967.d: Update test.
	* gdc.dg/pr101672.d: New test.
2021-07-29 17:10:13 +02:00
Iain Buclaw
7616ed6307 d: Return the correct value for C++ constructor calls (PR101664)
C++ constructors return void, even though the front-end semantic treats
them as implicitly returning `this'.  To handle this correctly, the
object reference is cached and used as the result of the expression.

	PR d/101664

gcc/d/ChangeLog:

	* expr.cc (ExprVisitor::visit (CallExp *)): Use object expression as
	result for C++ constructor calls.

gcc/testsuite/ChangeLog:

	* gdc.dg/extern-c++/extern-c++.exp: New.
	* gdc.dg/extern-c++/pr101664.d: New test.
	* gdc.dg/extern-c++/pr101664_1.cc: New test.
2021-07-29 17:10:09 +02:00
Iain Buclaw
5c9b7408dc d: Ensure casting from bool results in either 0 or 1 (PR96435)
If casting from bool, the result is either 0 or 1, any other value
violates @safe code, so enforce that it is never invalid.

	PR d/96435

gcc/d/ChangeLog:

	* d-convert.cc (convert_for_rvalue): New function.
	* d-tree.h (convert_for_rvalue): Declare.
	* expr.cc (ExprVisitor::visit (CastExp *)): Use convert_for_rvalue.
	(build_return_dtor): Likewise.

gcc/testsuite/ChangeLog:

	* gdc.dg/torture/pr96435.d: New test.
2021-07-29 16:16:19 +02:00
Iain Buclaw
75f2e3f6cb d: Remove generated D header files on error (PR101657)
If an error occurs later during compilation, remember that we generated
the headers, so that they can be removed before exit.

	PR d/101657

gcc/d/ChangeLog:

	* d-lang.cc (d_parse_file): Remove generated D header files on error.

gcc/testsuite/ChangeLog:

	* gdc.dg/pr101657.d: New test.
2021-07-29 16:16:19 +02:00
Iain Buclaw
cd4bda4297 d: Don't escape quoted format strings in escape_d_format (PR101656)
If the format string is enclosed by two '`' characters, then don't
escape the first and laster characters.

	PR d/101656

gcc/d/ChangeLog:

	* d-diagnostic.cc (escape_d_format): Don't escape quoted format
	strings.
2021-07-29 16:16:19 +02:00
Jakub Jelinek
7d014f7b22 testsuite: Fix up two tests for recent libstdc++ header changes [PR101647]
After recent libstdc++ header changes <functional> no longer includes
(parts of?) <array> and doesn't have to and <memory> no longer includes
(parts of?) <initializer_list>.
This patch fixes:
testsuite/g++.dg/pr71389.C:10:39: error: aggregate 'std::array<std::array<int, 16>, 16> v13' has incomplete type and cannot be defined
as well as
testsuite/g++.dg/cpp0x/initlist48.C:11:6: error: 'initializer_list' in namespace 'std' does not name a template type; did you mean 'uninitialized_fill'?

2021-07-29  Jakub Jelinek  <jakub@redhat.com>

	PR testsuite/101647
	* g++.dg/pr71389.C: Include <array> instead of <functional>.
	* g++.dg/cpp0x/initlist48.C: Include also <initializer_list>.
2021-07-29 14:17:55 +02:00
Thomas Schwinge
0829ab79d3 [OpenACC] Extract 'pass_oacc_loop_designation' out of 'pass_oacc_device_lower'
This really is a separate step -- and another pass to be added between the two,
later on.

	gcc/
	* omp-offload.c (oacc_loop_xform_head_tail, oacc_loop_process):
	'update_stmt' after modification.
	(pass_oacc_loop_designation): New function, extracted out of...
	(pass_oacc_device_lower): ... this.
	(pass_data_oacc_loop_designation, pass_oacc_loop_designation)
	(make_pass_oacc_loop_designation): New
	* passes.def: Add it.
	* tree-parloops.c (create_parallel_loop): Adjust.
	* tree-pass.h (make_pass_oacc_loop_designation): New.
	gcc/testsuite/
	* c-c++-common/goacc/classify-kernels-unparallelized.c:
	's%oaccdevlow%oaccloops%g'.
	* c-c++-common/goacc/classify-kernels.c: Likewise.
	* c-c++-common/goacc/classify-parallel.c: Likewise.
	* c-c++-common/goacc/classify-routine-nohost.c: Likewise.
	* c-c++-common/goacc/classify-routine.c: Likewise.
	* c-c++-common/goacc/classify-serial.c: Likewise.
	* c-c++-common/goacc/routine-nohost-1.c: Likewise.
	* g++.dg/goacc/template.C: Likewise.
	* gcc.dg/goacc/loop-processing-1.c: Likewise.
	* gfortran.dg/goacc/classify-kernels-unparallelized.f95: Likewise.
	* gfortran.dg/goacc/classify-kernels.f95: Likewise.
	* gfortran.dg/goacc/classify-parallel.f95: Likewise.
	* gfortran.dg/goacc/classify-routine-nohost.f95: Likewise.
	* gfortran.dg/goacc/classify-routine.f95: Likewise.
	* gfortran.dg/goacc/classify-serial.f95: Likewise.
	* gfortran.dg/goacc/routine-multiple-directives-1.f90: Likewise.
	libgomp/
	* testsuite/libgomp.oacc-c-c++-common/pr85486-2.c:
	's%oaccdevlow%oaccloops%g'.
	* testsuite/libgomp.oacc-c-c++-common/pr85486-3.c: Likewise.
	* testsuite/libgomp.oacc-c-c++-common/pr85486.c: Likewise.
	* testsuite/libgomp.oacc-c-c++-common/routine-nohost-1.c:
	Likewise.
	* testsuite/libgomp.oacc-c-c++-common/vector-length-128-1.c:
	Likewise.
	* testsuite/libgomp.oacc-c-c++-common/vector-length-128-2.c:
	Likewise.
	* testsuite/libgomp.oacc-c-c++-common/vector-length-128-3.c:
	Likewise.
	* testsuite/libgomp.oacc-c-c++-common/vector-length-128-4.c:
	Likewise.
	* testsuite/libgomp.oacc-c-c++-common/vector-length-128-5.c:
	Likewise.
	* testsuite/libgomp.oacc-c-c++-common/vector-length-128-6.c:
	Likewise.
	* testsuite/libgomp.oacc-c-c++-common/vector-length-128-7.c:
	Likewise.
	* testsuite/libgomp.oacc-fortran/routine-nohost-1.f90: Likewise.

Co-Authored-By: Julian Brown <julian@codesourcery.com>
Co-Authored-By: Kwok Cheung Yeung <kcy@codesourcery.com>
2021-07-29 09:19:44 +02:00
Haochen Gui
f0529d96f5 Fix failed test cases caused by disabling mode promotion for pseudos [PR100952]
gcc/testsuite
	PR target/100952
	* gcc.target/powerpc/pr56605.c: Change matching
	conditions.
	* gcc.target/powerpc/pr81348.c: Likewise.
2021-07-29 15:06:12 +08:00
Aldy Hernandez
2e96b5f14e Backwards jump threader rewrite with ranger.
This is a rewrite of the backwards threader with a ranger based solver.

The code is divided into two parts: the path solver in
gimple-range-path.*, and the path discovery bits in
tree-ssa-threadbackward.c.

The legacy code is still available with --param=threader-mode=legacy,
but will be removed shortly after.

gcc/ChangeLog:

	* Makefile.in (tree-ssa-loop-im.o-warn): New.
	* flag-types.h (enum threader_mode): New.
	* params.opt: Add entry for --param=threader-mode.
	* tree-ssa-threadbackward.c (THREADER_ITERATIVE_MODE): New.
	(class back_threader): New.
	(back_threader::back_threader): New.
	(back_threader::~back_threader): New.
	(back_threader::maybe_register_path): New.
	(back_threader::find_taken_edge): New.
	(back_threader::find_taken_edge_switch): New.
	(back_threader::find_taken_edge_cond): New.
	(back_threader::resolve_def): New.
	(back_threader::resolve_phi): New.
	(back_threader::find_paths_to_names): New.
	(back_threader::find_paths): New.
	(dump_path): New.
	(debug): New.
	(thread_jumps::find_jump_threads_backwards): Call ranger threader.
	(thread_jumps::find_jump_threads_backwards_with_ranger): New.
	(pass_thread_jumps::execute): Abstract out code...
	(try_thread_blocks): ...here.
	* tree-ssa-threadedge.c (jump_threader::thread_outgoing_edges):
	Abstract out threading candidate code to...
	(single_succ_to_potentially_threadable_block): ...here.
	* tree-ssa-threadedge.h (single_succ_to_potentially_threadable_block):
	New.
	* tree-ssa-threadupdate.c (register_jump_thread): Return boolean.
	* tree-ssa-threadupdate.h (class jump_thread_path_registry):
	Return bool from register_jump_thread.

libgomp/ChangeLog:

	* testsuite/libgomp.graphite/force-parallel-4.c: Adjust for
	threader.
	* testsuite/libgomp.graphite/force-parallel-8.c: Same.

gcc/testsuite/ChangeLog:

	* g++.dg/debug/dwarf2/deallocator.C: Adjust for threader.
	* gcc.c-torture/compile/pr83510.c: Same.
	* dg.dg/analyzer/pr94851-2.c: Same.
	* gcc.dg/loop-unswitch-2.c: Same.
	* gcc.dg/old-style-asm-1.c: Same.
	* gcc.dg/pr68317.c: Same.
	* gcc.dg/pr97567-2.c: Same.
	* gcc.dg/predict-9.c: Same.
	* gcc.dg/shrink-wrap-loop.c: Same.
	* gcc.dg/sibcall-1.c: Same.
	* gcc.dg/tree-ssa/builtin-sprintf-3.c: Same.
	* gcc.dg/tree-ssa/pr21001.c: Same.
	* gcc.dg/tree-ssa/pr21294.c: Same.
	* gcc.dg/tree-ssa/pr21417.c: Same.
	* gcc.dg/tree-ssa/pr21458-2.c: Same.
	* gcc.dg/tree-ssa/pr21563.c: Same.
	* gcc.dg/tree-ssa/pr49039.c: Same.
	* gcc.dg/tree-ssa/pr61839_1.c: Same.
	* gcc.dg/tree-ssa/pr61839_3.c: Same.
	* gcc.dg/tree-ssa/pr77445-2.c: Same.
	* gcc.dg/tree-ssa/split-path-4.c: Same.
	* gcc.dg/tree-ssa/ssa-dom-thread-11.c: Same.
	* gcc.dg/tree-ssa/ssa-dom-thread-12.c: Same.
	* gcc.dg/tree-ssa/ssa-dom-thread-14.c: Same.
	* gcc.dg/tree-ssa/ssa-dom-thread-18.c: Same.
	* gcc.dg/tree-ssa/ssa-dom-thread-6.c: Same.
	* gcc.dg/tree-ssa/ssa-dom-thread-7.c: Same.
	* gcc.dg/tree-ssa/ssa-fre-48.c: Same.
	* gcc.dg/tree-ssa/ssa-thread-11.c: Same.
	* gcc.dg/tree-ssa/ssa-thread-12.c: Same.
	* gcc.dg/tree-ssa/ssa-thread-14.c: Same.
	* gcc.dg/tree-ssa/vrp02.c: Same.
	* gcc.dg/tree-ssa/vrp03.c: Same.
	* gcc.dg/tree-ssa/vrp05.c: Same.
	* gcc.dg/tree-ssa/vrp06.c: Same.
	* gcc.dg/tree-ssa/vrp07.c: Same.
	* gcc.dg/tree-ssa/vrp09.c: Same.
	* gcc.dg/tree-ssa/vrp19.c: Same.
	* gcc.dg/tree-ssa/vrp20.c: Same.
	* gcc.dg/tree-ssa/vrp33.c: Same.
	* gcc.dg/uninit-pred-9_b.c: Same.
	* gcc.dg/uninit-pr61112.c: Same.
	* gcc.dg/vect/bb-slp-16.c: Same.
	* gcc.target/i386/avx2-vect-aggressive.c: Same.
	* gcc.dg/tree-ssa/ranger-threader-1.c: New test.
	* gcc.dg/tree-ssa/ranger-threader-2.c: New test.
	* gcc.dg/tree-ssa/ranger-threader-3.c: New test.
	* gcc.dg/tree-ssa/ranger-threader-4.c: New test.
	* gcc.dg/tree-ssa/ranger-threader-5.c: New test.
2021-07-29 08:24:50 +02:00
Richard Biener
e63d76234d c/101512 - fix missing address-taking in c_common_mark_addressable_vec
c_common_mark_addressable_vec fails to look through C_MAYBE_CONST_EXPR
in the case it isn't at the toplevel.

2021-07-21  Richard Biener  <rguenther@suse.de>

	PR c/101512
gcc/c-family/
	* c-common.c (c_common_mark_addressable_vec): Look through
	C_MAYBE_CONST_EXPR even if not at the toplevel.

gcc/testsuite/
	* gcc.dg/torture/pr101512.c: New testcase.
2021-07-29 08:13:29 +02:00
Andreas Krebbel
841548f0f7 Adjust docu of TARGET_VECTORIZE_VEC_PERM_CONST
gcc/ChangeLog:

	* target.def: in0 and in1 do not need to be registers.
	* doc/tm.texi: Regenerate.
2021-07-29 08:03:36 +02:00
Ankur Saini
e8de5bad25 analyzer: : Refactor callstring to work with pairs of supernodes.
2021-07-25  Ankur Saini  <arsenic@sourceware.org>

gcc/analyzer/ChangeLog:
	* call-string.cc (call_string::element_t::operator==): New operator.
	(call_String::element_t::operator!=): New operator.
	(call_string::element_t::get_caller_function): New function.
	(call_string::element_t::get_callee_function): New function.
	(call_string::call_string): Refactor to Initialise m_elements.
	(call_string::operator=): Refactor to work with m_elements.
	(call_string::operator==): Likewise.
	(call_string::to_json): Likewise.
	(call_string::hash): Refactor to hash e.m_caller.
	(call_string::push_call): Refactor to work with m_elements.
	(call_string::push_call): New overload to push call via supernodes.
	(call_string::pop): Refactor to work with m_elements.
	(call_string::calc_recursion_depth): Likewise.
	(call_string::cmp): Likewise.
	(call_string::validate): Likewise.
	(call_string::operator[]): Likewise.
	* call-string.h (class supernode): New forward decl.
	(struct call_string::element_t): New struct.
	(call_string::call_string): Refactor to initialise m_elements.
	(call_string::bool empty_p): Refactor to work with m_elements.
	(call_string::get_callee_node): New decl.
	(call_string::get_caller_node): New decl.
	(m_elements): Replaces m_return_edges.
	* program-point.cc (program_point::get_function_at_depth): Refactor to
	work with new call-string format.
	(program_point::validate): Likewise.
	(program_point::on_edge): Likewise.
2021-07-29 08:37:49 +05:30
liuhongt
7d11da87a1 Adjust/Refine testcases.
gcc/testsuite/ChangeLog:

	PR target/99881
	* gcc.target/i386/pr91446.c:
	* gcc.target/i386/pr92658-avx512bw-2.c:
	* gcc.target/i386/pr92658-sse4-2.c:
	* gcc.target/i386/pr92658-sse4.c:
	* gcc.target/i386/pr99881.c:
2021-07-29 10:18:17 +08:00
liuhongt
231bcc77b9 Add a separate function to calculate cost for WIDEN_MULT_EXPR.
gcc/ChangeLog:

	PR target/39821
	* config/i386/i386.c (ix86_widen_mult_cost): New function.
	(ix86_add_stmt_cost): Use ix86_widen_mult_cost for
	WIDEN_MULT_EXPR.

gcc/testsuite/ChangeLog:

	PR target/39821
	* gcc.target/i386/sse2-pr39821.c: New test.
	* gcc.target/i386/sse4-pr39821.c: New test.
2021-07-29 09:06:24 +08:00
Jiufu Guo
aafa38b5bf Use preferred mode for doloop IV [PR61837]
Currently, doloop.xx variable is using the type as niter which may be
shorter than word size.  For some targets, it would be better to use
word size type.  For example, on 64bit system, to access 32bit value,
subreg maybe used.  Then using 64bit type maybe better for niter if
it can be present in both 32bit and 64bit.

This patch add target hook to query preferred mode for doloop IV,
and update mode accordingly.

gcc/ChangeLog:

2021-07-29  Jiufu Guo  <guojiufu@linux.ibm.com>

	PR target/61837
	* config/rs6000/rs6000.c (TARGET_PREFERRED_DOLOOP_MODE): New hook.
	(rs6000_preferred_doloop_mode): New hook.
	* doc/tm.texi: Regenerate.
	* doc/tm.texi.in: Add hook preferred_doloop_mode.
	* target.def (preferred_doloop_mode): New hook.
	* targhooks.c (default_preferred_doloop_mode): New hook.
	* targhooks.h (default_preferred_doloop_mode): New hook.
	* tree-ssa-loop-ivopts.c (compute_doloop_base_on_mode): New function.
	(add_iv_candidate_for_doloop): Call targetm.preferred_doloop_mode
	and compute_doloop_base_on_mode.

gcc/testsuite/ChangeLog:

2021-07-29  Jiufu Guo  <guojiufu@linux.ibm.com>

	PR target/61837
	* gcc.target/powerpc/pr61837.c: New test.
2021-07-29 08:42:56 +08:00
GCC Administrator
3916902930 Daily bump. 2021-07-29 00:16:43 +00:00
Martin Sebor
1121e495b7 Correct uninitialized object offset and size computation [PR101494].
Resolves:
PR middle-end/101494 - -Wuninitialized false alarm with memrchr of size 0

gcc/ChangeLog:

	PR middle-end/101494
	* tree-ssa-uninit.c (maybe_warn_operand): Correct object offset
	and size computation.

gcc/testsuite/ChangeLog:

	PR middle-end/101494
	* gcc.dg/uninit-pr101494.c: New test.
2021-07-28 16:25:40 -06:00
Martin Sebor
b9cbf8c9e0 Correct -Warray-bounds handling if function pointers [PR101601].
Resolves:
PR middle-end/101601 - -Warray-bounds triggers error: arrays of functions are not meaningful

	PR middle-end/101601

gcc/ChangeLog:

	* gimple-array-bounds.cc (array_bounds_checker::check_mem_ref): Remove
	a pointless test.
	Handle pointers to functions.

gcc/testsuite/ChangeLog:

	* g++.dg/warn/Warray-bounds-25.C: New test.
	* gcc.dg/Warray-bounds-85.c: New test.
2021-07-28 16:14:38 -06:00
Martin Sebor
2a837de28e Add new gimple-ssa-warn-access pass.
gcc/ChangeLog:

	* Makefile.in (OBJS): Add gimple-ssa-warn-access.o and pointer-query.o.
	* attribs.h (fndecl_dealloc_argno): Move fndecl_dealloc_argno to tree.h.
	* builtins.c (compute_objsize_r): Move to pointer-query.cc.
	(access_ref::access_ref): Same.
	(access_ref::phi): Same.
	(access_ref::get_ref): Same.
	(access_ref::size_remaining): Same.
	(access_ref::offset_in_range): Same.
	(access_ref::add_offset): Same.
	(access_ref::inform_access): Same.
	(ssa_name_limit_t::visit_phi): Same.
	(ssa_name_limit_t::leave_phi): Same.
	(ssa_name_limit_t::next): Same.
	(ssa_name_limit_t::next_phi): Same.
	(ssa_name_limit_t::~ssa_name_limit_t): Same.
	(pointer_query::pointer_query): Same.
	(pointer_query::get_ref): Same.
	(pointer_query::put_ref): Same.
	(pointer_query::flush_cache): Same.
	(warn_string_no_nul): Move to gimple-ssa-warn-access.cc.
	(check_nul_terminated_array): Same.
	(unterminated_array): Same.
	(maybe_warn_for_bound): Same.
	(check_read_access): Same.
	(warn_for_access): Same.
	(get_size_range): Same.
	(check_access): Same.
	(gimple_call_alloc_size): Move to tree.c.
	(gimple_parm_array_size): Move to pointer-query.cc.
	(get_offset_range): Same.
	(gimple_call_return_array): Same.
	(handle_min_max_size): Same.
	(handle_array_ref): Same.
	(handle_mem_ref): Same.
	(compute_objsize): Same.
	(gimple_call_alloc_p): Move to gimple-ssa-warn-access.cc.
	(call_dealloc_argno): Same.
	(fndecl_dealloc_argno): Same.
	(new_delete_mismatch_p): Same.
	(matching_alloc_calls_p): Same.
	(warn_dealloc_offset): Same.
	(maybe_emit_free_warning): Same.
	* builtins.h (check_nul_terminated_array): Move to
	gimple-ssa-warn-access.h.
	(check_nul_terminated_array): Same.
	(warn_string_no_nul): Same.
	(unterminated_array): Same.
	(class ssa_name_limit_t): Same.
	(class pointer_query): Same.
	(struct access_ref): Same.
	(class range_query): Same.
	(struct access_data): Same.
	(gimple_call_alloc_size): Same.
	(gimple_parm_array_size): Same.
	(compute_objsize): Same.
	(class access_data): Same.
	(maybe_emit_free_warning): Same.
	* calls.c (initialize_argument_information): Remove call to
	maybe_emit_free_warning.
	* gimple-array-bounds.cc: Include new header..
	* gimple-fold.c: Same.
	* gimple-ssa-sprintf.c: Same.
	* gimple-ssa-warn-restrict.c: Same.
	* passes.def: Add pass_warn_access.
	* tree-pass.h (make_pass_warn_access): Declare.
	* tree-ssa-strlen.c: Include new headers.
	* tree.c (fndecl_dealloc_argno): Move here from builtins.c.
	* tree.h (fndecl_dealloc_argno): Move here from attribs.h.
	* gimple-ssa-warn-access.cc: New file.
	* gimple-ssa-warn-access.h: New file.
	* pointer-query.cc: New file.
	* pointer-query.h: New file.

gcc/cp/ChangeLog:

	* init.c: Include new header.
2021-07-28 16:02:17 -06:00
Michael Meissner
f471739e63 PR 100168: Fix call test on power10.
Fix a test that was checking for 64-bit TOC calls, to also allow for
PC-relative calls.

2021-07-28  Michael Meissner  <meissner@linux.ibm.com>

gcc/testsuite
	PR testsuite/100168
	* gcc.dg/pr56727-2.c: Add support for PC-relative calls.
2021-07-28 17:24:23 -04:00
David Malcolm
37eb3ef48c analyzer: play better with -fsanitize=bounds
gcc/analyzer/ChangeLog:
	* region-model.cc (region_model::on_call_pre): Treat
	IFN_UBSAN_BOUNDS, BUILT_IN_STACK_SAVE, and BUILT_IN_STACK_RESTORE
	as no-ops, rather than handling them as unknown functions.

gcc/testsuite/ChangeLog:
	* gcc.dg/analyzer/torture/ubsan-1.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2021-07-28 14:47:54 -04:00
David Malcolm
b508113016 analyzer: remove redundant return value from various impl_call_*
gcc/analyzer/ChangeLog:
	* region-model-impl-calls.cc (region_model::impl_call_alloca):
	Drop redundant return value.
	(region_model::impl_call_builtin_expect): Likewise.
	(region_model::impl_call_calloc): Likewise.
	(region_model::impl_call_malloc): Likewise.
	(region_model::impl_call_memset): Likewise.
	(region_model::impl_call_operator_new): Likewise.
	(region_model::impl_call_operator_delete): Likewise.
	(region_model::impl_call_strlen): Likewise.
	* region-model.cc (region_model::on_call_pre): Fix return value of
	known functions that don't have unknown side-effects.
	* region-model.h (region_model::impl_call_alloca): Drop redundant
	return value.
	(region_model::impl_call_builtin_expect): Likewise.
	(region_model::impl_call_calloc): Likewise.
	(region_model::impl_call_malloc): Likewise.
	(region_model::impl_call_memset): Likewise.
	(region_model::impl_call_strlen): Likewise.
	(region_model::impl_call_operator_new): Likewise.
	(region_model::impl_call_operator_delete): Likewise.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2021-07-28 14:46:03 -04:00
Harald Anlauf
7bf582e6cf Fortran: ICE in resolve_allocate_deallocate for invalid STAT argument
gcc/fortran/ChangeLog:

	PR fortran/101564
	* expr.c (gfc_check_vardef_context): Add check for KIND and LEN
	parameter inquiries.
	* match.c (gfc_match): Fix comment for %v code.
	(gfc_match_allocate, gfc_match_deallocate): Replace use of %v code
	by %e in gfc_match to allow for function references as STAT and
	ERRMSG arguments.
	* resolve.c (resolve_allocate_deallocate): Avoid NULL pointer
	dereferences and shortcut for bad STAT and ERRMSG argument to
	(DE)ALLOCATE.  Remove bogus parts of checks for STAT and ERRMSG.

gcc/testsuite/ChangeLog:

	PR fortran/101564
	* gfortran.dg/allocate_stat_3.f90: New test.
	* gfortran.dg/allocate_stat.f90: Adjust error messages.
	* gfortran.dg/implicit_11.f90: Likewise.
	* gfortran.dg/inquiry_type_ref_3.f90: Likewise.
2021-07-28 19:11:27 +02:00
Jakub Jelinek
49e28c02a9 ubsan: Fix ICEs with DECL_REGISTER tests [PR101624]
The following testcase ICEs, because the base is a CONST_DECL for
the Fortran parameter, and ubsan/sanopt uses DECL_REGISTER macro on it.
 /* In VAR_DECL and PARM_DECL nodes, nonzero means declared `register'.  */
 #define DECL_REGISTER(NODE) (DECL_WRTL_CHECK (NODE)->decl_common.decl_flag_0)
while CONST_DECL doesn't satisfy DECL_WRTL_CHECK.

The following patch checks explicitly for VAR_DECL/PARM_DECL/RESULT_DECL
only before using DECL_REGISTER, assumes other decls aren't DECL_REGISTER.
Not really sure about RESULT_DECL but it at least satisfies DECL_WRTL_CHECK...

2021-07-28  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/101624
	* ubsan.c (maybe_instrument_pointer_overflow,
	instrument_object_size): Only test DECL_REGISTER on VAR_DECLs,
	PARM_DECLs or RESULT_DECLs.
	* sanopt.c (maybe_optimize_ubsan_ptr_ifn): Likewise.

	* gfortran.dg/ubsan/ubsan.exp: New file.
	* gfortran.dg/ubsan/pr101624.f90: New test.
2021-07-28 18:43:15 +02:00
Jakub Jelinek
b4fc4df94f match.pd: Fix up recent __builtin_bswap16 simplifications [PR101642]
The following testcase ICEs.  The problem is that for __builtin_bswap16
(and only that, others are fine) the argument of the builtin is promoted
to int while the patterns assume it is not and is the same as that of
the return type.
For the bswap simplifications before these new ones it just means we
fail to optimize stuff like __builtin_bswap16 (__builtin_bswap16 (x))
because there are casts in between, but the last one, equality comparison
of __builtin_bswap16 with integer constant results in ICE, because
we create comparison with incompatible types of the operands, and the
other might be fine because usually we bit and the operand before promoting,
but I think it is too dangerous to rely on it, one day we find out that
because it is operand to such a built in, we can throw away any changes
that affect the upper bits and all of sudden it would misbehave.

So, this patch introduces converts that shouldn't do anything for
bswap{32,64,128} and should fix these issues for bswap16.

2021-07-28  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/101642
	* match.pd (bswap16 (x) == bswap16 (y)): Cast both operands
	to type of bswap16 for comparison.
	(bswap16 (x) == cst): Cast bswap16 operand to type of cst.

	* gcc.c-torture/compile/pr101642.c: New test.
2021-07-28 18:41:50 +02:00
Ilya Leoshkevich
de0214a055 IBM Z: Fix 5 tests in 31-bit mode
gcc/testsuite/ChangeLog:

	* gcc.target/s390/global-array-element-pic2.c: Add -mzarch, add
	an expectation for 31-bit mode.
	* gcc.target/s390/load-imm64-1.c: Use unsigned long long.
	* gcc.target/s390/load-imm64-2.c: Likewise.
	* gcc.target/s390/vector/long-double-vx-macro-off-on.c: Use
	-mzarch.
	* gcc.target/s390/vector/long-double-vx-macro-on-off.c:
	Likewise.
2021-07-28 18:01:58 +02:00
Richard Biener
3c91efec15 tree-optimization/101615 - SLP permute opt with CTOR roots
CTOR roots are not explicitely represented so we have to make sure
to materialize permutes on SLP graph entries to them.

2021-07-28  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/101615
	* tree-vect-slp.c (vect_optimize_slp): Materialize permutes
	at CTOR SLP graph entries.

	* gcc.dg/vect/bb-slp-pr101615-2.c: New testcase.
2021-07-28 17:41:25 +02:00
Kyrylo Tkachov
8b06ccb20e aarch64: Add smov alternative to sign_extend pattern
In the testcase here we were generating a umov + sxth to move
a half-word value from SIMD to GP regs with sign-extension.
We can use a single smov instruction for it instead but the
sign-extend pattern was missing the right alternative.
The *zero_extend<SHORT:mode><GPI:mode>2_aarch64 pattern for
zero-extension already has the right alternative for
the analogous umov instruction, so this mirrors that pattern.

Bootstrapped and tested on aarch64-none-linux-gnu.

The test gcc.target/aarch64/sve/clastb_4.c is adjusted to scan for
the clastb  h0, p0, h0, z0.h form
instead of
the clastb  w0, p0, w0, z0.h form.

This is an improvement as the W forms of the clast instructions are more expensive.

gcc/ChangeLog:

	* config/aarch64/aarch64.md (*extend<SHORT:mode><GPI:mode>2_aarch64):
	Add "r,w" alternative.

gcc/testsuite/ChangeLog:

	* gcc.target/aarch64/smov_1.c: New test.
	* gcc.target/aarch64/sve/clastb_4.c: Adjust clast scan-assembler.
2021-07-28 16:34:03 +01:00
H.J. Lu
9775e465c1 x86: Don't set AVX_U128_DIRTY when zeroing YMM/ZMM register
There is no SSE <-> AVX transition penalty if the upper bits of YMM/ZMM
registers are unchanged and YMM/ZMM store doesn't change the upper bits
of YMM/ZMM registers.

1. Since zeroing YMM/ZMM register is implemented with zeroing XMM
register, don't set AVX_U128_DIRTY when zeroing YMM/ZMM register.
2. Since store doesn't change the INIT state on the upper bits of
YMM/ZMM register, don't set AVX_U128_DIRTY on store if the source
of store was never non-zero.

Here are the vzeroupper count differences on SPEC CPU 2017 with

-Ofast -march=skylake-avx512

                Before  After    Diff
500.perlbench_r	226	225	-0.44%
502.gcc_r      	1263	1103	-12.67%
503.bwaves_r   	14	14	0.00%
505.mcf_r      	29	28	-3.45%
507.cactuBSSN_r	4651	4628	-0.49%
508.namd_r     	433	432	-0.23%
510.parest_r   	20380	19347	-5.07%
511.povray_r   	495	452	-8.69%
519.lbm_r      	2	2	0.00%
520.omnetpp_r  	5954	5677	-4.65%
521.wrf_r      	12353	12339	-0.11%
523.xalancbmk_r	13137	13001	-1.04%
525.x264_r     	192	191	-0.52%
526.blender_r  	2515	2366	-5.92%
527.cam4_r     	4601	4583	-0.39%
531.deepsjeng_r	20	19	-5.00%
538.imagick_r  	898	805	-10.36%
541.leela_r    	427	399	-6.56%
544.nab_r      	74	74	0.00%
548.exchange2_r	72	72	0.00%
549.fotonik3d_r	318	318	0.00%
554.roms_r     	558	554	-0.72%
557.xz_r       	79	52	-34.18%

and performance differences are within noise range.

gcc/

	PR target/101456
	* config/i386/i386.c (ix86_avx_u128_mode_needed): Don't set
	AVX_U128_DIRTY when all bits are zero.

gcc/testsuite/

	PR target/101456
	* gcc.target/i386/pr101456-1.c: New test.
	* gcc.target/i386/pr101456-2.c: Likewise.
2021-07-28 07:15:48 -07:00
Richard Biener
6bb6e2044c tree-optimization/101615 - SLP permute opt of existing vectors
This fixes one issue discovered when analyzing PR101615, namely
we happily push permutes to pre-existing vectors but end up
not actually permuting them.  In fact we don't want to, so force
materialization on the external.

It doesn't fix the original testcase though.

2021-07-28  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/101615
	* tree-vect-slp.c (vect_optimize_slp): Pre-existing vector
	external nodes cannot be permuted so make them perm_out 0.

	* gcc.dg/vect/bb-slp-pr101615-1.c: New testcase.
2021-07-28 15:14:19 +02:00
Andrew Stubbs
1af1666694 amdgcn: Fix attributes for LLVM-12 [PR 100208]
This should work for a wider range of LLVM 12 variants now.
More work required for LLVM 13 though.

gcc/ChangeLog:

	PR target/100208
	* config.in: Regenerate.
	* config/gcn/gcn-hsa.h (A_FIJI): New define.
	(A_900): New define.
	(A_906): New define.
	(A_908): New define.
	(ASM_SPEC): Use A_FIJI, A_900, A_906 and A_908.
	* config/gcn/gcn.c (output_file_start): Adjust attributes according
	to the assembler capabilities.
	* config/gcn/mkoffload.c (main): Likewise.
	* configure: Regenerate.
	* configure.ac: Add tests for LLVM assembler attribute features.
2021-07-28 13:53:05 +01:00
Andrew MacLeod
04600a4722 Return undefined on edges which are not executed.
When a branch has been folded, mark any range requests on the unexecutable edge as
UNDEFINED.

	* gimple-range-gori.cc (gori_compute::outgoing_edge_range_p): Check for
	cond_false and cond_true on branches.
2021-07-28 08:32:38 -04:00
Siddhesh Poyarekar
31534ac26e analyzer: Handle strdup builtins
Consolidate allocator builtin handling and add support for
__builtin_strdup and __builtin_strndup.

gcc/analyzer/ChangeLog:

	* analyzer.cc (is_named_call_p, is_std_named_call_p): Make
	first argument a const_tree.
	* analyzer.h (is_named_call_p, -s_std_named_call_p): Likewise.
	* sm-malloc.cc (known_allocator_p): New function.
	(malloc_state_machine::on_stmt): Use it.

gcc/testsuite/ChangeLog:

	* gcc.dg/analyzer/strdup-1.c (test_4, test_5, test_6): New
	tests.
2021-07-28 17:43:26 +05:30
Siddhesh Poyarekar
84606efb0c analyzer: Recognize __builtin_free as a matching deallocator
Recognize __builtin_free as being equivalent to free when passed into
__attribute__((malloc ())), similar to how it is treated when it is
encountered as a call.  This fixes spurious warnings in glibc where
xmalloc family of allocators as well as reallocarray, memalign,
etc. are declared to have __builtin_free as the free function.

gcc/analyzer/ChangeLog:

	* sm-malloc.cc
	(malloc_state_machine::get_or_create_deallocator): Recognize
	__builtin_free.

gcc/testsuite/ChangeLog:

	* gcc.dg/analyzer/attr-malloc-1.c (compatible_alloc,
	compatible_alloc2): New extern allocator declarations.
	(test_9, test_10): New tests.
2021-07-28 17:43:15 +05:30
Iain Buclaw
54ec50bada d: Wrong evaluation order of binary expressions (PR101640)
The use of fold_build2 can in some cases swap the order of its operands
if that is the more optimal thing to do.  However this breaks semantic
guarantee of left-to-right evaluation in D.

	PR d/101640

gcc/d/ChangeLog:

	* expr.cc (binary_op): Use build2 instead of fold_build2.

gcc/testsuite/ChangeLog:

	* gdc.dg/pr96429.d: Update test.
	* gdc.dg/pr101640.d: New test.
2021-07-28 13:13:06 +02:00
Iain Buclaw
c936c39f86 d: fix ICE at convert_expr(tree_node*, Type*, Type*) (PR101490)
Both the front-end and code generator had a modulo by zero bug when testing if
a conversion from a static array to dynamic array was valid.

	PR d/101490

gcc/d/ChangeLog:

	* dmd/MERGE: Merge upstream dmd 27e388b4c.
	* d-codegen.cc (build_array_index): Handle void arrays same as byte.
	* d-convert.cc (convert_expr): Handle converting to zero-sized arrays.

gcc/testsuite/ChangeLog:

	* gdc.dg/pr101490.d: New test.
2021-07-28 13:13:05 +02:00
Iain Buclaw
1a2306ffe7 d: __FUNCTION__ doesn't work in core.stdc.stdio functions without cast (PR101441)
Backports fix from upstream to allow __FUNCTION__ and
__PRETTY_FUNCTION__ to be used as C string literals.

Reviewed-on: https://github.com/dlang/dmd/pull/12923

	PR d/101441

gcc/d/ChangeLog:

	* dmd/MERGE: Merge upstream dmd f8c1ca928.
2021-07-28 13:13:05 +02:00
Iain Buclaw
b2f6e1de24 d: Compile-time reflection for supported built-ins (PR101127)
In order to allow user-code to determine whether a back-end builtin is
available without error, LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE has been
defined to delay putting back-end builtin functions until the ISA that
defines them has been declared.

However in D, there is no global namespace.  All builtins get pushed
into the `gcc.builtins' module, which is constructed during the semantic
analysis pass, which has already finished by the time target attributes
are evaluated.  So builtins are not pushed by the new langhook because
they would be ultimately ignored.  Builtins exposed to D code then can
now only be altered by the command-line.

	PR d/101127

gcc/d/ChangeLog:

	* d-builtins.cc (d_builtin_function_ext_scope): New function.
	* d-lang.cc (LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE): Define.
	* d-tree.h (d_builtin_function_ext_scope): Declare.

gcc/testsuite/ChangeLog:

	* gdc.dg/pr101127a.d: New test.
	* gdc.dg/pr101127b.d: New test.
2021-07-28 13:13:05 +02:00
Iain Buclaw
3e21361174 d: Change in DotTemplateExp type semantics leading to regression (PR101619)
By giving dot templates a type, meant that properry resolving silently
started passing for code that should never have passed.  The simple fix
is to provide implementations for checkType and checkValue that give an
error about dot templates having neither a value nor type.

Reviewed-on: https://github.com/dlang/dmd/pull/12920

	PR d/101619

gcc/d/ChangeLog:

	* dmd/MERGE: Merge upstream dmd 1d8386a63.
2021-07-28 13:13:04 +02:00
Ilya Leoshkevich
ea22954e7c IBM Z: Enable LSan and TSan
libsanitizer/ChangeLog:

	* configure.tgt (s390*-*-linux*): Enable LSan and TSan for
	s390x.
2021-07-28 13:03:32 +02:00
Bin Cheng
b662250c1f AArch64: use stable sorting in generating ldp/stp
In some corner cases, we have code as below:
  [base + 0x310] = A
  [base + 0x320] = B
  [base + 0x330] = C
  [base + 0x320] = D
unstable sorting could result in wrong value in offset 0x320.  The
patch fixes it by using gcc_stablesort.

2021-07-28  Bin Cheng  <bin.cheng@linux.alibaba.com>

	* config/aarch64/aarch64.c (aarch64_gen_adjusted_ldpstp): use
	gcc_stablesort.
2021-07-28 17:50:59 +08:00
Bin Cheng
0f95c6b2f7 Don't skip prologue/epilogue when initializing alias.
Register might be modified in prologue/epilogue, which shouldn't
be skipped in alias info analysis.

2021-07-28  Bin Cheng  <bin.cheng@linux.alibaba.com>

gcc/
	* alias.c (init_alias_analysis): Don't skip prologue/epilogue.
2021-07-28 17:44:35 +08:00
Jakub Jelinek
88d0f70a32 i386: Improve AVX2 expansion of vector >> vector DImode arithm. shifts [PR101611]
AVX2 introduced vector >> vector shifts, but unfortunately for V{2,4}DImode
it only supports logical and not arithmetic shifts, only AVX512F for
V8DImode or AVX512VL for V{2,4}DImode fixed that omission.
Earlier in GCC12 cycle I've committed vector >> scalar arithmetic shift
emulation using various sequences, this patch handles the vector >> vector
case.  No need to adjust costs, the previous cost adjustment actually
covers even the vector by vector shifts.
The patch emits the right arithmetic V{2,4}DImode shifts using 2 logical right
V{2,4}DImode shifts (once of the original operands, once of sign mask
constant by the vector shift count), xor and subtraction, on each element
(long long) x >> y is done as
(((unsigned long long) x >> y) ^ (0x8000000000000000ULL >> y))
- (0x8000000000000000ULL >> y)
i.e. if x doesn't have in some element the MSB set, it is just the logical
shift, if it does, then the xor and subtraction cause also all higher bits
to be set.

2021-07-28  Jakub Jelinek  <jakub@redhat.com>

	PR target/101611
	* config/i386/sse.md (vashr<mode>3): Split into vashrv8di3 expander
	and vashrv4di3 expander, where the latter requires just TARGET_AVX2
	and has special !TARGET_AVX512VL expansion.
	(vashrv2di3<mask_name>): Rename to ...
	(vashrv2di3): ... this.  Change condition to TARGET_XOP || TARGET_AVX2
	and add special !TARGET_XOP && !TARGET_AVX512VL expansion.

	* gcc.target/i386/avx2-pr101611-1.c: New test.
	* gcc.target/i386/avx2-pr101611-2.c: New test.
2021-07-28 10:52:51 +02:00
Martin Uecker
8af0c50a29 Correct a mistake in a warnung for -Wnonnull.
In the warning for -Wnonnull when warning about array parameters
with bounds > 0 and which are NULL the numbers referring to the
two arguments are switched. This patch corrects the mistake.

2021-07-28  Martin Uecker  <muecker@gwdg.de>

gcc/
	* calls.c (maybe_warn_rdwr_sizes): Correct argument
	numbers in warning that were switched.

gcc/testsuite/
	* gcc.dg/Wnonnull-4.c: Correct argument numbers in warnings.
2021-07-28 08:48:30 +02:00
Sandra Loosemore
e78480ad09 Bind(c): Improve error checking in CFI_* functions
This patch adds additional run-time checking for invalid arguments to
CFI_establish and CFI_setpointer.  It also changes existing messages
throughout the CFI_* functions to use PRIiPTR to format CFI_index_t
values instead of casting them to int and using %d (which may not work
on targets where int is a smaller type), simplifies wording of some
messages, and fixes issues with capitalization, typos, and the like.
Additionally some coding standards problems such as >80 character lines
are addressed.

2021-07-24  Sandra Loosemore  <sandra@codesourcery.com>

	PR libfortran/101317

libgfortran/
	* runtime/ISO_Fortran_binding.c: Include <inttypes.h>.
	(CFI_address): Tidy error messages and comments.
	(CFI_allocate): Likewise.
	(CFI_deallocate): Likewise.
	(CFI_establish): Likewise.  Add new checks for validity of
	elem_len when it's used, plus type argument and extents.
	(CFI_is_contiguous): Tidy error messages and comments.
	(CFI_section): Likewise.  Refactor some repetitive code to
	make it more understandable.
	(CFI_select_part): Likewise.
	(CFI_setpointer): Likewise.  Check that source is not an
	unallocated allocatable array or an assumed-size array.

gcc/testsuite/
	* gfortran.dg/ISO_Fortran_binding_17.f90: Fix typo in error
	message patterns.
2021-07-27 21:24:26 -07:00
Sandra Loosemore
b4a9bc7856 Bind(c): Fix bugs in CFI_section
CFI_section was incorrectly adjusting the base pointer for the result
array twice in different ways.  It was also overwriting the array
dimension info in the result descriptor before computing the base
address offset from the source descriptor, which caused problems if
the two descriptors are the same.  This patch fixes both problems and
makes the code simpler, too.

A consequence of this patch is that the result array is now 0-based in
all dimensions instead of starting at the numbering to match the first
element of the source array.  The Fortran standard only specifies the
shape of the result array, not its lower bounds, so this is permitted
and probably less confusing for users as well as implementors.

2021-07-17  Sandra Loosemore  <sandra@codesourcery.com>

	PR libfortran/101310

libgfortran/
	* runtime/ISO_Fortran_binding.c (CFI_section): Fix the base
	address computation and simplify the code.

gcc/testsuite/
	* gfortran.dg/ISO_Fortran_binding_1.c (section_c): Remove
	incorrect assertions.
2021-07-27 21:24:25 -07:00
Sandra Loosemore
a3b350f179 Fix ISO_Fortran_binding.h paths in gfortran testsuite
ISO_Fortran_binding.h is now generated in the libgfortran build
directory where it is on the default include path.  Adjust includes in
the gfortran testsuite not to include an explicit path pointing at the
source directory.

2021-07-27  Sandra Loosemore  <sandra@codesourcery.com>

gcc/testsuite/
	PR libfortran/101305
	* gfortran.dg/ISO_Fortran_binding_1.c: Adjust include path.
	* gfortran.dg/ISO_Fortran_binding_10.c: Likewise.
	* gfortran.dg/ISO_Fortran_binding_11.c: Likewise.
	* gfortran.dg/ISO_Fortran_binding_12.c: Likewise.
	* gfortran.dg/ISO_Fortran_binding_15.c: Likewise.
	* gfortran.dg/ISO_Fortran_binding_16.c: Likewise.
	* gfortran.dg/ISO_Fortran_binding_17.c: Likewise.
	* gfortran.dg/ISO_Fortran_binding_18.c: Likewise.
	* gfortran.dg/ISO_Fortran_binding_3.c: Likewise.
	* gfortran.dg/ISO_Fortran_binding_5.c: Likewise.
	* gfortran.dg/ISO_Fortran_binding_6.c: Likewise.
	* gfortran.dg/ISO_Fortran_binding_7.c: Likewise.
	* gfortran.dg/ISO_Fortran_binding_8.c: Likewise.
	* gfortran.dg/ISO_Fortran_binding_9.c: Likewise.
	* gfortran.dg/PR94327.c: Likewise.
	* gfortran.dg/PR94331.c: Likewise.
	* gfortran.dg/bind_c_array_params_3_aux.c: Likewise.
	* gfortran.dg/iso_fortran_binding_uint8_array_driver.c: Likewise.
	* gfortran.dg/pr93524.c: Likewise.
2021-07-27 21:24:11 -07:00
Sandra Loosemore
c4dc9f5901 Bind(C): Correct sizes of some types in CFI_establish
CFI_establish was failing to set the default elem_len correctly for
CFI_type_cptr, CFI_type_cfunptr, CFI_type_long_double, and
CFI_type_long_double_Complex.

2021-07-13  Sandra Loosemore  <sandra@codesourcery.com>

libgfortran/
	PR libfortran/101305
	* runtime/ISO_Fortran_binding.c (CFI_establish): Special-case
	CFI_type_cptr and CFI_type_cfunptr.  Correct size of long double
	on targets where it has kind 10.
2021-07-27 21:20:21 -07:00
Sandra Loosemore
fef67987cf Bind(C): Fix type encodings in ISO_Fortran_binding.h
ISO_Fortran_binding.h had many incorrect hardwired kind encodings in
the definitions of the CFI_type_* macros.  Additionally, not all
targets support all the defined type encodings, and the Fortran
standard requires those macros to have a negative value.

This patch changes ISO_Fortran_binding.h to use sizeof instead of
hard-coded sizes, and assembles it from fragments that reflect the
set of types supported by the target.

2021-07-22  Sandra Loosemore  <sandra@codesourcery.com>
	    Tobias Burnus  <tobias@codesourcery.com>

libgfortran/
	PR libfortran/101305
	* ISO_Fortran_binding.h: Fix hard-coded sizes and split into...
	* ISO_Fortran_binding-1-tmpl.h: New file.
	* ISO_Fortran_binding-2-tmpl.h: New file.
	* ISO_Fortran_binding-3-tmpl.h: New file.
	* Makefile.am: Add rule for generating ISO_Fortran_binding.h.
	Adjust pathnames to that file.
	* Makefile.in: Regenerated.
	* mk-kinds-h.sh: New file.
	* runtime/ISO_Fortran_binding.c: Fix include path.
2021-07-27 21:20:21 -07:00
Kewen Lin
89b3c97eed vect: Fix wrong check in vect_recog_mulhs_pattern [PR101596]
As PR101596 showed, vect_recog_mulhs_pattern uses target_precision to
check the scale_term is expected or not, it could be wrong when the
precision of the actual used new_type larger than target_precision as
shown by the example.

This patch is to use precision of new_type instead of target_precision
for the scale_term matching check.

Bootstrapped & regtested on powerpc64le-linux-gnu P10,
powerpc64-linux-gnu P8, x86_64-redhat-linux and aarch64-linux-gnu.

gcc/ChangeLog:

	PR tree-optimization/101596
	* tree-vect-patterns.c (vect_recog_mulhs_pattern): Fix wrong check
	by using new_type's precision instead.

gcc/testsuite/ChangeLog:

	PR tree-optimization/101596
	* gcc.target/powerpc/pr101596-1.c: New test.
	* gcc.target/powerpc/pr101596-2.c: Likewise.
	* gcc.target/powerpc/pr101596-3.c: Likewise.
2021-07-27 22:04:22 -05:00