summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-07-27 04:12:08 +0000
committerknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-07-27 04:12:08 +0000
commit3b6affb0676ffc673190ee64f96b607e2fdc48fa (patch)
treefac19fb11c3e20cba797ceb27d3b374bbe9bacf4
parent9de0a76ab2e38e3b272fe989d8a98bb0487bd8fd (diff)
downloadruby-3b6affb0676ffc673190ee64f96b607e2fdc48fa.tar.gz
* numeric.c (int_pow, fix_mul): Avoid optimization bugs of
clang. Submitted by Wataru Kimura [Bug #6796]. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@36546 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--numeric.c8
2 files changed, 9 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index a7d903f4b5..ec3b8335e1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Jul 27 13:04:31 2012 Akinori MUSHA <knu@iDaemons.org>
+
+ * numeric.c (int_pow, fix_mul): Avoid optimization bugs of
+ clang. Submitted by Wataru Kimura [Bug #6796].
+
Fri Jun 29 21:19:36 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* eval.c (stack_extend): prevent ALLOCA_N, which reserves a memory
diff --git a/numeric.c b/numeric.c
index 707adbf624..cdb047c110 100644
--- a/numeric.c
+++ b/numeric.c
@@ -2162,7 +2162,7 @@ fix_mul(x, y)
VALUE x, y;
{
if (FIXNUM_P(y)) {
-#ifdef __HP_cc
+#if defined(__HP_cc) || defined(__clang__)
/* avoids an optimization bug of HP aC++/ANSI C B3910B A.06.05 [Jul 25 2005] */
volatile
#endif
@@ -2320,9 +2320,9 @@ int_pow(x, y)
y &= ~1;
do {
while (y % 2 == 0) {
- long x2 = x * x;
+ volatile long x2 = x * x;
if (x2/x != x || !POSFIXABLE(x2)) {
- VALUE v;
+ volatile VALUE v;
bignum:
v = rb_big_pow(rb_int2big(x), LONG2NUM(y));
if (z != 1) v = rb_big_mul(rb_int2big(neg ? -z : z), v);
@@ -2332,7 +2332,7 @@ int_pow(x, y)
y >>= 1;
}
{
- long xz = x * z;
+ volatile long xz = x * z;
if (!POSFIXABLE(xz) || xz / x != z) {
goto bignum;
}