From 23cdce68cfdbf75b2a7fc60ccf17477260db9f68 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Fri, 14 Apr 2000 10:45:17 -0700 Subject: [PATCH] fold-const.c (extract_muldiv): Don't distribute and widen multiply across plus for non-sizetype unsigned types. * fold-const.c (extract_muldiv): Don't distribute and widen multiply across plus for non-sizetype unsigned types. From-SVN: r33151 --- gcc/ChangeLog | 5 +++++ gcc/fold-const.c | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4465c292dfc..29c1d1f22c8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-04-14 Richard Henderson + + * fold-const.c (extract_muldiv): Don't distribute and widen + multiply across plus for non-sizetype unsigned types. + 2000-04-14 Richard Henderson * flow.c (find_auto_inc): Don't autoinc eliminable registers. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 19b2f703201..991dddda973 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -4480,6 +4480,14 @@ extract_muldiv (t, c, code, wide_type) if (op1 == 0 || TREE_OVERFLOW (op1)) break; + /* If we have an unsigned type is not a sizetype, we cannot widen + the operation since it will change the result if the original + computation overflowed. */ + if (TREE_UNSIGNED (ctype) + && ! TYPE_IS_SIZETYPE (ctype) + && ctype != type) + break; + /* If we were able to eliminate our operation from the first side, apply our operation to the second side and reform the PLUS. */ if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR)) -- 2.30.2