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]