Fix x86 memset bug, reported by Karl Guenter Wuensch.
authorJim Wilson <wilson@cygnus.com>
Tue, 28 Apr 1998 19:12:47 +0000 (19:12 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Tue, 28 Apr 1998 19:12:47 +0000 (12:12 -0700)
* expr.c (expand_builtin, case BUILT_IN_MEMSET): Break if either
val or len has TREE_SIDE_EFFECTS set.

From-SVN: r19471

gcc/ChangeLog
gcc/expr.c

index 2a77dca930428c28f0b7e1c1b3c054208a29368c..ca79fe802a093c1b8f8c7307fcf6812a28df672d 100644 (file)
@@ -1,5 +1,8 @@
 Tue Apr 28 17:53:33 1998  Jim Wilson  <wilson@cygnus.com>
 
+       * expr.c (expand_builtin, case BUILT_IN_MEMSET): Break if either
+       val or len has TREE_SIDE_EFFECTS set.
+
        * sparc.md (mulsidi3): Call const v8plus and v8plus routines.
        (mulsidi3_v8plus, const_mulsidi3_v8plus): Delete asterisk from name.
        (smuldi3_highpart): Call const v8plus routine.
index 8473181d72595befc79a68a4530a55d5358f9016..c094a0f0f02496457507c632a15860d319106d7b 100644 (file)
@@ -8609,6 +8609,15 @@ expand_builtin (exp, target, subtarget, mode, ignore)
          if (dest_align == 0)
            break;
 
+         /* If the arguments have side-effects, then we can only evaluate
+            them at most once.  The following code evaluates them twice if
+            they are not constants because we break out to expand_call
+            in that case.  They can't be constants if they have side-effects
+            so we can check for that first.  Alternatively, we could call
+            save_expr to make multiple evaluation safe.  */
+         if (TREE_SIDE_EFFECTS (val) || TREE_SIDE_EFFECTS (len))
+           break;
+
          /* If VAL is not 0, don't do this operation in-line. */
          if (expand_expr (val, NULL_RTX, VOIDmode, 0) != const0_rtx)
            break;