diff options
author | Tom de Vries <tdevries@suse.de> | 2022-01-31 17:05:28 +0100 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2022-02-01 08:12:24 +0100 |
commit | 2989516651579dc045e968d7517857c581e3a2dd (patch) | |
tree | f9621a228dd4d3d1b0cd5fddec46a58b8f54b2ed /gcc | |
parent | 1bb52662574f6c98de48a5db8c180786e4a53039 (diff) | |
download | gcc-2989516651579dc045e968d7517857c581e3a2dd.zip gcc-2989516651579dc045e968d7517857c581e3a2dd.tar.gz gcc-2989516651579dc045e968d7517857c581e3a2dd.tar.bz2 |
[ldist] Don't add lib calls with -fno-tree-loop-distribute-patterns
As mentioned in PR56888 comment 21:
...
-fno-tree-loop-distribute-patterns is the reliable way to not
transform loops into library calls.
...
However, since commit 6f966f06146 ("ldist: Recognize strlen and rawmemchr like
loops") a strlen or rawmemchr library call may be introduced by ldist.
This caused regressions in testcases
gcc.c-torture/execute/builtins/strlen{,-2,-3}.c for nvptx.
Fix this by not calling transform_reduction_loop from
loop_distribution::execute for -fno-tree-loop-distribute-patterns.
Tested regressed test-cases as well as gcc.dg/tree-ssa/ldist-*.c on
nvptx.
gcc/ChangeLog:
2022-01-31 Tom de Vries <tdevries@suse.de>
* tree-loop-distribution.cc (generate_reduction_builtin_1): Check for
-ftree-loop-distribute-patterns.
(loop_distribution::execute): Don't call transform_reduction_loop for
-fno-tree-loop-distribute-patterns.
gcc/testsuite/ChangeLog:
2022-01-31 Tom de Vries <tdevries@suse.de>
* gcc.dg/tree-ssa/ldist-strlen-4.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-4.c | 17 | ||||
-rw-r--r-- | gcc/tree-loop-distribution.cc | 5 |
2 files changed, 21 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-4.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-4.c new file mode 100644 index 0000000..eafb37e --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-4.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-loop-distribution -fno-tree-loop-distribute-patterns -fdump-tree-ldist-details" } */ +/* { dg-final { scan-tree-dump-not "generated strlen" "ldist" } } */ + +/* Copied from gcc/testsuite/gcc.c-torture/execute/builtins/lib/strlen.c. */ + +__SIZE_TYPE__ +foo (const char *s) +{ + __SIZE_TYPE__ i; + + i = 0; + while (s[i] != 0) + i++; + + return i; +} diff --git a/gcc/tree-loop-distribution.cc b/gcc/tree-loop-distribution.cc index 6fe59cd..c7b4285 100644 --- a/gcc/tree-loop-distribution.cc +++ b/gcc/tree-loop-distribution.cc @@ -3290,6 +3290,8 @@ generate_reduction_builtin_1 (loop_p loop, gimple_seq &seq, tree reduction_var_old, tree reduction_var_new, const char *info, machine_mode load_mode) { + gcc_assert (flag_tree_loop_distribute_patterns); + /* Place new statements before LOOP. */ gimple_stmt_iterator gsi = gsi_last_bb (loop_preheader_edge (loop)->src); gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING); @@ -3773,7 +3775,8 @@ loop_distribution::execute (function *fun) if (niters == NULL_TREE || niters == chrec_dont_know) { datarefs_vec.create (20); - if (transform_reduction_loop (loop)) + if (flag_tree_loop_distribute_patterns + && transform_reduction_loop (loop)) { changed = true; loops_to_be_destroyed.safe_push (loop); |