[mcs] Update codegen for boolean loads. Fixes #21685
authorMarek Safar <marek.safar@gmail.com>
Thu, 31 Jul 2014 16:40:19 +0000 (18:40 +0200)
committerMarek Safar <marek.safar@gmail.com>
Thu, 31 Jul 2014 16:40:19 +0000 (18:40 +0200)
mcs/mcs/codegen.cs
mcs/tests/test-898.cs
mcs/tests/ver-il-net_4_5.xml

index adfbe0416ab51a5e15da4acf4d7f7eb8ede16466..b346a5bbc4f43c1a6f218202b6d1bd7829086bcf 100644 (file)
@@ -540,8 +540,8 @@ namespace Mono.CSharp
                                // bool array can actually store any byte value
                                //
                                ig.Emit (OpCodes.Ldelem_U1);
-                               ig.Emit (OpCodes.Ldc_I4_1);
-                               ig.Emit (OpCodes.And);
+                               ig.Emit (OpCodes.Ldc_I4_0);
+                               ig.Emit (OpCodes.Cgt_Un);
                                break;
                        case BuiltinTypeSpec.Type.Byte:
                                ig.Emit (OpCodes.Ldelem_U1);
@@ -762,8 +762,8 @@ namespace Mono.CSharp
                                break;
                        case BuiltinTypeSpec.Type.Bool:
                                ig.Emit (OpCodes.Ldind_I1);
-                               ig.Emit (OpCodes.Ldc_I4_1);
-                               ig.Emit (OpCodes.And);
+                               ig.Emit (OpCodes.Ldc_I4_0);
+                               ig.Emit (OpCodes.Cgt_Un);
                                break;
                        case BuiltinTypeSpec.Type.ULong:
                        case BuiltinTypeSpec.Type.Long:
index 5a67111f0b13e44e8f1a7fcee1a60ce7c65b4852..5b6940372fb15f64a1c7299667a8da0645ce37da 100644 (file)
@@ -1,3 +1,5 @@
+// Compiler options: -unsafe
 using System;
 
 class BoolArrayWithByteValues
@@ -18,6 +20,26 @@ class BoolArrayWithByteValues
                return 0;
        }
 
+       static unsafe bool Ptr ()
+       {
+               bool rv;
+       
+               var arr = new byte [256];
+               for (int i = 0; i < arr.Length; i++)
+                       arr [i] = (byte) i;
+               fixed (byte* bptr = arr) {
+                       rv = true;
+                       for (int i = 0; i < arr.Length; i++) {
+                               bool* boptr = (bool*)(bptr + i);
+                               if (arr[i] > 0 && !*boptr)
+                                       rv = false;
+                               System.Console.WriteLine ("#{0} = {1}", i, *boptr);
+                       }
+               }
+
+               return rv;
+       }
+
        static int Main()
        {
                var a = new bool[1];
@@ -49,6 +71,9 @@ class BoolArrayWithByteValues
                if (res != 0)
                        return res;
 
+               if (!Ptr ())
+                       return 6;
+
                return 0;
        }
 }
\ No newline at end of file
index 6b5784f060f27f45255bc535cc5303b4d19e9e77..098d947283595e5a8adaac692ae6f0ebaf26b52d 100644 (file)
   <test name="test-146.cs">\r
     <type name="Test">\r
       <method name="Int32 Main()" attrs="150">\r
-        <size>354</size>\r
+        <size>355</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
   <test name="test-729.cs">\r
     <type name="Primes.MainClass">\r
       <method name="Int32 Main()" attrs="150">\r
-        <size>148</size>\r
+        <size>149</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
   <test name="test-898.cs">\r
     <type name="BoolArrayWithByteValues">\r
       <method name="Int32 Foo(Boolean ByRef)" attrs="145">\r
-        <size>56</size>\r
+        <size>58</size>\r
       </method>\r
       <method name="Int32 Main()" attrs="145">\r
-        <size>169</size>\r
+        <size>191</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="Boolean Ptr()" attrs="145">\r
+        <size>167</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-899.cs">\r
     </type>\r
     <type name="Tester+&lt;ArrayAccessTest_1&gt;c__async0">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>337</size>\r
+        <size>338</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;ArrayAccessTest_2&gt;c__async1">\r
     </type>\r
     <type name="Tester+&lt;ArrayAccessTest_10&gt;c__async9">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>234</size>\r
+        <size>235</size>\r
       </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r