Hi Bill,
Is there a reason the new test is in gcc.dg rather than in gcc.dg/ubsan? The
test FAILs when there is no ubsan runtime support and fsanitize_undefined
effective target is not available in gcc.dg (one needs to load ubsan-dg for this
effective target to be defined).
Best regards,
Thomas
On 14/07/17 19:05, Bill Schmidt wrote:
Hi,
PR81162 identifies a bug in SLSR involving overflow that occurs when
replacing a NEGATE_EXPR with a PLUS_EXPR. This is another example
of an unprofitable transformation that should be skipped anyway,
hence this simple patch. Bootstrapped and tested on
powerpc64le-unknown-linux-gnu, committed. Test case provided from
the bug report.
Thanks,
Bill
[gcc]
2016-07-14 Bill Schmidt <wschm...@linux.vnet.ibm.com>
PR tree-optimization/81162
* gimple-ssa-strength-reduction.c (replace_mult_candidate): Don't
replace a negate with an add.
[gcc/testsuite]
2016-07-14 Bill Schmidt <wschm...@linux.vnet.ibm.com>
PR tree-optimization/81162
* gcc.dg/pr81162.c: New file.
Index: gcc/gimple-ssa-strength-reduction.c
===================================================================
--- gcc/gimple-ssa-strength-reduction.c (revision 250189)
+++ gcc/gimple-ssa-strength-reduction.c (working copy)
@@ -2082,13 +2082,14 @@ replace_mult_candidate (slsr_cand_t c, tree basis_
types but allows for safe negation without twisted logic. */
if (wi::fits_shwi_p (bump)
&& bump.to_shwi () != HOST_WIDE_INT_MIN
- /* It is not useful to replace casts, copies, or adds of
+ /* It is not useful to replace casts, copies, negates, or adds of
an SSA name and a constant. */
&& cand_code != SSA_NAME
&& !CONVERT_EXPR_CODE_P (cand_code)
&& cand_code != PLUS_EXPR
&& cand_code != POINTER_PLUS_EXPR
- && cand_code != MINUS_EXPR)
+ && cand_code != MINUS_EXPR
+ && cand_code != NEGATE_EXPR)
{
enum tree_code code = PLUS_EXPR;
tree bump_tree;
Index: gcc/testsuite/gcc.dg/pr81162.c
===================================================================
--- gcc/testsuite/gcc.dg/pr81162.c (nonexistent)
+++ gcc/testsuite/gcc.dg/pr81162.c (working copy)
@@ -0,0 +1,17 @@
+/* PR tree-optimization/81162 */
+/* { dg-do run } */
+/* { dg-options "-fsanitize=undefined -O2" } */
+
+short s;
+int i1 = 1;
+int i2 = 1;
+unsigned char uc = 147;
+
+int main() {
+ s = (-uc + 2147483647) << 0;
+ if (9031239389974324562ULL >= (-((i1 && i2) + uc) ^ -21096) ) {
+ return 0;
+ } else {
+ return -1;
+ }
+}