void Mir2Lir::CopyRegInfo(int new_reg, int old_reg) {
RegisterInfo* new_info = GetRegInfo(new_reg);
RegisterInfo* old_info = GetRegInfo(old_reg);
- // Target temp status must not change
+ // Target temp, live, dirty status must not change
bool is_temp = new_info->is_temp;
+ bool live = new_info->live;
+ bool dirty = new_info->dirty;
*new_info = *old_info;
- // Restore target's temp status
+ // Restore target's temp, live, dirty status
new_info->is_temp = is_temp;
+ new_info->live = live;
+ new_info->dirty = dirty;
new_info->reg = new_reg;
}
MirOpSelectTests.testIfCcz();
ManyFloatArgs();
atomicLong();
+ LiveFlags.test();
}
public static void atomicLong() {
}
}
}
+
+class LiveFlags {
+ private static void show_results(double a[], double b[], int trip) {
+ if ((a[0]+a[1]+b[0]+b[1]) == 0) {
+ System.out.println("LiveFlags passes trip " + trip);
+ } else {
+ System.out.println("LiveFlags fails trip " + trip);
+ System.out.println("a[0] = " + a[0] + " a[1] = " + a[1]);
+ System.out.println("b[0] = " + b[0] + " b[1] = " + b[1]);
+ }
+ }
+ static void test()
+ {
+ final double A[] = new double[2];
+ final double B[] = new double[2];
+ final double C[] = new double[2];
+ B[0] = B[1] = 0.0;
+ A[0] = A[1] = 0.0;
+ C[0] = C[1] = 0.0;
+ for (int i = 3; i >= 1; i--) {
+ if ( (i & 1) == 0) {
+ continue;
+ }
+ if ( (i & 2) != 0 ) {
+ B[1] = -B[1];
+ }
+ show_results(A, B, i);
+ A[0] = C[0]; A[1] = C[1];
+ }
+ }
+}