From: Jakub Jelinek Date: Thu, 20 Dec 2001 08:26:20 +0000 (+0100) Subject: simplify-rtx.c (simplifi_binary_operation): If DIV has narrower mode than op0, only... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a9dc868ffb3fb50e9214823c322cab7c6cf72e30;p=gcc.git simplify-rtx.c (simplifi_binary_operation): If DIV has narrower mode than op0, only return the bits in DIV's mode. * simplify-rtx.c (simplifi_binary_operation) [DIV]: If DIV has narrower mode than op0, only return the bits in DIV's mode. * gcc.c-torture/compile/20011219-2.c: New test. From-SVN: r48199 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f1634cc4744..0f25ad6dec2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-12-20 Jakub Jelinek + + * simplify-rtx.c (simplifi_binary_operation) [DIV]: If DIV has + narrower mode than op0, only return the bits in DIV's mode. + 2001-12-20 Jakub Jelinek * combine.c (distribute_notes): Avoid adding REG_LABEL notes diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 122768e4122..2b25d9c799a 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -1412,7 +1412,10 @@ simplify_binary_operation (code, mode, op0, op1) case DIV: if (trueop1 == CONST1_RTX (mode)) - return op0; + { + rtx x = gen_lowpart_common (mode, op0); + return x ? x : op0; + } /* In IEEE floating point, 0/x is not always 0. */ if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index de0cdf8810a..aaee1d55371 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2001-12-20 Jakub Jelinek + * gcc.c-torture/compile/20011219-2.c: New test. + * gcc.c-torture/execute/20011219-1.c: New test. 2001-12-19 David Billinghurst diff --git a/gcc/testsuite/gcc.c-torture/compile/20011219-2.c b/gcc/testsuite/gcc.c-torture/compile/20011219-2.c new file mode 100644 index 00000000000..2ad7eb1a372 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20011219-2.c @@ -0,0 +1,20 @@ +/* This testcase failed on Alpha at -O2 when simplifying conditional + expressions. */ + +struct S { + unsigned long a; + double b, c; +}; + +extern double bar (double, double); + +int +foo (unsigned long x, unsigned int y, struct S *z) +{ + unsigned int a = z->a; + int b = y / z->a > 1 ? y / z->a : 1; + + a = y / b < z->a ? y / b : z->a; + z->c = z->b * bar ((double) a, (double) x); + return 0; +}