1 /*
   2  * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 
  25 package org.graalvm.compiler.core.test;
  26 
  27 import org.graalvm.compiler.debug.DebugContext;
  28 import org.graalvm.compiler.nodes.StructuredGraph;
  29 import org.graalvm.compiler.nodes.ValueNode;
  30 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
  31 import org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin;
  32 import org.graalvm.compiler.phases.common.CanonicalizerPhase;
  33 import org.graalvm.compiler.phases.tiers.PhaseContext;
  34 import org.junit.Test;
  35 
  36 import jdk.vm.ci.meta.ResolvedJavaMethod;
  37 
  38 public class ConditionalEliminationTest13 extends ConditionalEliminationTestBase {
  39 
  40     @Override
  41     protected InlineInvokePlugin.InlineInfo bytecodeParserShouldInlineInvoke(GraphBuilderContext b, ResolvedJavaMethod method, ValueNode[] args) {
  42         return InlineInvokePlugin.InlineInfo.createStandardInlineInfo(method);
  43     }
  44 
  45     public static void referenceSnippet1(int a) {
  46         if (Integer.compareUnsigned(a, a + 1) < 0) {
  47             sink1 = 0;
  48         } else {
  49             sink0 = -1;
  50         }
  51     }
  52 
  53     public static void testSnippet1(int a) {
  54         if (Integer.compareUnsigned(a, a + 1) < 0 || a == 0) {
  55             sink1 = 0;
  56         } else {
  57             sink0 = -1;
  58         }
  59     }
  60 
  61     public static void referenceSnippet2(int a) {
  62         if (0 < a) {
  63             sink1 = 0;
  64         }
  65         sink0 = -1;
  66     }
  67 
  68     public static void testSnippet2(int a) {
  69         if (0 < a) {
  70             if (a == -1) {
  71                 sink2 = -2;
  72             }
  73             sink1 = 0;
  74         }
  75         sink0 = -1;
  76     }
  77 
  78     public static void testSnippet3(int a) {
  79         if (0 < a) {
  80             if (a == 1) {
  81                 sink2 = -2;
  82             }
  83             sink1 = 0;
  84         }
  85         sink0 = -1;
  86     }
  87 
  88     @SuppressWarnings("unused")
  89     public static void referenceSnippet4(int a) {
  90         sink1 = 0;
  91     }
  92 
  93     public static void testSnippet4(int a) {
  94         if (Integer.compareUnsigned(a - 1, a) < 0 || a == 0) {
  95             sink1 = 0;
  96         } else {
  97             sink0 = -1;
  98         }
  99     }
 100 
 101     public static void testSnippet5(int a) {
 102         if (a < 0) {
 103             if (a == -1) {
 104                 sink2 = -2;
 105             }
 106             sink1 = 0;
 107         }
 108         sink0 = -1;
 109     }
 110 
 111     public static void referenceSnippet6(int a) {
 112         if (a < 0) {
 113             sink1 = 0;
 114         }
 115         sink0 = -1;
 116     }
 117 
 118     public static void testSnippet6(int a) {
 119         if (a < 0) {
 120             if (a == 0) {
 121                 sink2 = -2;
 122             }
 123             sink1 = 0;
 124         }
 125         sink0 = -1;
 126     }
 127 
 128     public static void testSnippet7(int a) {
 129         if (0 < a) {
 130             if (a == 0) {
 131                 sink2 = -2;
 132             }
 133             sink1 = 0;
 134         }
 135         sink0 = -1;
 136     }
 137 
 138     public static void testSnippet8(int a) {
 139         if (Integer.compareUnsigned(a, a + 1) < 0 || a == 0xffff_ffff) {
 140             sink1 = 0;
 141         } else {
 142             sink0 = -1;
 143         }
 144     }
 145 
 146     public static void referenceSnippet9(int a) {
 147         if (Integer.compareUnsigned(a - 1, a) < 0) {
 148             sink1 = 0;
 149         } else {
 150             sink0 = -1;
 151         }
 152     }
 153 
 154     public static void testSnippet9(int a) {
 155         if (Integer.compareUnsigned(a - 1, a) < 0 || a == 0xffff_ffff) {
 156             sink1 = 0;
 157         } else {
 158             sink0 = -1;
 159         }
 160     }
 161 
 162     private static int either(int a, int b) {
 163         return (sink0 + sink1 + sink2) == 0 ? a : b;
 164     }
 165 
 166     public static void testSnippet10(int a) {
 167         if (Integer.compareUnsigned(a, a + either(1, 2)) < 0 || a == 0xffff_ffff || a == 0xffff_fffe) {
 168             sink1 = 0;
 169         } else {
 170             sink0 = -1;
 171         }
 172     }
 173 
 174     public static void referenceSnippet11(int a) {
 175         if (Integer.compareUnsigned(a, Integer.MAX_VALUE + 1) > 0) {
 176             sink1 = 0;
 177         }
 178         sink0 = -1;
 179     }
 180 
 181     public static void testSnippet11(int a) {
 182         if (Integer.compareUnsigned(a, Integer.MAX_VALUE + 1) > 0) {
 183             if (Integer.compareUnsigned(a, 42) <= 0) {
 184                 sink2 = -2;
 185             }
 186             sink1 = 0;
 187         }
 188         sink0 = -1;
 189     }
 190 
 191     public static void referenceSnippet12(int a) {
 192         if (Integer.compareUnsigned(a, 0xffff_ffff) >= 0) {
 193             sink1 = 0;
 194         } else {
 195             sink0 = -1;
 196         }
 197     }
 198 
 199     public static void testSnippet12(int a) {
 200         if (Integer.compareUnsigned(a, 0xffff_ffff) >= 0 && a == 0xffff_ffff) {
 201             sink1 = 0;
 202         } else {
 203             sink0 = -1;
 204         }
 205     }
 206 
 207     public static void testSnippet13(int a) {
 208         int x = either(0, 1);
 209         if (a <= a + x) {
 210             if (a == Integer.MAX_VALUE) {
 211                 sink2 = -2;
 212             }
 213             sink1 = 0;
 214         } else {
 215             sink0 = -1;
 216         }
 217     }
 218 
 219     public static void referenceSnippet14(int a) {
 220         int x = either(0, 1);
 221         if (a < a + x) {
 222             sink1 = 0;
 223         } else {
 224             sink0 = -1;
 225         }
 226     }
 227 
 228     public static void testSnippet14(int a) {
 229         int x = either(0, 1);
 230         if (a < a + x) {
 231             if (a == Integer.MAX_VALUE) {
 232                 sink2 = -2;
 233             }
 234             sink1 = 0;
 235         } else {
 236             sink0 = -1;
 237         }
 238     }
 239 
 240     @Test
 241     public void test1() {
 242         testConditionalElimination("testSnippet1", "referenceSnippet1");
 243     }
 244 
 245     @Test
 246     public void test2() {
 247         testConditionalElimination("testSnippet2", "referenceSnippet2");
 248     }
 249 
 250     @Test
 251     public void test3() {
 252         testConditionalElimination("testSnippet3", "testSnippet3");
 253     }
 254 
 255     @Test
 256     public void test4() {
 257         testConditionalElimination("testSnippet4", "referenceSnippet4");
 258     }
 259 
 260     @Test
 261     public void test5() {
 262         testConditionalElimination("testSnippet5", "testSnippet5");
 263     }
 264 
 265     @Test
 266     public void test6() {
 267         testConditionalElimination("testSnippet6", "referenceSnippet6");
 268     }
 269 
 270     @Test
 271     public void test7() {
 272         testConditionalElimination("testSnippet7", "referenceSnippet2");
 273     }
 274 
 275     @Test
 276     public void test8() {
 277         testConditionalElimination("testSnippet8", "referenceSnippet4");
 278     }
 279 
 280     @Test
 281     public void test9() {
 282         testConditionalElimination("testSnippet9", "referenceSnippet9");
 283     }
 284 
 285     @Test
 286     public void test10() {
 287         testConditionalElimination("testSnippet10", "referenceSnippet4");
 288     }
 289 
 290     @Test
 291     public void test11() {
 292         testConditionalElimination("testSnippet11", "referenceSnippet11");
 293     }
 294 
 295     @Test
 296     public void test12() {
 297         testConditionalElimination("testSnippet12", "referenceSnippet12");
 298     }
 299 
 300     @Test
 301     public void test13() {
 302         testConditionalElimination("testSnippet13", "testSnippet13");
 303     }
 304 
 305     @Test
 306     public void test14() {
 307         testConditionalElimination("testSnippet14", "referenceSnippet14");
 308     }
 309 
 310     @Override
 311     protected void prepareGraph(StructuredGraph graph, CanonicalizerPhase canonicalizer, PhaseContext context, boolean applyLowering) {
 312         super.prepareGraph(graph, canonicalizer, context, applyLowering);
 313         graph.clearAllStateAfter();
 314         graph.setGuardsStage(StructuredGraph.GuardsStage.AFTER_FSA);
 315         DebugContext debug = graph.getDebug();
 316         debug.dump(DebugContext.BASIC_LEVEL, graph, "After preparation");
 317         canonicalizer.apply(graph, context);
 318     }
 319 }