Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

229 lines
3.2 KiB
C#

//
// This test excercises a few new optimizations that were entered in the context
// of Binary operators and EmitBranchable.
//
// There are a number of cases:
//
// EmitBranchable can be called with an `onTrue' (false for if, true for loops).
//
// The == and != operators handle the Null compares specially
using System;
class X {
static int one = 1;
static int two = 2;
static int three = 3;
static int four = 4;
static bool t = true;
static bool f = false;
static int fcalls = 0;
static int tcalls = 0;
static bool ff ()
{
fcalls++;
return false;
}
static bool tt ()
{
tcalls++;
return true;
}
static int test_if ()
{
//
// Ands in the if context
//
if (f && f)
return 1;
if (t && f)
return 2;
if (f && t)
return 3;
if (one < two && f)
return 4;
if (one > two && t)
return 5;
if (one < two && t)
Console.WriteLine ("");
if (ff () && ff ())
return 6;
if (fcalls != 1)
return 10;
if (tt () && tt ()){
if (tcalls != 2)
return 11;
if (tt () && ff ())
return 8;
if (tcalls != 3)
return 12;
if (fcalls != 2)
return 13;
if (ff () && tt ())
return 9;
if (fcalls != 3)
return 14;
if (tcalls != 3)
return 15;
} else
return 7;
if (one < two && four > three){
if (one == one && two != three){
} else
return 20;
} else
return 21;
if (one == two || two != two)
return 22;
object o = null;
if (o == null || false){
o = 1;
if (o != null || false)
o = null;
else
return 23;
if (true || o == null){
if (o != null || o == null){
if (o == null && o != null)
return 25;
if (o == null && one == two)
return 26;
if (one == one && o != null)
return 27;
o = 1;
if (two == two && o == null)
return 28;
return 0;
}
return 25;
}
return 26;
}
return 27;
}
//
// This tests emitbranchable with an `onTrue' set to tru
//
static int test_while ()
{
int count = 0;
while (t && t){
count++;
break;
}
if (count != 1)
return 1;
while (f || t){
count++; break;
}
if (count != 2)
return 2;
while (f || f){
count++; break;
}
if (count != 2)
return 3;
while (one < two && two > one){
count++;
break;
}
if (count != 3)
return 4;
while (one < one || two > one){
count++;
break;
}
if (count != 4)
return 5;
while (one < one || two > two){
count++;
break;
}
if (count != 4)
return 6;
while (one < two && t){
count++;
break;
}
if (count != 5)
return 7;
while (one < one || t){
count++;
break;
}
if (count != 6)
return 8;
while (one < one || f){
count++;
break;
}
if (count != 6)
return 9;
return 0;
}
static int test_inline ()
{
bool lt = t || f;
if (!lt)
return 1;
return 0;
}
public static int Main ()
{
int v;
object o = null;
if (o == null || false)
o = 1;
else
o = 2;
Console.WriteLine ("V: "+ o);
v = test_if ();
if (v != 0)
return v;
v = test_inline ();
if (v != 0)
return 30 + v;
v = test_while ();
if (v != 0)
return 90 + v;
Console.WriteLine ("test ok");
return 0;
}
}