-
Notifications
You must be signed in to change notification settings - Fork 23
/
or.go
59 lines (51 loc) · 1.39 KB
/
or.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package expr
import (
"fmt"
. "github.com/bspaans/jit-compiler/ir/shared"
)
type IR_Or struct {
*BaseIRExpression
Op1 IRExpression
Op2 IRExpression
}
func NewIR_Or(op1, op2 IRExpression) *IR_Or {
return &IR_Or{
BaseIRExpression: NewBaseIRExpression(Or),
Op1: op1,
Op2: op2,
}
}
func (i *IR_Or) ReturnType(ctx *IR_Context) Type {
return i.Op1.ReturnType(ctx)
}
func (i *IR_Or) String() string {
return fmt.Sprintf("%s || %s", i.Op1.String(), i.Op2.String())
}
func (b *IR_Or) SSA_Transform(ctx *SSA_Context) (SSA_Rewrites, IRExpression) {
if IsLiteralOrVariable(b.Op1) {
if IsLiteralOrVariable(b.Op2) {
return nil, b
} else {
rewrites, expr := b.Op2.SSA_Transform(ctx)
v := ctx.GenerateVariable()
rewrites = append(rewrites, NewSSA_Rewrite(v, expr))
return rewrites, NewIR_Or(b.Op1, NewIR_Variable(v))
}
} else {
rewrites, expr := b.Op1.SSA_Transform(ctx)
v := ctx.GenerateVariable()
rewrites = append(rewrites, NewSSA_Rewrite(v, expr))
if IsLiteralOrVariable(b.Op2) {
return rewrites, NewIR_Or(NewIR_Variable(v), b.Op2)
} else {
rewrites2, expr2 := b.Op2.SSA_Transform(ctx)
for _, rw := range rewrites2 {
rewrites = append(rewrites, rw)
}
v2 := ctx.GenerateVariable()
rewrites = append(rewrites, NewSSA_Rewrite(v2, expr2))
return rewrites, NewIR_Or(NewIR_Variable(v), NewIR_Variable(v2))
}
}
return nil, b
}