diff --git a/compiler/optimizing/nodes_vector_test.cc b/compiler/optimizing/nodes_vector_test.cc
index ab9d759..af13449 100644
--- a/compiler/optimizing/nodes_vector_test.cc
+++ b/compiler/optimizing/nodes_vector_test.cc
@@ -282,143 +282,53 @@
   EXPECT_FALSE(v0->Equals(v1));  // no longer equal
 }
 
-TEST_F(NodesVectorTest, VectorSignMattersOnMin) {
-  HVecOperation* p0 = new (GetAllocator())
-      HVecReplicateScalar(GetAllocator(), int32_parameter_, DataType::Type::kInt32, 4, kNoDexPc);
-  HVecOperation* p1 = new (GetAllocator())
-      HVecReplicateScalar(GetAllocator(), int8_parameter_, DataType::Type::kInt8, 4, kNoDexPc);
-  HVecOperation* p2 = new (GetAllocator())
-      HVecReplicateScalar(GetAllocator(), int16_parameter_, DataType::Type::kInt16, 4, kNoDexPc);
-
-  HVecMin* v0 = new (GetAllocator()) HVecMin(
-      GetAllocator(), p0, p0, DataType::Type::kInt32, 4, /*is_unsigned*/ true, kNoDexPc);
-  HVecMin* v1 = new (GetAllocator()) HVecMin(
-      GetAllocator(), p0, p0, DataType::Type::kInt32, 4, /*is_unsigned*/ false, kNoDexPc);
-  HVecMin* v2 = new (GetAllocator()) HVecMin(
-      GetAllocator(), p0, p0, DataType::Type::kInt32, 2, /*is_unsigned*/ true, kNoDexPc);
-  HVecMin* v3 = new (GetAllocator()) HVecMin(
-      GetAllocator(), p1, p1, DataType::Type::kUint8, 16, /*is_unsigned*/ false, kNoDexPc);
-  HVecMin* v4 = new (GetAllocator()) HVecMin(
-      GetAllocator(), p1, p1, DataType::Type::kInt8, 16, /*is_unsigned*/ false, kNoDexPc);
-  HVecMin* v5 = new (GetAllocator()) HVecMin(
-      GetAllocator(), p2, p2, DataType::Type::kUint16, 8, /*is_unsigned*/ false, kNoDexPc);
-  HVecMin* v6 = new (GetAllocator()) HVecMin(
-      GetAllocator(), p2, p2, DataType::Type::kInt16, 8, /*is_unsigned*/ false, kNoDexPc);
-  HVecMin* min_insns[] = { v0, v1, v2, v3, v4, v5, v6 };
-
-  EXPECT_FALSE(p0->CanBeMoved());
-  EXPECT_FALSE(p1->CanBeMoved());
-  EXPECT_FALSE(p2->CanBeMoved());
-
-  for (HVecMin* min_insn : min_insns) {
-    EXPECT_TRUE(min_insn->CanBeMoved());
-  }
-
-  // Deprecated; IsUnsigned() should be removed with the introduction of Uint32 and Uint64.
-  EXPECT_TRUE(v0->IsUnsigned());
-  EXPECT_FALSE(v1->IsUnsigned());
-  EXPECT_TRUE(v2->IsUnsigned());
-
-  for (HVecMin* min_insn1 : min_insns) {
-    for (HVecMin* min_insn2 : min_insns) {
-      EXPECT_EQ(min_insn1 == min_insn2, min_insn1->Equals(min_insn2));
-    }
-  }
-}
-
-TEST_F(NodesVectorTest, VectorSignMattersOnMax) {
-  HVecOperation* p0 = new (GetAllocator())
-      HVecReplicateScalar(GetAllocator(), int32_parameter_, DataType::Type::kInt32, 4, kNoDexPc);
-  HVecOperation* p1 = new (GetAllocator())
-      HVecReplicateScalar(GetAllocator(), int8_parameter_, DataType::Type::kInt8, 4, kNoDexPc);
-  HVecOperation* p2 = new (GetAllocator())
-      HVecReplicateScalar(GetAllocator(), int16_parameter_, DataType::Type::kInt16, 4, kNoDexPc);
-
-  HVecMax* v0 = new (GetAllocator()) HVecMax(
-      GetAllocator(), p0, p0, DataType::Type::kInt32, 4, /*is_unsigned*/ true, kNoDexPc);
-  HVecMax* v1 = new (GetAllocator()) HVecMax(
-      GetAllocator(), p0, p0, DataType::Type::kInt32, 4, /*is_unsigned*/ false, kNoDexPc);
-  HVecMax* v2 = new (GetAllocator()) HVecMax(
-      GetAllocator(), p0, p0, DataType::Type::kInt32, 2, /*is_unsigned*/ true, kNoDexPc);
-  HVecMax* v3 = new (GetAllocator()) HVecMax(
-      GetAllocator(), p1, p1, DataType::Type::kUint8, 16, /*is_unsigned*/ false, kNoDexPc);
-  HVecMax* v4 = new (GetAllocator()) HVecMax(
-      GetAllocator(), p1, p1, DataType::Type::kInt8, 16, /*is_unsigned*/ false, kNoDexPc);
-  HVecMax* v5 = new (GetAllocator()) HVecMax(
-      GetAllocator(), p2, p2, DataType::Type::kUint16, 8, /*is_unsigned*/ false, kNoDexPc);
-  HVecMax* v6 = new (GetAllocator()) HVecMax(
-      GetAllocator(), p2, p2, DataType::Type::kInt16, 8, /*is_unsigned*/ false, kNoDexPc);
-  HVecMax* max_insns[] = { v0, v1, v2, v3, v4, v5, v6 };
-
-  EXPECT_FALSE(p0->CanBeMoved());
-  EXPECT_FALSE(p1->CanBeMoved());
-  EXPECT_FALSE(p2->CanBeMoved());
-
-  for (HVecMax* max_insn : max_insns) {
-    EXPECT_TRUE(max_insn->CanBeMoved());
-  }
-
-  // Deprecated; IsUnsigned() should be removed with the introduction of Uint32 and Uint64.
-  EXPECT_TRUE(v0->IsUnsigned());
-  EXPECT_FALSE(v1->IsUnsigned());
-  EXPECT_TRUE(v2->IsUnsigned());
-
-  for (HVecMax* max_insn1 : max_insns) {
-    for (HVecMax* max_insn2 : max_insns) {
-      EXPECT_EQ(max_insn1 == max_insn2, max_insn1->Equals(max_insn2));
-    }
-  }
-}
-
 TEST_F(NodesVectorTest, VectorAttributesMatterOnHalvingAdd) {
+  HVecOperation* u0 = new (GetAllocator())
+      HVecReplicateScalar(GetAllocator(), int32_parameter_, DataType::Type::kUint32, 4, kNoDexPc);
+  HVecOperation* u1 = new (GetAllocator())
+      HVecReplicateScalar(GetAllocator(), int16_parameter_, DataType::Type::kUint16, 8, kNoDexPc);
+  HVecOperation* u2 = new (GetAllocator())
+      HVecReplicateScalar(GetAllocator(), int8_parameter_, DataType::Type::kUint8, 16, kNoDexPc);
+
   HVecOperation* p0 = new (GetAllocator())
       HVecReplicateScalar(GetAllocator(), int32_parameter_, DataType::Type::kInt32, 4, kNoDexPc);
   HVecOperation* p1 = new (GetAllocator())
-      HVecReplicateScalar(GetAllocator(), int8_parameter_, DataType::Type::kInt8, 4, kNoDexPc);
+      HVecReplicateScalar(GetAllocator(), int16_parameter_, DataType::Type::kInt16, 8, kNoDexPc);
   HVecOperation* p2 = new (GetAllocator())
-      HVecReplicateScalar(GetAllocator(), int16_parameter_, DataType::Type::kInt16, 4, kNoDexPc);
+      HVecReplicateScalar(GetAllocator(), int8_parameter_, DataType::Type::kInt8, 16, kNoDexPc);
 
   HVecHalvingAdd* v0 = new (GetAllocator()) HVecHalvingAdd(
-      GetAllocator(), p0, p0, DataType::Type::kInt32, 4,
-      /*is_rounded*/ true, /*is_unsigned*/ true, kNoDexPc);
+      GetAllocator(), u0, u0, DataType::Type::kUint32, 4, /*is_rounded*/ true, kNoDexPc);
   HVecHalvingAdd* v1 = new (GetAllocator()) HVecHalvingAdd(
-      GetAllocator(), p0, p0, DataType::Type::kInt32, 4,
-      /*is_rounded*/ false, /*is_unsigned*/ true, kNoDexPc);
+      GetAllocator(), u0, u0, DataType::Type::kUint32, 4, /*is_rounded*/ false, kNoDexPc);
   HVecHalvingAdd* v2 = new (GetAllocator()) HVecHalvingAdd(
-      GetAllocator(), p0, p0, DataType::Type::kInt32, 4,
-      /*is_rounded*/ true, /*is_unsigned*/ false, kNoDexPc);
+      GetAllocator(), p0, p0, DataType::Type::kInt32, 4, /*is_rounded*/ true, kNoDexPc);
   HVecHalvingAdd* v3 = new (GetAllocator()) HVecHalvingAdd(
-      GetAllocator(), p0, p0, DataType::Type::kInt32, 4,
-      /*is_rounded*/ false, /*is_unsigned*/ false, kNoDexPc);
-  HVecHalvingAdd* v4 = new (GetAllocator()) HVecHalvingAdd(
-      GetAllocator(), p0, p0, DataType::Type::kInt32, 2,
-      /*is_rounded*/ true, /*is_unsigned*/ true, kNoDexPc);
-  HVecHalvingAdd* v5 = new (GetAllocator()) HVecHalvingAdd(
-      GetAllocator(), p1, p1, DataType::Type::kUint8, 16,
-      /*is_rounded*/ true, /*is_unsigned*/ false, kNoDexPc);
-  HVecHalvingAdd* v6 = new (GetAllocator()) HVecHalvingAdd(
-      GetAllocator(), p1, p1, DataType::Type::kUint8, 16,
-      /*is_rounded*/ false, /*is_unsigned*/ false, kNoDexPc);
-  HVecHalvingAdd* v7 = new (GetAllocator()) HVecHalvingAdd(
-      GetAllocator(), p1, p1, DataType::Type::kInt8, 16,
-      /*is_rounded*/ true, /*is_unsigned*/ false, kNoDexPc);
-  HVecHalvingAdd* v8 = new (GetAllocator()) HVecHalvingAdd(
-      GetAllocator(), p1, p1, DataType::Type::kInt8, 16,
-      /*is_rounded*/ false, /*is_unsigned*/ false, kNoDexPc);
-  HVecHalvingAdd* v9 = new (GetAllocator()) HVecHalvingAdd(
-      GetAllocator(), p2, p2, DataType::Type::kUint16, 8,
-      /*is_rounded*/ true, /*is_unsigned*/ false, kNoDexPc);
-  HVecHalvingAdd* v10 = new (GetAllocator()) HVecHalvingAdd(
-      GetAllocator(), p2, p2, DataType::Type::kUint16, 8,
-      /*is_rounded*/ false, /*is_unsigned*/ false, kNoDexPc);
-  HVecHalvingAdd* v11 = new (GetAllocator()) HVecHalvingAdd(
-      GetAllocator(), p2, p2, DataType::Type::kInt16, 2,
-      /*is_rounded*/ true, /*is_unsigned*/ false, kNoDexPc);
-  HVecHalvingAdd* v12 = new (GetAllocator()) HVecHalvingAdd(
-      GetAllocator(), p2, p2, DataType::Type::kInt16, 2,
-      /*is_rounded*/ false, /*is_unsigned*/ false, kNoDexPc);
-  HVecHalvingAdd* hadd_insns[] = { v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12 };
+      GetAllocator(), p0, p0, DataType::Type::kInt32, 4, /*is_rounded*/ false, kNoDexPc);
 
+  HVecHalvingAdd* v4 = new (GetAllocator()) HVecHalvingAdd(
+      GetAllocator(), u1, u1, DataType::Type::kUint16, 8, /*is_rounded*/ true, kNoDexPc);
+  HVecHalvingAdd* v5 = new (GetAllocator()) HVecHalvingAdd(
+      GetAllocator(), u1, u1, DataType::Type::kUint16, 8, /*is_rounded*/ false, kNoDexPc);
+  HVecHalvingAdd* v6 = new (GetAllocator()) HVecHalvingAdd(
+      GetAllocator(), p1, p1, DataType::Type::kInt16, 8, /*is_rounded*/ true, kNoDexPc);
+  HVecHalvingAdd* v7 = new (GetAllocator()) HVecHalvingAdd(
+      GetAllocator(), p1, p1, DataType::Type::kInt16, 8, /*is_rounded*/ false, kNoDexPc);
+
+  HVecHalvingAdd* v8 = new (GetAllocator()) HVecHalvingAdd(
+      GetAllocator(), u2, u2, DataType::Type::kUint8, 16, /*is_rounded*/ true, kNoDexPc);
+  HVecHalvingAdd* v9 = new (GetAllocator()) HVecHalvingAdd(
+      GetAllocator(), u2, u2, DataType::Type::kUint8, 16, /*is_rounded*/ false, kNoDexPc);
+  HVecHalvingAdd* v10 = new (GetAllocator()) HVecHalvingAdd(
+      GetAllocator(), p2, p2, DataType::Type::kInt8, 16, /*is_rounded*/ true, kNoDexPc);
+  HVecHalvingAdd* v11 = new (GetAllocator()) HVecHalvingAdd(
+      GetAllocator(), p2, p2, DataType::Type::kInt8, 16, /*is_rounded*/ false, kNoDexPc);
+
+  HVecHalvingAdd* hadd_insns[] = { v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11 };
+
+  EXPECT_FALSE(u0->CanBeMoved());
+  EXPECT_FALSE(u1->CanBeMoved());
+  EXPECT_FALSE(u2->CanBeMoved());
   EXPECT_FALSE(p0->CanBeMoved());
   EXPECT_FALSE(p1->CanBeMoved());
   EXPECT_FALSE(p2->CanBeMoved());
@@ -427,26 +337,18 @@
     EXPECT_TRUE(hadd_insn->CanBeMoved());
   }
 
-  // Deprecated; IsUnsigned() should be removed with the introduction of Uint32 and Uint64.
-  EXPECT_TRUE(v0->IsUnsigned());
-  EXPECT_TRUE(v1->IsUnsigned());
-  EXPECT_TRUE(!v2->IsUnsigned());
-  EXPECT_TRUE(!v3->IsUnsigned());
-  EXPECT_TRUE(v4->IsUnsigned());
-
   EXPECT_TRUE(v0->IsRounded());
   EXPECT_TRUE(!v1->IsRounded());
   EXPECT_TRUE(v2->IsRounded());
   EXPECT_TRUE(!v3->IsRounded());
   EXPECT_TRUE(v4->IsRounded());
-  EXPECT_TRUE(v5->IsRounded());
-  EXPECT_TRUE(!v6->IsRounded());
-  EXPECT_TRUE(v7->IsRounded());
-  EXPECT_TRUE(!v8->IsRounded());
-  EXPECT_TRUE(v9->IsRounded());
-  EXPECT_TRUE(!v10->IsRounded());
-  EXPECT_TRUE(v11->IsRounded());
-  EXPECT_TRUE(!v12->IsRounded());
+  EXPECT_TRUE(!v5->IsRounded());
+  EXPECT_TRUE(v6->IsRounded());
+  EXPECT_TRUE(!v7->IsRounded());
+  EXPECT_TRUE(v8->IsRounded());
+  EXPECT_TRUE(!v9->IsRounded());
+  EXPECT_TRUE(v10->IsRounded());
+  EXPECT_TRUE(!v11->IsRounded());
 
   for (HVecHalvingAdd* hadd_insn1 : hadd_insns) {
     for (HVecHalvingAdd* hadd_insn2 : hadd_insns) {
