2004-07-02 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / mini / build_relations_propagation_table.pl
1 #!/usr/bin/perl
2
3 # Generate helper table for array bounds check removal
4 #
5 # Author:
6 #   Massimiliano Mantione (massi@ximian.com)
7 #
8 # (C) 2004 Ximian, Inc.  http://www.ximian.com
9
10 @relations = (
11   'MONO_NO_RELATION',  # 000
12   'MONO_EQ_RELATION',  # 001
13   'MONO_LT_RELATION',  # 010
14   'MONO_LE_RELATION',  # 011 (MONO_LT_RELATION|MONO_EQ_RELATION)
15   'MONO_GT_RELATION',  # 100
16   'MONO_GE_RELATION',  # 101 (MONO_GT_RELATION|MONO_EQ_RELATION)
17   'MONO_NE_RELATION',  # 110 (MONO_LT_RELATION|MONO_GT_RELATION)
18   'MONO_ANY_RELATION', # 111 (MONO_EQ_RELATION|MONO_LT_RELATION|MONO_GT_RELATION)
19 );
20
21 sub build_propagated_relation
22 {
23   my ( $main_relation, $related_relation ) = @_;
24   my $result = 'MONO_UNKNOWN_RELATION';
25   
26   if ( ($main_relation eq 'MONO_EQ_RELATION') && ($related_relation ne 'MONO_NO_RELATION') )
27   {
28     $result = $related_relation;
29   }
30   elsif ( $main_relation eq 'MONO_LT_RELATION' )
31   {
32     if ( $related_relation eq 'MONO_EQ_RELATION' )
33     {
34       $result = 'MONO_LT_RELATION';
35     }
36     elsif ( $related_relation eq 'MONO_LT_RELATION' )
37     {
38       $result = 'MONO_LT_RELATION';
39     }
40     elsif ( $related_relation eq 'MONO_LE_RELATION' )
41     {
42       $result = 'MONO_LT_RELATION';
43     }
44     else
45     {
46       $result = 'MONO_ANY_RELATION';
47     }
48   }
49   elsif ( $main_relation eq 'MONO_LE_RELATION' )
50   {
51     if ( $related_relation eq 'MONO_EQ_RELATION' )
52     {
53       $result = 'MONO_LE_RELATION';
54     }
55     elsif ( $related_relation eq 'MONO_LT_RELATION' )
56     {
57       $result = 'MONO_LT_RELATION';
58     }
59     elsif ( $related_relation eq 'MONO_LE_RELATION' )
60     {
61       $result = 'MONO_LE_RELATION';
62     }
63     else
64     {
65       $result = 'MONO_ANY_RELATION';
66     }
67   }
68   
69   elsif ( $main_relation eq 'MONO_GT_RELATION' )
70   {
71     if ( $related_relation eq 'MONO_EQ_RELATION' )
72     {
73       $result = 'MONO_GT_RELATION';
74     }
75     elsif ( $related_relation eq 'MONO_GT_RELATION' )
76     {
77       $result = 'MONO_GT_RELATION';
78     }
79     elsif ( $related_relation eq 'MONO_GE_RELATION' )
80     {
81       $result = 'MONO_GT_RELATION';
82     }
83     else
84     {
85       $result = 'MONO_ANY_RELATION';
86     }
87   }
88   elsif ( $main_relation eq 'MONO_GE_RELATION' )
89   {
90     if ( $related_relation eq 'MONO_EQ_RELATION' )
91     {
92       $result = 'MONO_GE_RELATION';
93     }
94     elsif ( $related_relation eq 'MONO_GT_RELATION' )
95     {
96       $result = 'MONO_GT_RELATION';
97     }
98     elsif ( $related_relation eq 'MONO_GE_RELATION' )
99     {
100       $result = 'MONO_GE_RELATION';
101     }
102     else
103     {
104       $result = 'MONO_ANY_RELATION';
105     }
106   }
107   else
108   {
109     $result = 'MONO_ANY_RELATION';
110   }
111   
112   $result;
113 }
114
115 open FILE, ">propagated_relations_table.def";
116
117 for ( my $mr = 0; $mr < 8; $mr++ )
118 {
119   for ( my $pr = 0; $pr < 8; $pr++ )
120   {
121     my $propagated_relation = &build_propagated_relation( $relations[$mr], $relations[$pr] );
122     print FILE "  $propagated_relation, /* $relations[$mr] - $relations[$pr] */\n";
123   }
124 }
125
126 close FILE;