aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2022-01-31 17:05:28 +0100
committerTom de Vries <tdevries@suse.de>2022-02-01 08:12:24 +0100
commit2989516651579dc045e968d7517857c581e3a2dd (patch)
treef9621a228dd4d3d1b0cd5fddec46a58b8f54b2ed /gcc
parent1bb52662574f6c98de48a5db8c180786e4a53039 (diff)
downloadgcc-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.c17
-rw-r--r--gcc/tree-loop-distribution.cc5
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);