comparison graal/GraalCompiler/src/com/sun/c1x/ir/Or.java @ 2863:4f64bd98f9dc

Canonicalization work
author Gilles Duboscq <gilles.duboscq@oracle.com>
date Tue, 07 Jun 2011 17:04:55 +0200
parents b20f0a48fec3
children fc75fd3fa5e4
comparison
equal deleted inserted replaced
2860:e1be0d206934 2863:4f64bd98f9dc
21 * questions. 21 * questions.
22 */ 22 */
23 package com.sun.c1x.ir; 23 package com.sun.c1x.ir;
24 24
25 import com.oracle.graal.graph.*; 25 import com.oracle.graal.graph.*;
26 import com.oracle.max.graal.opt.CanonicalizerPhase.CanonicalizerOp;
26 import com.sun.cri.bytecode.*; 27 import com.sun.cri.bytecode.*;
27 import com.sun.cri.ci.*; 28 import com.sun.cri.ci.*;
28 29
29 30
30 /** 31 /**
31 * 32 *
32 */ 33 */
33 public final class Or extends Logic { 34 public final class Or extends Logic {
35 private static final OrCanonicalizerOp CANONICALIZER = new OrCanonicalizerOp();
34 36
35 /** 37 /**
36 * @param opcode 38 * @param opcode
37 * @param kind 39 * @param kind
38 * @param x 40 * @param x
52 public Node copy(Graph into) { 54 public Node copy(Graph into) {
53 Or x = new Or(kind, null, null, graph()); 55 Or x = new Or(kind, null, null, graph());
54 return x; 56 return x;
55 } 57 }
56 58
59 @SuppressWarnings("unchecked")
60 @Override
61 public <T extends Op> T lookup(Class<T> clazz) {
62 if (clazz == CanonicalizerOp.class) {
63 return (T) CANONICALIZER;
64 }
65 return super.lookup(clazz);
66 }
67
68 private static class OrCanonicalizerOp implements CanonicalizerOp {
69 @Override
70 public Node canonical(Node node) {
71 assert node instanceof Or;
72 Or or = (Or) node;
73 CiKind kind = or.kind;
74 Graph graph = or.graph();
75 Value x = or.x();
76 Value y = or.y();
77 if (x == y) {
78 return x;
79 }
80 if (x.isConstant() && !y.isConstant()) {
81 or.swapOperands();
82 Value t = y;
83 y = x;
84 x = t;
85 }
86 if (x.isConstant()) {
87 if (kind == CiKind.Int) {
88 return Constant.forInt(x.asConstant().asInt() | y.asConstant().asInt(), graph);
89 } else {
90 assert kind == CiKind.Long;
91 return Constant.forLong(x.asConstant().asLong() | y.asConstant().asLong(), graph);
92 }
93 } else if (y.isConstant()) {
94 if (kind == CiKind.Int) {
95 int c = y.asConstant().asInt();
96 if (c == -1) {
97 return Constant.forInt(-1, graph);
98 }
99 if (c == 0) {
100 return x;
101 }
102 } else {
103 assert kind == CiKind.Long;
104 long c = y.asConstant().asLong();
105 if (c == -1) {
106 return Constant.forLong(-1, graph);
107 }
108 if (c == 0) {
109 return x;
110 }
111 }
112 }
113 return or;
114 }
115 }
57 } 116 }