2010-06-08 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Tue, 8 Jun 2010 15:17:06 +0000 (15:17 -0000)
committerZoltan Varga <vargaz@gmail.com>
Tue, 8 Jun 2010 15:17:06 +0000 (15:17 -0000)
* liveness.c (visit_bb): Make the component vregs of long vars volatile as well.
Fixes #612206.

* exceptions.cs: Add a test.

svn path=/trunk/mono/; revision=158668

mono/mini/ChangeLog
mono/mini/exceptions.cs
mono/mini/liveness.c

index c09baa07cbd982473c83453eec8266d8e8091a48..821cc8f057c978e03229a5d14c4b1f775dfb0d05 100755 (executable)
@@ -1,3 +1,10 @@
+2010-06-08  Zoltan Varga  <vargaz@gmail.com>
+
+       * liveness.c (visit_bb): Make the component vregs of long vars volatile as well.
+       Fixes #612206.
+
+       * exceptions.cs: Add a test.
+
 2010-06-06  Zoltan Varga  <vargaz@gmail.com>
 
        * mini-llvm.c (mono_llvm_check_method_supported): Only disable llvm for nested clauses.
index cf7dc613c0461c90f077bdb19ef223bc06f4bb57..3a32e5ba07d1f65aac86f05cc5804c837743e2b3 100644 (file)
@@ -2568,5 +2568,24 @@ class Tests {
 
                return 2;
        }
+
+    class Child
+    {
+        public virtual long Method()
+        {
+            throw new Exception();
+        }
+    }
+
+       /* #612206 */
+       public static int test_100_long_vars_in_clauses_initlocals_opt () {
+               Child c = new Child();
+               long value = 100; 
+               try {
+                       value = c.Method();
+               }
+               catch {}
+               return (int)value;
+       }
 }
 
index 9aa7c2af43184d8b25542289b5d271e3ea9d8eb6..49c02e9f9806992c159b1f14773001b12f7716f8 100644 (file)
@@ -94,6 +94,11 @@ visit_bb (MonoCompile *cfg, MonoBasicBlock *bb, GSList **visited)
                        MonoMethodVar *vi = MONO_VARINFO (cfg, idx);
 
                        cfg->varinfo [vi->idx]->flags |= MONO_INST_VOLATILE;
+                       if (SIZEOF_REGISTER == 4 && (var->type == STACK_I8 || (var->type == STACK_R8 && COMPILE_SOFT_FLOAT (cfg)))) {
+                               /* Make the component vregs volatile as well (#612206) */
+                               get_vreg_to_inst (cfg, var->dreg + 1)->flags |= MONO_INST_VOLATILE;
+                               get_vreg_to_inst (cfg, var->dreg + 2)->flags |= MONO_INST_VOLATILE;
+                       }
                }
                        
                /* SREGS */
@@ -108,6 +113,11 @@ visit_bb (MonoCompile *cfg, MonoBasicBlock *bb, GSList **visited)
                                MonoMethodVar *vi = MONO_VARINFO (cfg, idx);
 
                                cfg->varinfo [vi->idx]->flags |= MONO_INST_VOLATILE;
+                               if (SIZEOF_REGISTER == 4 && (var->type == STACK_I8 || (var->type == STACK_R8 && COMPILE_SOFT_FLOAT (cfg)))) {
+                                       /* Make the component vregs volatile as well (#612206) */
+                                       get_vreg_to_inst (cfg, var->dreg + 1)->flags |= MONO_INST_VOLATILE;
+                                       get_vreg_to_inst (cfg, var->dreg + 2)->flags |= MONO_INST_VOLATILE;
+                               }
                        }
                }
        }