OSDN Git Service

(build_binary_op): For TRUNC_MOD_EXPR and FLOOR_MOD_EXPR,
authorrms <rms@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 26 Oct 1993 08:26:08 +0000 (08:26 +0000)
committerrms <rms@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 26 Oct 1993 08:26:08 +0000 (08:26 +0000)
don't shorten when divisor might be -1.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@5893 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/c-typeck.c

index 3c6f08b..c12f775 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: