changeset 21932:ba3759462502

Fix trip count of counted loops with stride > 1.
author Roland Schatz <roland.schatz@oracle.com>
date Fri, 12 Jun 2015 11:08:45 +0200
parents 40aff2bb1880
children 2a7f8723d5b2
files graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java
diffstat 1 files changed, 15 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java	Thu Jun 11 20:40:11 2015 -0700
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java	Fri Jun 12 11:08:45 2015 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -22,10 +22,6 @@
  */
 package com.oracle.graal.loop;
 
-import com.oracle.jvmci.code.CodeUtil;
-import com.oracle.jvmci.meta.DeoptimizationReason;
-import com.oracle.jvmci.meta.DeoptimizationAction;
-import com.oracle.jvmci.meta.JavaConstant;
 import static com.oracle.graal.loop.MathUtil.*;
 
 import com.oracle.graal.compiler.common.type.*;
@@ -33,6 +29,8 @@
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.extended.*;
+import com.oracle.jvmci.code.*;
+import com.oracle.jvmci.meta.*;
 
 public class CountedLoopInfo {
 
@@ -58,7 +56,18 @@
         StructuredGraph graph = iv.valueNode().graph();
         Stamp stamp = iv.valueNode().stamp();
         ValueNode range = sub(graph, end, iv.initNode());
-        if (oneOff) {
+        if (!iv.isConstantStride() || Math.abs(iv.constantStride()) != 1) {
+            ValueNode stride = iv.strideNode();
+            if (!oneOff) {
+                if (iv.direction() == Direction.Up) {
+                    stride = sub(graph, stride, ConstantNode.forIntegerStamp(stamp, 1, graph));
+                } else {
+                    assert iv.direction() == Direction.Down;
+                    stride = add(graph, stride, ConstantNode.forIntegerStamp(stamp, 1, graph));
+                }
+            }
+            range = add(graph, range, stride);
+        } else if (oneOff) {
             if (iv.direction() == Direction.Up) {
                 range = add(graph, range, ConstantNode.forIntegerStamp(stamp, 1, graph));
             } else {