Github user mengxr commented on the pull request:

    https://github.com/apache/spark/pull/6137#issuecomment-101916289
  
    Thanks for the discussion! I checked the bytecode and confirmed that there 
are extra calls. This is the test Scala code:
    
    ~~~scala
    class A {
    
      val b = Array(1.0, 2.0)
    
      private[this] val c = Array(1.0, 2.0)
    
      def f1() {
        val a = Array(1.0, 2.0)
        var i = 0
        while (i < a.length) {
          a(i) += 1
          i += 1
        }
      }
    
      def f2() {
        val a = Array(1.0, 2.0)
        var i = 0
        val n = a.length
        while (i < n) {
          a(i) += 1
          i += 1
        }
      }
    
      def f3() {
        var i = 0
        while (i < b.length) {
          b(i) += 1
          i + 1
        }
      }
    
      def f4() {
        val localB = b
        var i = 0
        while (i < localB.length) {
          localB(i) += 1
          i + 1
        }
      }
    
      def f5() {
        var i = 0
        while (i < c.length) {
          c(i) += 1
          i += 1
        }
      }
    
      def f6() {
        var i = 0
        val n = c.length
        while (i < n) {
          c(i) += 1
          i += 1
        }
      }
    
      def f7() {
        val localC = c
        var i = 0
        val n = localC.length
        while (i < n) {
          localC(i) += 1
          i += 1
        }
      }
    }
    ~~~
    
    and this is the bytecode
    
    ~~~
      public void f1();
        Code:
           0: iconst_2
           1: newarray       double
           3: dup
           4: iconst_0
           5: dconst_1
           6: dastore
           7: dup
           8: iconst_1
           9: ldc2_w        #19                 // double 2.0d
          12: dastore
          13: astore_1
          14: iconst_0
          15: istore_2
          16: iload_2
          17: aload_1
          18: arraylength
          19: if_icmpge     40
          22: iload_2
          23: istore_3
          24: aload_1
          25: iload_3
          26: aload_1
          27: iload_3
          28: daload
          29: iconst_1
          30: i2d
          31: dadd
          32: dastore
          33: iload_2
          34: iconst_1
          35: iadd
          36: istore_2
          37: goto          16
          40: return
    
      public void f2();
        Code:
           0: iconst_2
           1: newarray       double
           3: dup
           4: iconst_0
           5: dconst_1
           6: dastore
           7: dup
           8: iconst_1
           9: ldc2_w        #19                 // double 2.0d
          12: dastore
          13: astore_1
          14: iconst_0
          15: istore_2
          16: aload_1
          17: arraylength
          18: istore_3
          19: iload_2
          20: iload_3
          21: if_icmpge     45
          24: iload_2
          25: istore        4
          27: aload_1
          28: iload         4
          30: aload_1
          31: iload         4
          33: daload
          34: iconst_1
          35: i2d
          36: dadd
          37: dastore
          38: iload_2
          39: iconst_1
          40: iadd
          41: istore_2
          42: goto          19
          45: return
    
      public void f3();
        Code:
           0: iconst_0
           1: istore_1
           2: iload_1
           3: aload_0
           4: invokevirtual #29                 // Method b:()[D
           7: arraylength
           8: if_icmpge     35
          11: iload_1
          12: istore_2
          13: aload_0
          14: invokevirtual #29                 // Method b:()[D
          17: iload_2
          18: aload_0
          19: invokevirtual #29                 // Method b:()[D
          22: iload_2
          23: daload
          24: iconst_1
          25: i2d
          26: dadd
          27: dastore
          28: iload_1
          29: iconst_1
          30: iadd
          31: pop
          32: goto          2
          35: return
    
      public void f4();
        Code:
           0: aload_0
           1: invokevirtual #29                 // Method b:()[D
           4: astore_1
           5: iconst_0
           6: istore_2
           7: iload_2
           8: aload_1
           9: arraylength
          10: if_icmpge     31
          13: iload_2
          14: istore_3
          15: aload_1
          16: iload_3
          17: aload_1
          18: iload_3
          19: daload
          20: iconst_1
          21: i2d
          22: dadd
          23: dastore
          24: iload_2
          25: iconst_1
          26: iadd
          27: pop
          28: goto          7
          31: return
    
      public void f5();
        Code:
           0: iconst_0
           1: istore_1
           2: iload_1
           3: aload_0
           4: getfield      #34                 // Field c:[D
           7: arraylength
           8: if_icmpge     35
          11: iload_1
          12: istore_2
          13: aload_0
          14: getfield      #34                 // Field c:[D
          17: iload_2
          18: aload_0
          19: getfield      #34                 // Field c:[D
          22: iload_2
          23: daload
          24: iconst_1
          25: i2d
          26: dadd
          27: dastore
          28: iload_1
          29: iconst_1
          30: iadd
          31: istore_1
          32: goto          2
          35: return
    
      public void f6();
        Code:
           0: iconst_0
           1: istore_1
           2: aload_0
           3: getfield      #34                 // Field c:[D
           6: arraylength
           7: istore_2
           8: iload_1
           9: iload_2
          10: if_icmpge     37
          13: iload_1
          14: istore_3
          15: aload_0
          16: getfield      #34                 // Field c:[D
          19: iload_3
          20: aload_0
          21: getfield      #34                 // Field c:[D
          24: iload_3
          25: daload
          26: iconst_1
          27: i2d
          28: dadd
          29: dastore
          30: iload_1
          31: iconst_1
          32: iadd
          33: istore_1
          34: goto          8
          37: return
    
      public void f7();
        Code:
           0: aload_0
           1: getfield      #34                 // Field c:[D
           4: astore_1
           5: iconst_0
           6: istore_2
           7: aload_1
           8: arraylength
           9: istore_3
          10: iload_2
          11: iload_3
          12: if_icmpge     36
          15: iload_2
          16: istore        4
          18: aload_1
          19: iload         4
          21: aload_1
          22: iload         4
          24: daload
          25: iconst_1
          26: i2d
          27: dadd
          28: dastore
          29: iload_2
          30: iconst_1
          31: iadd
          32: istore_2
          33: goto          10
          36: return
    ~~~


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to