annotate graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/BitOpNodesTest.java @ 19716:2fd45bb25118

Initial version of new dominator-based conditional elimination phase.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Sun, 08 Mar 2015 21:58:34 +0100
parents 61d3cb8e1280
children cc3131ff7ce2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
1 /*
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 16714
diff changeset
2 * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
4 *
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
8 *
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
13 * accompanied this code).
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
14 *
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
18 *
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
21 * questions.
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
22 */
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
23 package com.oracle.graal.replacements.test;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
24
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
25 import org.junit.*;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
26
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
27 import com.oracle.graal.api.meta.*;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
28 import com.oracle.graal.compiler.common.type.*;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
29 import com.oracle.graal.compiler.test.*;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
30 import com.oracle.graal.nodes.*;
19306
a0a760b0fb5f pulled method evolution dependencies out of Assumptions and directly into StructuredGraph
Doug Simon <doug.simon@oracle.com>
parents: 19250
diff changeset
31 import com.oracle.graal.nodes.StructuredGraph.AllowAssumptions;
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
32 import com.oracle.graal.phases.*;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
33 import com.oracle.graal.phases.common.*;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
34 import com.oracle.graal.phases.common.inlining.*;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
35 import com.oracle.graal.phases.tiers.*;
16591
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
36 import com.oracle.graal.replacements.nodes.*;
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
37
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
38 public class BitOpNodesTest extends GraalCompilerTest {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
39
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
40 private static final int INT_CONSTANT_1 = 0x80100010;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
41 private static final int INT_CONSTANT_2 = 0x00011110;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
42 private static final int INT_CONSTANT_3 = 0x00000000;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
43
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
44 private static final long LONG_CONSTANT_1 = 0x8000000000100010L;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
45 private static final long LONG_CONSTANT_2 = 0x0000000000011110L;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
46 private static final long LONG_CONSTANT_3 = 0x0000000000000000L;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
47
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
48 public static long dummyField;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
49
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
50 /*
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
51 * Tests for BitCountNode canonicalizations.
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
52 */
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
53
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
54 public static int bitCountIntConstantSnippet() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
55 return Integer.bitCount(INT_CONSTANT_1) + Integer.bitCount(INT_CONSTANT_2) + Integer.bitCount(INT_CONSTANT_3);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
56 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
57
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
58 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
59 public void testBitCountIntConstant() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
60 ValueNode result = parseAndInline("bitCountIntConstantSnippet");
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 16714
diff changeset
61 Assert.assertEquals(7, result.asJavaConstant().asInt());
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
62 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
63
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
64 public static int bitCountLongConstantSnippet() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
65 return Long.bitCount(LONG_CONSTANT_1) + Long.bitCount(LONG_CONSTANT_2) + Long.bitCount(LONG_CONSTANT_3);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
66 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
67
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
68 public static int bitCountIntSnippet(int v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
69 return Integer.bitCount(v & 0xFFFFFF | 0xFF);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
70 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
71
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
72 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
73 public void testBitCountInt() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
74 ValueNode result = parseAndInline("bitCountIntSnippet");
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
75 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 8, 24), result.stamp());
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
76 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
77
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
78 public static int bitCountIntEmptySnippet(int v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
79 return Integer.bitCount(v & 0xFFFFFF);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
80 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
81
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
82 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
83 public void testBitCountIntEmpty() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
84 ValueNode result = parseAndInline("bitCountIntEmptySnippet");
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
85 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 0, 24), result.stamp());
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
86 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
87
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
88 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
89 public void testBitCountLongConstant() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
90 ValueNode result = parseAndInline("bitCountLongConstantSnippet");
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 16714
diff changeset
91 Assert.assertEquals(7, result.asJavaConstant().asInt());
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
92 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
93
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
94 public static int bitCountLongSnippet(long v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
95 return Long.bitCount(v & 0xFFFFFFFFFFL | 0xFFL);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
96 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
97
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
98 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
99 public void testBitCountLong() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
100 ValueNode result = parseAndInline("bitCountLongSnippet");
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
101 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 8, 40), result.stamp());
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
102 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
103
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
104 public static int bitCountLongEmptySnippet(long v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
105 return Long.bitCount(v & 0xFFFFFFFFFFL);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
106 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
107
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
108 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
109 public void testBitCountLongEmpty() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
110 ValueNode result = parseAndInline("bitCountLongEmptySnippet");
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
111 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 0, 40), result.stamp());
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
112 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
113
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
114 /*
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
115 * Tests for BitScanForwardNode
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
116 */
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
117
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
118 public static int scanForwardIntConstantSnippet() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
119 return Integer.numberOfTrailingZeros(INT_CONSTANT_1) + Integer.numberOfTrailingZeros(INT_CONSTANT_2) + Integer.numberOfTrailingZeros(INT_CONSTANT_3);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
120 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
121
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
122 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
123 public void testScanForwardIntConstant() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
124 ValueNode result = parseAndInline("scanForwardIntConstantSnippet");
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 16714
diff changeset
125 Assert.assertEquals(40, result.asJavaConstant().asInt());
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
126 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
127
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
128 public static int scanForwardIntSnippet(int v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
129 return Integer.numberOfTrailingZeros(v & 0xFFF0 | 0xFF00);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
130 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
131
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
132 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
133 public void testScanForwardInt() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
134 ValueNode result = parseAndInline("scanForwardIntSnippet");
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
135 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 4, 8), result.stamp());
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
136 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
137
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
138 public static int scanForwardLongConstantSnippet() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
139 return Long.numberOfTrailingZeros(LONG_CONSTANT_1) + Long.numberOfTrailingZeros(LONG_CONSTANT_2) + Long.numberOfTrailingZeros(LONG_CONSTANT_3);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
140 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
141
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
142 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
143 public void testScanForwardLongConstant() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
144 ValueNode result = parseAndInline("scanForwardLongConstantSnippet");
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 16714
diff changeset
145 Assert.assertEquals(72, result.asJavaConstant().asInt());
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
146 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
147
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
148 public static int scanForwardLongSnippet(long v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
149 return Long.numberOfTrailingZeros(v & 0xFFFF000000L | 0xFF00000000L);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
150 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
151
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
152 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
153 public void testScanForwardLong() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
154 ValueNode result = parseAndInline("scanForwardLongSnippet");
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
155 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 24, 32), result.stamp());
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
156 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
157
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
158 public static int scanForwardLongEmptySnippet(long v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
159 int result = Long.numberOfTrailingZeros(v & 0xFFFF000000L);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
160 dummyField = result;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
161 return result;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
162 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
164 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
165 public void testScanForwardLongEmpty() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
166 ValueNode result = parseAndInline("scanForwardLongEmptySnippet");
18415
6dc4f0be9a70 Add support of lzcnt and tzcnt
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 18187
diff changeset
167 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 24, 64), result.stamp());
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
168 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
169
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
170 /*
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
171 * Tests for BitScanReverseNode
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
172 */
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
173
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
174 public static int scanReverseIntConstantSnippet() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
175 return Integer.numberOfLeadingZeros(INT_CONSTANT_1) + Integer.numberOfLeadingZeros(INT_CONSTANT_2) + Integer.numberOfLeadingZeros(INT_CONSTANT_3);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
176 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
177
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
178 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
179 public void testScanReverseIntConstant() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
180 ValueNode result = parseAndInline("scanReverseIntConstantSnippet");
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 16714
diff changeset
181 Assert.assertEquals(47, result.asJavaConstant().asInt());
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
182 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
183
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
184 public static int scanReverseIntSnippet(int v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
185 return Integer.numberOfLeadingZeros(v & 0xFFF0 | 0xFF0);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
186 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
187
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
188 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
189 public void testScanReverseInt() {
16618
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
190 /* This test isn't valid unless the BitScanReverseNode intrinsic is used. */
16591
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
191 ValueNode result = parseAndInline("scanReverseIntSnippet", BitScanReverseNode.class);
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
192 if (result != null) {
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
193 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 16, 20), result.stamp());
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
194 }
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
195 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
196
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
197 public static int scanReverseLongConstantSnippet() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
198 return Long.numberOfLeadingZeros(LONG_CONSTANT_1) + Long.numberOfLeadingZeros(LONG_CONSTANT_2) + Long.numberOfLeadingZeros(LONG_CONSTANT_3);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
199 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
200
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
201 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
202 public void testScanReverseLongConstant() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
203 ValueNode result = parseAndInline("scanReverseLongConstantSnippet");
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 16714
diff changeset
204 Assert.assertEquals(111, result.asJavaConstant().asInt());
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
205 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
206
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
207 public static int scanReverseLongSnippet(long v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
208 int result = Long.numberOfLeadingZeros(v & 0xFFF0);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
209 dummyField = result;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
210 return result;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
211 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
212
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
213 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
214 public void testScanReverseLong() {
16618
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
215 /* This test isn't valid unless the BitScanReverseNode intrinsic is used. */
16591
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
216 ValueNode result = parseAndInline("scanReverseLongSnippet", BitScanReverseNode.class);
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
217 if (result != null) {
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
218 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 48, 64), result.stamp());
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
219 }
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
220 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
221
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
222 public static int scanReverseLongEmptySnippet(long v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
223 int result = Long.numberOfLeadingZeros(v & 0xFFFF000000L);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
224 dummyField = result;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
225 return result;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
226 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
227
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
228 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
229 public void testScanReverseLongEmpty() {
16618
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
230 /* This test isn't valid unless the BitScanReverseNode intrinsic is used. */
16591
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
231 ValueNode result = parseAndInline("scanReverseLongEmptySnippet", BitScanReverseNode.class);
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
232 if (result != null) {
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
233 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 24, 64), result.stamp());
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
234 }
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
235 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
236
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
237 private ValueNode parseAndInline(String name) {
16591
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
238 return parseAndInline(name, null);
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
239 }
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
240
16618
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
241 /**
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
242 * Parse and optimize {@code name}. If {@code expectedClass} is non-null and a node of that type
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
243 * isn't found simply return null. Otherwise return the node returned by the graph.
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
244 *
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
245 * @param name
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
246 * @param expectedClass
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
247 * @return the returned value or null if {@code expectedClass} is not found in the graph.
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
248 */
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
249 private ValueNode parseAndInline(String name, Class<? extends ValueNode> expectedClass) {
19306
a0a760b0fb5f pulled method evolution dependencies out of Assumptions and directly into StructuredGraph
Doug Simon <doug.simon@oracle.com>
parents: 19250
diff changeset
250 StructuredGraph graph = parseEager(name, AllowAssumptions.YES);
19250
8ab925a6f724 made Assumptions be part of a StructuredGraph
Doug Simon <doug.simon@oracle.com>
parents: 18415
diff changeset
251 HighTierContext context = new HighTierContext(getProviders(), null, getDefaultGraphBuilderSuite(), OptimisticOptimizations.NONE);
19716
2fd45bb25118 Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 19410
diff changeset
252 CanonicalizerPhase canonicalizer = new CanonicalizerPhase();
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
253 canonicalizer.apply(graph, context);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
254 new InliningPhase(canonicalizer).apply(graph, context);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
255 canonicalizer.apply(graph, context);
19410
61d3cb8e1280 Add generic parameter to NodeClass. Change Graph#getNodes(Class) to Graph#getNodes(NodeClass).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 19306
diff changeset
256 Assert.assertEquals(1, graph.getNodes(ReturnNode.TYPE).count());
16618
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
257 if (expectedClass != null) {
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
258 if (graph.getNodes().filter(expectedClass).count() == 0) {
16591
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
259 return null;
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
260 }
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
261 }
19410
61d3cb8e1280 Add generic parameter to NodeClass. Change Graph#getNodes(Class) to Graph#getNodes(NodeClass).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 19306
diff changeset
262 return graph.getNodes(ReturnNode.TYPE).first().result();
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
263 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
264 }