diff options
Diffstat (limited to 'gcc/tree-loop-distribution.c')
-rw-r--r-- | gcc/tree-loop-distribution.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index 67f27ba..5e327f4 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -2569,6 +2569,7 @@ fuse_memset_builtins (vec<struct partition *> *partitions) { unsigned i, j; struct partition *part1, *part2; + tree rhs1, rhs2; for (i = 0; partitions->iterate (i, &part1);) { @@ -2586,6 +2587,12 @@ fuse_memset_builtins (vec<struct partition *> *partitions) || !operand_equal_p (part1->builtin->dst_base_base, part2->builtin->dst_base_base, 0)) break; + + /* Memset calls setting different values can't be merged. */ + rhs1 = gimple_assign_rhs1 (DR_STMT (part1->builtin->dst_dr)); + rhs2 = gimple_assign_rhs1 (DR_STMT (part2->builtin->dst_dr)); + if (!operand_equal_p (rhs1, rhs2, 0)) + break; } /* Stable sort is required in order to avoid breaking dependence. */ @@ -2617,8 +2624,8 @@ fuse_memset_builtins (vec<struct partition *> *partitions) i++; continue; } - tree rhs1 = gimple_assign_rhs1 (DR_STMT (part1->builtin->dst_dr)); - tree rhs2 = gimple_assign_rhs1 (DR_STMT (part2->builtin->dst_dr)); + rhs1 = gimple_assign_rhs1 (DR_STMT (part1->builtin->dst_dr)); + rhs2 = gimple_assign_rhs1 (DR_STMT (part2->builtin->dst_dr)); int bytev1 = const_with_all_bytes_same (rhs1); int bytev2 = const_with_all_bytes_same (rhs2); /* Only merge memset partitions of the same value. */ |