(build_binary_op): For TRUNC_MOD_EXPR and FLOOR_MOD_EXPR,
authorRichard Stallman <rms@gnu.org>
Tue, 26 Oct 1993 08:26:08 +0000 (08:26 +0000)
committerRichard Stallman <rms@gnu.org>
Tue, 26 Oct 1993 08:26:08 +0000 (08:26 +0000)
don't shorten when divisor might be -1.

From-SVN: r5893

gcc/c-typeck.c

index 3c6f08bd991aaf61d6cc01da562969efadc40fe7..c12f775a050fdb414427161e26b93bbb5d7d26a3 100644 (file)
@@ -1982,7 +1982,14 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
     case TRUNC_MOD_EXPR:
     case FLOOR_MOD_EXPR:
       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
-       shorten = 1;
+       /* Although it would be tempting to shorten always here, doing so loses
+          on some targets, since the modulo instruction is undefined if the
+          quotient can't be represented in the computation mode.  We shorten
+          only if unsigned or if dividing by something we know != -1.  */
+       shorten = (TREE_UNSIGNED (orig_op0)
+                  || (TREE_CODE (op1) == INTEGER_CST
+                      && (TREE_INT_CST_LOW (op1) != -1
+                          || TREE_INT_CST_HIGH (op1) != -1)));
       break;
 
     case TRUTH_ANDIF_EXPR: