Hi Rana,
On 1/25/07, Rana Dasgupta <[EMAIL PROTECTED]> wrote:
Hi,
For the jit guys, I have a somewhat (?) related question.
When looking at the jit logs for tight loops like:
for( indx = 0; indx < 1000; indx++)
{
afrom[indx] = afrom[indx + 1];
}
which is fairly common in Spec sequences, sorts, etc.....
there are of course three checks during the assignmnet ...null
check, type
check and bounds check. I wanted to make sure that for the above
pattern of
code, the type check was being optimized away. Though is is more
potent in
the jet compiler which I think calls a helper for this, I wanted to
check this in the opt compiler. I am quite new to jitrino's logs.
I have 2 comments here:
1) Let's avoid any optimizations in JET and leave it as simple as
possilble.
Reasons: a) all hotstops are Jitrino.OPT targets b) Jitrino.JET is
already ~
10 times faster then SUN interpreter.
2) I tried the method:
public static int foo6(String[] afrom) {
for( int indx = 0; indx < 1000; indx++) {
afrom[indx] = afrom[indx + 1];
}
return 0;
}
The complete IR is:
-------- irDump: Test::foo6 --------
Block ENTRY:
Predecessors:
Successors: L1
I0:--- MethodEntry(Test::foo6): ()
I4:defarg -) g1:cls:java/lang/String[]
I6:ldci4 #0 -) g3:int32
I7:stvar g3 -) v1:int32
GOTO L1
Block L1:
Predecessors: ENTRY L10
Successors: L3 L2
I1:L1:
I8:ldvar v1 -) t4:int32
I9:ldci4 #1000 -) t5:int32
I10:if cge.i4 t4, t5 goto L3
GOTO L2
Block L2:
Predecessors: L1
Successors: L8 UNWIND
I2:L2:
I11:ldci4 #1 -) t6:int32
I12:add t4, t6 -) t7:int32
I13:chknull g1 -) t8:tau
GOTO L8
Block L8:
Predecessors: L2
Successors: L9 UNWIND
I34:L8:
I14:tauhastype g1,cls:java/lang/String[] -) t9:tau
I15:arraylen g1 ((t8,t9)) -) t10:int32
I16:chkbounds t7 .lt. t10 -) t11:tau
GOTO L9
Block L9:
Predecessors: L8
Successors: L10 UNWIND
I35:L9:
I17:tauand t9, t11 -) t12:tau
I18:ldbase g1 -) t13:ref:cls:java/lang/String
I19:addindex t13, t7 -) t14:ref:cls:java/lang/String
I20:ldind.unc:str [t14] ((t8,t12)) -) t15:cls:java/lang/String
I21:chkbounds t4 .lt. t10 -) t16:tau
GOTO L10
Block UNWIND:
Predecessors: L2 L8 L9
Successors: EXIT
I32:L6:
GOTO EXIT
Block L10:
Predecessors: L9
Successors: L1
I36:L10:
I22:tauand t9, t16 -) t17:tau
I23:tauexacttype g1,cls:java/lang/String[] -) t18:tau
I24:addindex t13, t4 -) t19:ref:cls:java/lang/String
I25:stind.unc:str t15 ((t8,t17,t18)) -) [t19]
I26:stvar t7 -) v1:int32
GOTO L1
Block L3:
Predecessors: L1
Successors: RETURN
I3:L3:
I29:return g3
Block RETURN:
Predecessors: L3
Successors: EXIT
I31:L5:
GOTO EXIT
Block EXIT:
Predecessors: RETURN UNWIND
Successors:
I33:L7:
Loop exits are:
1) I10:if cge.i4 t4, t5 goto L3 -> bounds check->OK (a
candidate for
unroll optimization I'm finishing now)
2) I13:chknull g1 -) t8:tau -> checks that array is not NULL. The
optimization to move this check out of the loop is loop peeling
and it is
enabled only in server mode today. However if NullPointerException
is not
caught in the same method, Jitrino.OPT does not generate null-
checks and
hardware exception filter is used here.
3) I16:chkbounds t7 .lt. t10 -) t11:tau and
4) I21:chkbounds t4 .lt. t10 -) t16:tau are bounds checks for
[i], [i+1]
elements. I think it's ok too. We need these checks because loop
limit is
not arr.length but some number. May be abcd can help us here?