xref: /aosp_15_r20/art/test/526-long-regalloc/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker class Main {
main(String[] args)18*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) {
19*795d594fSAndroid Build Coastguard Worker     foo();
20*795d594fSAndroid Build Coastguard Worker   }
21*795d594fSAndroid Build Coastguard Worker 
foo()22*795d594fSAndroid Build Coastguard Worker   public static void foo() {
23*795d594fSAndroid Build Coastguard Worker     int a = myField1; // esi
24*795d594fSAndroid Build Coastguard Worker     int b = myField2; // edi
25*795d594fSAndroid Build Coastguard Worker     $noinline$bar(); // makes allocation of a and b to be callee-save registers
26*795d594fSAndroid Build Coastguard Worker     int c = myField3; // ecx
27*795d594fSAndroid Build Coastguard Worker     int e = myField4; // ebx
28*795d594fSAndroid Build Coastguard Worker     int f = myField5; // edx
29*795d594fSAndroid Build Coastguard Worker     long d = a == 42 ? myLongField1 : 42L; // Will call AllocateBlockedReg -> edx/ebx
30*795d594fSAndroid Build Coastguard Worker 
31*795d594fSAndroid Build Coastguard Worker     // At this point, the register allocator used to be in a bogus state, where the low
32*795d594fSAndroid Build Coastguard Worker     // part of the interval was in the active set, but not the high part.
33*795d594fSAndroid Build Coastguard Worker 
34*795d594fSAndroid Build Coastguard Worker     long i = myLongField1; // Will call TrySplitNonPairOrUnalignedPairIntervalAt -> Failing DCHECK
35*795d594fSAndroid Build Coastguard Worker 
36*795d594fSAndroid Build Coastguard Worker     // Use esi and edi first to not have d allocated to them.
37*795d594fSAndroid Build Coastguard Worker     myField2 = a;
38*795d594fSAndroid Build Coastguard Worker     myField3 = b;
39*795d594fSAndroid Build Coastguard Worker 
40*795d594fSAndroid Build Coastguard Worker     // The following sequence of instructions are making the AllocateBlockedReg call
41*795d594fSAndroid Build Coastguard Worker     // for allocating the d variable misbehave: allocation of the low interval would split
42*795d594fSAndroid Build Coastguard Worker     // both low and high interval at the fixed use; therefore the allocation of the high interval
43*795d594fSAndroid Build Coastguard Worker     // would not see the register use, and think the interval can just be spilled and not be
44*795d594fSAndroid Build Coastguard Worker     // put in the active set, even though it is holding a register.
45*795d594fSAndroid Build Coastguard Worker     myField1 = (int)d; // stack use
46*795d594fSAndroid Build Coastguard Worker     myLongField3 = (long) myField2; // edx fixed use
47*795d594fSAndroid Build Coastguard Worker     myLongField2 = d; // register use
48*795d594fSAndroid Build Coastguard Worker 
49*795d594fSAndroid Build Coastguard Worker     // Ensure the HInstruction mapping to i, c, e, and f have a live range.
50*795d594fSAndroid Build Coastguard Worker     myLongField1 = i;
51*795d594fSAndroid Build Coastguard Worker     myField4 = c;
52*795d594fSAndroid Build Coastguard Worker     myField5 = e;
53*795d594fSAndroid Build Coastguard Worker     myField6 = f;
54*795d594fSAndroid Build Coastguard Worker   }
55*795d594fSAndroid Build Coastguard Worker 
$noinline$bar()56*795d594fSAndroid Build Coastguard Worker   public static long $noinline$bar() {
57*795d594fSAndroid Build Coastguard Worker     return 42;
58*795d594fSAndroid Build Coastguard Worker   }
59*795d594fSAndroid Build Coastguard Worker 
60*795d594fSAndroid Build Coastguard Worker   public static int myField1 = 0;
61*795d594fSAndroid Build Coastguard Worker   public static int myField2 = 0;
62*795d594fSAndroid Build Coastguard Worker   public static int myField3 = 0;
63*795d594fSAndroid Build Coastguard Worker   public static int myField4 = 0;
64*795d594fSAndroid Build Coastguard Worker   public static int myField5 = 0;
65*795d594fSAndroid Build Coastguard Worker   public static int myField6 = 0;
66*795d594fSAndroid Build Coastguard Worker   public static long myLongField1 = 0L;
67*795d594fSAndroid Build Coastguard Worker   public static long myLongField2 = 0L;
68*795d594fSAndroid Build Coastguard Worker   public static long myLongField3 = 0L;
69*795d594fSAndroid Build Coastguard Worker }
70