1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 public class Main { 18 19 static class Foo { 20 int field0; 21 int field1; 22 int field2; 23 int field3; 24 int field4; 25 }; 26 27 /// CHECK-START: void Main.test1(boolean, int, int, int, int, int) register (after) 28 /// CHECK: name "B0" 29 /// CHECK-NOT: ParallelMove 30 /// CHECK: name "B1" 31 /// CHECK-NOT: end_block 32 /// CHECK: If 33 /// CHECK-NOT: ParallelMove 34 /// CHECK: name "B3" 35 /// CHECK-NOT: end_block 36 /// CHECK: InstanceFieldSet 37 // We could check here that there is a parallel move, but it's only valid 38 // for some architectures (for example x86), as other architectures may 39 // not do move at all. 40 /// CHECK: end_block 41 /// CHECK-NOT: ParallelMove 42 test1(boolean z, int a, int b, int c, int d, int m)43 public static void test1(boolean z, int a, int b, int c, int d, int m) { 44 int e = live1; 45 int f = live2; 46 int g = live3; 47 int j = live0; 48 if (z) { 49 } else { 50 // Create enough live instructions to force spilling on x86. 51 int h = live4; 52 int i = live5; 53 foo.field2 = e + i + h; 54 foo.field3 = f + i + h; 55 foo.field4 = g + i + h; 56 foo.field0 = h; 57 foo.field1 = i + h; 58 } 59 live1 = e + f + g + j; 60 } 61 62 /// CHECK-START: void Main.test2(boolean, int, int, int, int, int) register (after) 63 /// CHECK: name "B0" 64 /// CHECK-NOT: ParallelMove 65 /// CHECK: name "B1" 66 /// CHECK-NOT: end_block 67 /// CHECK: If 68 /// CHECK-NOT: ParallelMove 69 /// CHECK: name "B3" 70 /// CHECK-NOT: end_block 71 /// CHECK: InstanceFieldSet 72 // We could check here that there is a parallel move, but it's only valid 73 // for some architectures (for example x86), as other architectures may 74 // not do move at all. 75 /// CHECK: end_block 76 /// CHECK-NOT: ParallelMove 77 test2(boolean z, int a, int b, int c, int d, int m)78 public static void test2(boolean z, int a, int b, int c, int d, int m) { 79 int e = live1; 80 int f = live2; 81 int g = live3; 82 int j = live0; 83 if (z) { 84 if (y) { 85 int h = live4; 86 int i = live5; 87 foo.field2 = e + i + h; 88 foo.field3 = f + i + h; 89 foo.field4 = g + i + h; 90 foo.field0 = h; 91 foo.field1 = i + h; 92 } 93 } 94 live1 = e + f + g + j; 95 } 96 97 /// CHECK-START: void Main.test3(boolean, int, int, int, int, int) register (after) 98 /// CHECK: name "B0" 99 /// CHECK-NOT: ParallelMove 100 /// CHECK: name "B1" test3(boolean z, int a, int b, int c, int d, int m)101 public static void test3(boolean z, int a, int b, int c, int d, int m) { 102 // Same version as test2, but with branches reversed, to ensure 103 // whatever linear order is computed, we will get the same results. 104 int e = live1; 105 int f = live2; 106 int g = live3; 107 int j = live0; 108 if (z) { 109 live1 = e; 110 } else { 111 if (y) { 112 live1 = e; 113 } else { 114 int h = live4; 115 int i = live5; 116 foo.field2 = e + i + h; 117 foo.field3 = f + i + h; 118 foo.field4 = g + i + h; 119 foo.field0 = h; 120 foo.field1 = i + h; 121 } 122 } 123 live1 = e + f + g + j; 124 } 125 main(String[] args)126 public static void main(String[] args) { 127 } 128 129 static boolean y; 130 static int live0; 131 static int live1; 132 static int live2; 133 static int live3; 134 static int live4; 135 static int live5; 136 static Foo foo; 137 } 138