annotate dmd/optimize.c @ 1650:40bd4a0d4870

Update to work with LLVM 2.7. Removed use of dyn_cast, llvm no compiles without exceptions and rtti by default. We do need exceptions for the libconfig stuff, but rtti isn't necessary (anymore). Debug info needs to be rewritten, as in LLVM 2.7 the format has completely changed. To have something to look at while rewriting, the old code has been wrapped inside #ifndef DISABLE_DEBUG_INFO , this means that you have to define this to compile at the moment. Updated tango 0.99.9 patch to include updated EH runtime code, which is needed for LLVM 2.7 as well.
author Tomas Lindquist Olsen
date Wed, 19 May 2010 12:42:32 +0200
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