annotate dmd/optimize.c @ 1638:0de4525a9ed6

Apply workaround for #395 by klickverbot.
author Christian Kamm <kamm incasoftware de>
date Mon, 08 Mar 2010 20:06:08 +0100
parents 44b145be2ef5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
1
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
2 // Compiler implementation of the D programming language
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
3 // Copyright (c) 1999-2010 by Digital Mars
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
4 // All Rights Reserved
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
5 // written by Walter Bright
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
6 // http://www.digitalmars.com
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
7 // License for redistribution is by either the Artistic License
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
9 // See the included readme.txt for details.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
10
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
11 #include <stdio.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
12 #include <ctype.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
13 #include <assert.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
14 #include <math.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
15
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
16 #if __DMC__
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
17 #include <complex.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
18 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
19
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
20 #include "lexer.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
21 #include "mtype.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
22 #include "expression.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
23 #include "declaration.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
24 #include "aggregate.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
25 #include "init.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
26
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
27
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
28 #ifdef IN_GCC
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
29 #include "d-gcc-real.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
30
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
31 /* %% fix? */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
32 extern "C" bool real_isnan (const real_t *);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
33 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
34
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
35 static real_t zero; // work around DMC bug for now
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
36
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
37
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
38 /*************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
39 * If expression is a variable with a const initializer,
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
40 * return that initializer.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
41 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
42
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
43 Expression *fromConstInitializer(Expression *e1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
44 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
45 //printf("fromConstInitializer(%s)\n", e1->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
46 if (e1->op == TOKvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
47 { VarExp *ve = (VarExp *)e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
48 VarDeclaration *v = ve->var->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
49 if (v && v->isConst() && v->init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
50 { Expression *ei = v->init->toExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
51 if (ei && ei->type)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
52 e1 = ei;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
53 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
54 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
55 return e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
56 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
57
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
58
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
59 Expression *Expression::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
60 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
61 //printf("Expression::optimize(result = x%x) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
62 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
63 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
64
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
65 Expression *VarExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
66 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
67 if (result & WANTinterpret)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
68 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
69 return fromConstInitializer(this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
70 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
71 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
72 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
73
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
74 Expression *TupleExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
75 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
76 for (size_t i = 0; i < exps->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
77 { Expression *e = (Expression *)exps->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
78
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
79 e = e->optimize(WANTvalue | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
80 exps->data[i] = (void *)e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
81 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
82 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
83 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
84
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
85 Expression *ArrayLiteralExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
86 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
87 if (elements)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
88 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
89 for (size_t i = 0; i < elements->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
90 { Expression *e = (Expression *)elements->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
91
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
92 e = e->optimize(WANTvalue | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
93 elements->data[i] = (void *)e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
94 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
95 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
96 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
97 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
98
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
99 Expression *AssocArrayLiteralExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
100 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
101 assert(keys->dim == values->dim);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
102 for (size_t i = 0; i < keys->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
103 { Expression *e = (Expression *)keys->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
104
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
105 e = e->optimize(WANTvalue | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
106 keys->data[i] = (void *)e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
107
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
108 e = (Expression *)values->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
109 e = e->optimize(WANTvalue | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
110 values->data[i] = (void *)e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
111 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
112 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
113 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
114
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
115 Expression *StructLiteralExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
116 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
117 if (elements)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
118 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
119 for (size_t i = 0; i < elements->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
120 { Expression *e = (Expression *)elements->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
121 if (!e)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
122 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
123 e = e->optimize(WANTvalue | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
124 elements->data[i] = (void *)e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
125 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
126 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
127 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
128 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
129
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
130 Expression *TypeExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
131 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
132 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
133 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
134
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
135 Expression *UnaExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
136 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
137 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
138 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
139 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
140
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
141 Expression *NegExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
142 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
143
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
144 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
145 if (e1->isConst() == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
146 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
147 e = Neg(type, e1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
148 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
149 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
150 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
151 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
152 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
153
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
154 Expression *ComExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
155 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
156
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
157 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
158 if (e1->isConst() == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
159 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
160 e = Com(type, e1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
161 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
162 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
163 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
164 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
165 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
166
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
167 Expression *NotExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
168 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
169
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
170 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
171 if (e1->isConst() == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
172 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
173 e = Not(type, e1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
174 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
175 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
176 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
177 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
178 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
179
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
180 Expression *BoolExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
181 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
182
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
183 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
184 if (e1->isConst() == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
185 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
186 e = Bool(type, e1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
187 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
188 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
189 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
190 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
191 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
192
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
193 Expression *AddrExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
194 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
195
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
196 //printf("AddrExp::optimize(result = %d) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
197 // never try to interpret: it could change the semantics by turning
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
198 // const p = &s; into an something like const p = &(Struct());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
199 e1 = e1->optimize(result & ~WANTinterpret);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
200 // Convert &*ex to ex
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
201 if (e1->op == TOKstar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
202 { Expression *ex;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
203
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
204 ex = ((PtrExp *)e1)->e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
205 if (type->equals(ex->type))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
206 e = ex;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
207 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
208 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
209 e = ex->copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
210 e->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
211 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
212 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
213 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
214 #if !IN_LLVM
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
215 if (e1->op == TOKvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
216 { VarExp *ve = (VarExp *)e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
217 if (!ve->var->isOut() && !ve->var->isRef() &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
218 !ve->var->isImportedSymbol())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
219 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
220 e = new SymOffExp(loc, ve->var, 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
221 e->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
222 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
223 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
224 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
225 if (e1->op == TOKindex)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
226 { // Convert &array[n] to &array+n
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
227 IndexExp *ae = (IndexExp *)e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
228
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
229 if (ae->e2->op == TOKint64 && ae->e1->op == TOKvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
230 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
231 dinteger_t index = ae->e2->toInteger();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
232 VarExp *ve = (VarExp *)ae->e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
233 if (ve->type->ty == Tsarray && ve->type->next->ty != Tbit
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
234 && !ve->var->isImportedSymbol())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
235 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
236 TypeSArray *ts = (TypeSArray *)ve->type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
237 dinteger_t dim = ts->dim->toInteger();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
238 if (index < 0 || index >= dim)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
239 error("array index %jd is out of bounds [0..%jd]", index, dim);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
240 e = new SymOffExp(loc, ve->var, index * ts->next->size());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
241 e->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
242 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
243 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
244 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
245 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
246 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
247 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
248 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
249
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
250 Expression *PtrExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
251 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
252 //printf("PtrExp::optimize(result = x%x) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
253 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
254 // Convert *&ex to ex
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
255 if (e1->op == TOKaddress)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
256 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
257 Expression *ex;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
258
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
259 ex = ((AddrExp *)e1)->e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
260 if (type->equals(ex->type))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
261 e = ex;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
262 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
263 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
264 e = ex->copy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
265 e->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
266 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
267 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
268 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
269 // Constant fold *(&structliteral + offset)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
270 if (e1->op == TOKadd)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
271 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
272 Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
273 e = Ptr(type, e1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
274 if (e != EXP_CANT_INTERPRET)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
275 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
276 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
277
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
278 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
279 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
280
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
281 Expression *DotVarExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
282 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
283 //printf("DotVarExp::optimize(result = x%x) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
284 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
285
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
286 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
287 if (e1->op == TOKvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
288 { VarExp *ve = (VarExp *)e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
289 VarDeclaration *v = ve->var->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
290 Expression *e = expandVar(result, v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
291 if (e && e->op == TOKstructliteral)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
292 { StructLiteralExp *sle = (StructLiteralExp *)e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
293 VarDeclaration *vf = var->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
294 if (vf)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
295 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
296 e = sle->getField(type, vf->offset);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
297 if (e && e != EXP_CANT_INTERPRET)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
298 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
299 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
300 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
301 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
302 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
303 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
304 if (e1->op == TOKstructliteral)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
305 { StructLiteralExp *sle = (StructLiteralExp *)e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
306 VarDeclaration *vf = var->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
307 if (vf)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
308 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
309 Expression *e = sle->getField(type, vf->offset);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
310 if (e && e != EXP_CANT_INTERPRET)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
311 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
312 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
313 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
314
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
315 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
316 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
317
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
318 Expression *NewExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
319 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
320 if (thisexp)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
321 thisexp = thisexp->optimize(WANTvalue);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
322
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
323 // Optimize parameters
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
324 if (newargs)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
325 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
326 for (size_t i = 0; i < newargs->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
327 { Expression *e = (Expression *)newargs->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
328
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
329 e = e->optimize(WANTvalue);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
330 newargs->data[i] = (void *)e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
331 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
332 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
333
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
334 if (arguments)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
335 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
336 for (size_t i = 0; i < arguments->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
337 { Expression *e = (Expression *)arguments->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
338
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
339 e = e->optimize(WANTvalue);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
340 arguments->data[i] = (void *)e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
341 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
342 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
343 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
344 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
345
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
346 Expression *CallExp::optimize(int result)
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
347 {
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
348 //printf("CallExp::optimize(result = %d) %s\n", result, toChars());
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
349 Expression *e = this;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
350
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
351 // Optimize parameters
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
352 if (arguments)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
353 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
354 for (size_t i = 0; i < arguments->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
355 { Expression *e = (Expression *)arguments->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
356
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
357 e = e->optimize(WANTvalue);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
358 arguments->data[i] = (void *)e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
359 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
360 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
361
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
362 e1 = e1->optimize(result);
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
363 if (result & WANTinterpret)
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
364 {
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
365 Expression *eresult = interpret(NULL);
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
366 if (eresult == EXP_CANT_INTERPRET)
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
367 return e;
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
368 if (eresult && eresult != EXP_VOID_INTERPRET)
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
369 e = eresult;
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
370 else
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
371 error("cannot evaluate %s at compile time", toChars());
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
372 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
373 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
374 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
375
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
376
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
377 Expression *CastExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
378 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
379 //printf("CastExp::optimize(result = %d) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
380 //printf("from %s to %s\n", type->toChars(), to->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
381 //printf("from %s\n", type->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
382 //printf("e1->type %s\n", e1->type->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
383 //printf("type = %p\n", type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
384 assert(type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
385 enum TOK op1 = e1->op;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
386
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
387 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
388 if (result & WANTinterpret)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
389 e1 = fromConstInitializer(e1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
390
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
391 if ((e1->op == TOKstring || e1->op == TOKarrayliteral) &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
392 (type->ty == Tpointer || type->ty == Tarray) &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
393 type->next->equals(e1->type->next)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
394 )
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
395 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
396 // make a copy before adjusting type to avoid
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
397 // messing up the type of an existing initializer
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
398 e1 = e1->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
399 e1->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
400 return e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
401 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
402 /* The first test here is to prevent infinite loops
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
403 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
404 if (op1 != TOKarrayliteral && e1->op == TOKarrayliteral)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
405 return e1->castTo(NULL, to);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
406 if (e1->op == TOKnull &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
407 (type->ty == Tpointer || type->ty == Tclass))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
408 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
409 e1->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
410 return e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
411 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
412
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
413 if (result & WANTflags && type->ty == Tclass && e1->type->ty == Tclass)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
414 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
415 // See if we can remove an unnecessary cast
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
416 ClassDeclaration *cdfrom;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
417 ClassDeclaration *cdto;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
418 int offset;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
419
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
420 cdfrom = e1->type->isClassHandle();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
421 cdto = type->isClassHandle();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
422 if (cdto->isBaseOf(cdfrom, &offset) && offset == 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
423 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
424 e1->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
425 return e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
426 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
427 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
428
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
429 Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
430
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
431 if (e1->isConst())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
432 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
433 if (e1->op == TOKsymoff)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
434 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
435 if (type->size() == e1->type->size() &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
436 type->toBasetype()->ty != Tsarray)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
437 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
438 e1->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
439 return e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
440 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
441 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
442 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
443 if (to->toBasetype()->ty == Tvoid)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
444 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
445 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
446 e = Cast(type, to, e1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
447 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
448 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
449 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
450 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
451 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
452
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
453 Expression *BinExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
454 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
455 //printf("BinExp::optimize(result = %d) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
456 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
457 e2 = e2->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
458 if (op == TOKshlass || op == TOKshrass || op == TOKushrass)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
459 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
460 if (e2->isConst() == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
461 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
462 dinteger_t i2 = e2->toInteger();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
463 d_uns64 sz = e1->type->size() * 8;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
464 if (i2 < 0 || i2 > sz)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
465 { error("shift assign by %jd is outside the range 0..%zu", i2, sz);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
466 e2 = new IntegerExp(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
467 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
468 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
469 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
470 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
471 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
472
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
473 Expression *AddExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
474 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
475
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
476 //printf("AddExp::optimize(%s)\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
477 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
478 e2 = e2->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
479 if (e1->isConst() && e2->isConst())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
480 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
481 if (e1->op == TOKsymoff && e2->op == TOKsymoff)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
482 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
483 e = Add(type, e1, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
484 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
485 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
486 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
487 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
488 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
489
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
490 Expression *MinExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
491 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
492
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
493 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
494 e2 = e2->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
495 if (e1->isConst() && e2->isConst())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
496 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
497 if (e2->op == TOKsymoff)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
498 return this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
499 e = Min(type, e1, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
500 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
501 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
502 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
503 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
504 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
505
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
506 Expression *MulExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
507 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
508
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
509 //printf("MulExp::optimize(result = %d) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
510 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
511 e2 = e2->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
512 if (e1->isConst() == 1 && e2->isConst() == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
513 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
514 e = Mul(type, e1, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
515 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
516 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
517 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
518 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
519 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
520
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
521 Expression *DivExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
522 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
523
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
524 //printf("DivExp::optimize(%s)\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
525 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
526 e2 = e2->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
527 if (e1->isConst() == 1 && e2->isConst() == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
528 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
529 e = Div(type, e1, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
530 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
531 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
532 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
533 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
534 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
535
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
536 Expression *ModExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
537 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
538
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
539 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
540 e2 = e2->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
541 if (e1->isConst() == 1 && e2->isConst() == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
542 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
543 e = Mod(type, e1, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
544 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
545 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
546 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
547 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
548 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
549
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
550 Expression *shift_optimize(int result, BinExp *e, Expression *(*shift)(Type *, Expression *, Expression *))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
551 { Expression *ex = e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
552
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
553 e->e1 = e->e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
554 e->e2 = e->e2->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
555 if (e->e2->isConst() == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
556 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
557 dinteger_t i2 = e->e2->toInteger();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
558 d_uns64 sz = e->e1->type->size() * 8;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
559 if (i2 < 0 || i2 > sz)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
560 { e->error("shift by %jd is outside the range 0..%zu", i2, sz);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
561 e->e2 = new IntegerExp(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
562 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
563 if (e->e1->isConst() == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
564 ex = (*shift)(e->type, e->e1, e->e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
565 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
566 return ex;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
567 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
568
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
569 Expression *ShlExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
570 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
571 //printf("ShlExp::optimize(result = %d) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
572 return shift_optimize(result, this, Shl);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
573 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
574
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
575 Expression *ShrExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
576 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
577 //printf("ShrExp::optimize(result = %d) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
578 return shift_optimize(result, this, Shr);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
579 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
580
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
581 Expression *UshrExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
582 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
583 //printf("UshrExp::optimize(result = %d) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
584 return shift_optimize(result, this, Ushr);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
585 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
586
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
587 Expression *AndExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
588 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
589
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
590 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
591 e2 = e2->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
592 if (e1->isConst() == 1 && e2->isConst() == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
593 e = And(type, e1, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
594 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
595 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
596 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
597 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
598
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
599 Expression *OrExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
600 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
601
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
602 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
603 e2 = e2->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
604 if (e1->isConst() == 1 && e2->isConst() == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
605 e = Or(type, e1, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
606 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
607 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
608 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
609 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
610
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
611 Expression *XorExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
612 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
613
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
614 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
615 e2 = e2->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
616 if (e1->isConst() == 1 && e2->isConst() == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
617 e = Xor(type, e1, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
618 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
619 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
620 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
621 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
622
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
623 Expression *CommaExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
624 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
625
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
626 //printf("CommaExp::optimize(result = %d) %s\n", result, toChars());
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
627 // Comma needs special treatment, because it may
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
628 // contain compiler-generated declarations. We can interpret them, but
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
629 // otherwise we must NOT attempt to constant-fold them.
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
630 // In particular, if the comma returns a temporary variable, it needs
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
631 // to be an lvalue (this is particularly important for struct constructors)
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
632
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
633 if (result & WANTinterpret)
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
634 { // Interpreting comma needs special treatment, because it may
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
635 // contain compiler-generated declarations.
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
636 e = interpret(NULL);
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
637 return (e == EXP_CANT_INTERPRET) ? this : e;
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
638 }
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
639 // Don't constant fold if it is a compiler-generated temporary.
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
640 if (e1->op == TOKdeclaration)
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
641 return this;
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
642
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
643 e1 = e1->optimize(result & WANTinterpret);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
644 e2 = e2->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
645 if (!e1 || e1->op == TOKint64 || e1->op == TOKfloat64 || !e1->checkSideEffect(2))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
646 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
647 e = e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
648 if (e)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
649 e->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
650 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
651 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
652 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
653 //printf("-CommaExp::optimize(result = %d) %s\n", result, e->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
654 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
655 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
656
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
657 Expression *ArrayLengthExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
658 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
659
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
660 //printf("ArrayLengthExp::optimize(result = %d) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
661 e1 = e1->optimize(WANTvalue | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
662 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
663 if (e1->op == TOKstring || e1->op == TOKarrayliteral || e1->op == TOKassocarrayliteral)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
664 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
665 e = ArrayLength(type, e1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
666 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
667 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
668 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
669
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
670 Expression *EqualExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
671 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
672
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
673 //printf("EqualExp::optimize(result = %x) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
674 e1 = e1->optimize(WANTvalue | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
675 e2 = e2->optimize(WANTvalue | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
676 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
677
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
678 Expression *e1 = fromConstInitializer(this->e1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
679 Expression *e2 = fromConstInitializer(this->e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
680
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
681 e = Equal(op, type, e1, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
682 if (e == EXP_CANT_INTERPRET)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
683 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
684 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
685 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
686
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
687 Expression *IdentityExp::optimize(int result)
1622
a542ef277a84 Merge DMD r316: bugzilla 3628 can't cast null to int
Leandro Lucarella <llucax@gmail.com>
parents: 1599
diff changeset
688 {
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
689 //printf("IdentityExp::optimize(result = %d) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
690 e1 = e1->optimize(WANTvalue | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
691 e2 = e2->optimize(WANTvalue | (result & WANTinterpret));
1622
a542ef277a84 Merge DMD r316: bugzilla 3628 can't cast null to int
Leandro Lucarella <llucax@gmail.com>
parents: 1599
diff changeset
692 Expression *e = this;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
693
1622
a542ef277a84 Merge DMD r316: bugzilla 3628 can't cast null to int
Leandro Lucarella <llucax@gmail.com>
parents: 1599
diff changeset
694 if ((this->e1->isConst() && this->e2->isConst()) ||
a542ef277a84 Merge DMD r316: bugzilla 3628 can't cast null to int
Leandro Lucarella <llucax@gmail.com>
parents: 1599
diff changeset
695 (this->e1->op == TOKnull && this->e2->op == TOKnull))
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
696 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
697 e = Identity(op, type, this->e1, this->e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
698 if (e == EXP_CANT_INTERPRET)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
699 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
700 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
701 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
702 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
703
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
704 Expression *IndexExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
705 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
706
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
707 //printf("IndexExp::optimize(result = %d) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
708 Expression *e1 = this->e1->optimize(WANTvalue | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
709 if (result & WANTinterpret)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
710 e1 = fromConstInitializer(e1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
711 e2 = e2->optimize(WANTvalue | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
712 e = Index(type, e1, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
713 if (e == EXP_CANT_INTERPRET)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
714 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
715 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
716 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
717
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
718 Expression *SliceExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
719 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
720
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
721 //printf("SliceExp::optimize(result = %d) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
722 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
723 e1 = e1->optimize(WANTvalue | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
724 if (!lwr)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
725 { if (e1->op == TOKstring)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
726 { // Convert slice of string literal into dynamic array
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
727 Type *t = e1->type->toBasetype();
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
728 if (t->nextOf())
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1622
diff changeset
729 e = e1->castTo(NULL, t->nextOf()->arrayOf());
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
730 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
731 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
732 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
733 if (result & WANTinterpret)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
734 e1 = fromConstInitializer(e1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
735 lwr = lwr->optimize(WANTvalue | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
736 upr = upr->optimize(WANTvalue | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
737 e = Slice(type, e1, lwr, upr);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
738 if (e == EXP_CANT_INTERPRET)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
739 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
740 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
741 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
742
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
743 Expression *AndAndExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
744 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
745
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
746 //printf("AndAndExp::optimize(%d) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
747 e1 = e1->optimize(WANTflags | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
748 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
749 if (e1->isBool(FALSE))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
750 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
751 e = new CommaExp(loc, e1, new IntegerExp(loc, 0, type));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
752 e->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
753 e = e->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
754 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
755 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
756 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
757 e2 = e2->optimize(WANTflags | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
758 if (result && e2->type->toBasetype()->ty == Tvoid && !global.errors)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
759 error("void has no value");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
760 if (e1->isConst())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
761 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
762 if (e2->isConst())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
763 { int n1 = e1->isBool(1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
764 int n2 = e2->isBool(1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
765
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
766 e = new IntegerExp(loc, n1 && n2, type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
767 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
768 else if (e1->isBool(TRUE))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
769 e = new BoolExp(loc, e2, type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
770 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
771 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
772 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
773 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
774
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
775 Expression *OrOrExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
776 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
777
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
778 e1 = e1->optimize(WANTflags | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
779 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
780 if (e1->isBool(TRUE))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
781 { // Replace with (e1, 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
782 e = new CommaExp(loc, e1, new IntegerExp(loc, 1, type));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
783 e->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
784 e = e->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
785 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
786 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
787 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
788 e2 = e2->optimize(WANTflags | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
789 if (result && e2->type->toBasetype()->ty == Tvoid && !global.errors)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
790 error("void has no value");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
791 if (e1->isConst())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
792 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
793 if (e2->isConst())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
794 { int n1 = e1->isBool(1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
795 int n2 = e2->isBool(1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
796
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
797 e = new IntegerExp(loc, n1 || n2, type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
798 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
799 else if (e1->isBool(FALSE))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
800 e = new BoolExp(loc, e2, type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
801 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
802 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
803 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
804 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
805
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
806 Expression *CmpExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
807 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
808
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
809 //printf("CmpExp::optimize() %s\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
810 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
811 e2 = e2->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
812 if (e1->isConst() == 1 && e2->isConst() == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
813 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
814 e = Cmp(op, type, this->e1, this->e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
815 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
816 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
817 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
818 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
819 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
820
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
821 Expression *CatExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
822 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
823
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
824 //printf("CatExp::optimize(%d) %s\n", result, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
825 e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
826 e2 = e2->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
827 e = Cat(type, e1, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
828 if (e == EXP_CANT_INTERPRET)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
829 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
830 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
831 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
832
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
833
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
834 Expression *CondExp::optimize(int result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
835 { Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
836
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
837 econd = econd->optimize(WANTflags | (result & WANTinterpret));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
838 if (econd->isBool(TRUE))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
839 e = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
840 else if (econd->isBool(FALSE))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
841 e = e2->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
842 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
843 { e1 = e1->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
844 e2 = e2->optimize(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
845 e = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
846 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
847 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
848 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
849
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1499
diff changeset
850