Fix min/max SIMD reduction

Use HVecReplicateScalar instead of HVecSetScalars when creating an
initial vector for min/max. This way we are preventing that zeroes
from the initial vector are taken into account for min/max
calculations. Otherwise, min(MAX_INT, x[0],.., x[n-1]) = 0 if each
x[i] is positive which is incorrect.

Added regression test cases in 661-checker-simd-reduc.

Test: ./testrunner.py --target --optimizing in QEMU (arm64)

Change-Id: I1779eefc7f2ab9971dec561b2e1fbf262652410e
diff --git a/compiler/optimizing/loop_optimization.cc b/compiler/optimizing/loop_optimization.cc
index 645915e..69c6b94 100644
--- a/compiler/optimizing/loop_optimization.cc
+++ b/compiler/optimizing/loop_optimization.cc
@@ -1623,17 +1623,28 @@
   }
   // Prepare the new initialization.
   if (vector_mode_ == kVector) {
-    // Generate a [initial, 0, .., 0] vector.
+    // Generate a [initial, 0, .., 0] vector for add or
+    // a [initial, initial, .., initial] vector for min/max.
     HVecOperation* red_vector = new_red->AsVecOperation();
+    HVecReduce::ReductionKind kind = GetReductionKind(red_vector);
     size_t vector_length = red_vector->GetVectorLength();
     DataType::Type type = red_vector->GetPackedType();
-    new_init = Insert(vector_preheader_,
-                      new (global_allocator_) HVecSetScalars(global_allocator_,
-                                                             &new_init,
-                                                             type,
-                                                             vector_length,
-                                                             1,
-                                                             kNoDexPc));
+    if (kind == HVecReduce::ReductionKind::kSum) {
+      new_init = Insert(vector_preheader_,
+                        new (global_allocator_) HVecSetScalars(global_allocator_,
+                                                               &new_init,
+                                                               type,
+                                                               vector_length,
+                                                               1,
+                                                               kNoDexPc));
+    } else {
+      new_init = Insert(vector_preheader_,
+                        new (global_allocator_) HVecReplicateScalar(global_allocator_,
+                                                                    new_init,
+                                                                    type,
+                                                                    vector_length,
+                                                                    kNoDexPc));
+    }
   } else {
     new_init = ReduceAndExtractIfNeeded(new_init);
   }