[Mono-bugs] [Bug 610126] New: Different IL code for bitwise AND in and out of an ('eta' expanded) if statement

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Sat May 29 01:08:53 EDT 2010


http://bugzilla.novell.com/show_bug.cgi?id=610126

http://bugzilla.novell.com/show_bug.cgi?id=610126#c0


           Summary: Different IL code for bitwise AND in and out of an
                    ('eta' expanded) if statement
    Classification: Mono
           Product: Mono: Compilers
           Version: 2.4.x
          Platform: 32bit
        OS/Version: WinMobil
            Status: NEW
          Severity: Normal
          Priority: P5 - None
         Component: C#
        AssignedTo: mono-bugs at lists.ximian.com
        ReportedBy: chadwick at ccs.neu.edu
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---
           Blocker: ---


User-Agent:       Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.10pre)
Gecko/20100410 Ubuntu/9.10 (karmic) Firefox/3.5.9

Bug shows up when running [g]mcs executables on Windows Mobile.  Comparing the
bitwise AND of two long values to 0L "((a & b) == 0L)" results in generated IL
code that that performs the AND then a conditional branch (brtrue) .

It looks like the CIL specification has the argument to "brtrue" of type 'I'
(not 'I8'), so I'm not sure if it's a subtle mis-optimization in GMCS. 
Microsoft CSC generates code that uses temporary variables for all
subexpressions and return values, so it doesn't suffer from this problem.

Here's a small test case. The output file allows me to easily test on Windows
Mobile.

//------------------------------------------------------------
        using System;
        using System.IO;
        public static class Test{
            public static void Main(String[] args){
                StreamWriter file = 
                    new StreamWriter(new FileStream("test.txt",
                                                    FileMode.Create));
                file.WriteLine(" Test 1: "+test1(15,15));
                file.WriteLine(" Test 2: "+test2(15,15));
                file.Close();
            }
            static bool test1(long a, long b){
                if((a & b) == 0L)return true;
                return false;
            }
            static bool test2(long a, long b){
                return ((a & b) == 0L);
            }
        }
//-------------------------------------------------------

For the first method (test1), GMCS generates code (summarized) as follows:

        ldarg.0 
        ldarg.1 
        and
        brtrue RET_FALSE
        ldc.i4.1
        ret
     RET_FALSE:
        ldc.i4.0 
        ret 

And for the second (test2), it generates (correct) code:

        ldarg.0
        ldarg.1
        and 
        ldc.i4.0
        conv.i8
        ceq
        ret 

Both methods should obviously return false when called with identical values
for 'a' and 'b', but the first method returns true.

Reproducible: Always

Steps to Reproduce:
1. Compile the Test class using GMCS
2. Patch the executable to run on Windows Mobile
3. Transfer to a Windows Mobile device and run
4. Inspect the created file "test.txt"
Actual Results:  
 Test 1: True
 Test 2: False


Expected Results:  
 Test 1: False
 Test 2: False

-- 
Configure bugmail: http://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.


More information about the mono-bugs mailing list