From bf931ec8298555022f74a00767dd00007a41cbf4 Mon Sep 17 00:00:00 2001 From: Jim Wilson Date: Tue, 28 Apr 1998 19:12:47 +0000 Subject: Fix x86 memset bug, reported by Karl Guenter Wuensch. * expr.c (expand_builtin, case BUILT_IN_MEMSET): Break if either val or len has TREE_SIDE_EFFECTS set. From-SVN: r19471 --- gcc/expr.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'gcc/expr.c') diff --git a/gcc/expr.c b/gcc/expr.c index 8473181..c094a0f 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -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; -- cgit v1.1