--- numeric.c.orig	2011-12-10 21:17:27.000000000 +0900
+++ numeric.c	2012-07-21 15:40:51.000000000 +0900
@@ -2161,7 +2161,7 @@
     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
@@ -2319,9 +2319,9 @@
     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);
@@ -2331,7 +2331,7 @@
 	    y >>= 1;
 	}
 	{
-	    long xz = x * z;
+	    volatile long xz = x * z;
 	    if (!POSFIXABLE(xz) || xz / x != z) {
 		goto bignum;
 	    }