[llvm] bb3f99c - [llvm-reduce] Fix crash when reducing integer vectors to 1

Fraser Cormack via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 13 09:08:20 PDT 2022


Author: Fraser Cormack
Date: 2022-07-13T16:56:55+01:00
New Revision: bb3f99cd858e5a769f82c609f1536b1a00dcdcaf

URL: https://github.com/llvm/llvm-project/commit/bb3f99cd858e5a769f82c609f1536b1a00dcdcaf
DIFF: https://github.com/llvm/llvm-project/commit/bb3f99cd858e5a769f82c609f1536b1a00dcdcaf.diff

LOG: [llvm-reduce] Fix crash when reducing integer vectors to 1

Integer vectors were previously ignored when reducing operands. When
6b8bd0f72 introduced support for reducing floating-point
scalars/vectors, the vector case was written to only handle
floating-point values. It would crash when creating an invalid
ConstantFP from the integer element type.

Instead of reinstating the old integer vector behaviour, we might as
well reduce integer vectors to all-one splats.

A couple of existing tests has also been renamed from "remove" to
"reduce" to better reflect the deltas they test.

Reviewed By: arsenm

Differential Revision: https://reviews.llvm.org/D129629

Added: 
    llvm/test/tools/llvm-reduce/reduce-operands-fp.ll
    llvm/test/tools/llvm-reduce/reduce-operands-int.ll
    llvm/test/tools/llvm-reduce/reduce-operands.ll

Modified: 
    llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp

Removed: 
    llvm/test/tools/llvm-reduce/remove-operands-fp.ll
    llvm/test/tools/llvm-reduce/remove-operands.ll


################################################################################
diff  --git a/llvm/test/tools/llvm-reduce/remove-operands-fp.ll b/llvm/test/tools/llvm-reduce/reduce-operands-fp.ll
similarity index 91%
rename from llvm/test/tools/llvm-reduce/remove-operands-fp.ll
rename to llvm/test/tools/llvm-reduce/reduce-operands-fp.ll
index e3ea0339fe7fc..2ceebd7a5a86a 100644
--- a/llvm/test/tools/llvm-reduce/remove-operands-fp.ll
+++ b/llvm/test/tools/llvm-reduce/reduce-operands-fp.ll
@@ -25,6 +25,7 @@
 ; CHECK-INTERESTINGNESS: = fadd <2 x float>
 ; CHECK-INTERESTINGNESS: = fadd <2 x float>
 ; CHECK-INTERESTINGNESS: = fadd <2 x float>
+; CHECK-INTERESTINGNESS: = fadd <2 x float>
 
 ; CHECK-LABEL: define void @foo(
 
@@ -41,6 +42,7 @@
 ; ONE: %fadd9 = fadd <2 x float> <float 1.000000e+00, float 1.000000e+00>, <float 1.000000e+00, float 1.000000e+00>
 ; ONE: %fadd10 = fadd <2 x float> <float 1.000000e+00, float 1.000000e+00>, <float 1.000000e+00, float 1.000000e+00>
 ; ONE: %fadd11 = fadd <2 x float> <float 1.000000e+00, float 1.000000e+00>, <float 1.000000e+00, float 1.000000e+00>
+; ONE: %fadd12 = fadd <2 x float> <float 1.000000e+00, float 1.000000e+00>, <float 1.000000e+00, float 1.000000e+00>
 
 
 ; ZERO: %fadd0 = fadd float %arg0, 0.000000e+00
@@ -55,6 +57,7 @@
 ; ZERO: %fadd9 = fadd <2 x float> zeroinitializer, zeroinitializer
 ; ZERO: %fadd10 = fadd <2 x float> zeroinitializer, zeroinitializer
 ; ZERO: %fadd11 = fadd <2 x float> zeroinitializer, zeroinitializer
+; ZERO: %fadd12 = fadd <2 x float> zeroinitializer, zeroinitializer
 
 
 ; NAN: %fadd0 = fadd float %arg0, 0x7FF8000000000000
@@ -69,6 +72,7 @@
 ; NAN: %fadd9 = fadd <2 x float> <float 0x7FF8000000000000, float 0x7FF8000000000000>, <float 1.000000e+00, float 1.000000e+00>
 ; NAN: %fadd10 = fadd <2 x float> <float 0x7FF8000000000000, float 0x7FF8000000000000>, <float 0x7FF8000000000000, float 0x7FF8000000000000>
 ; NAN: %fadd11 = fadd <2 x float> <float 0x7FF8000000000000, float 0x7FF8000000000000>, <float 0x7FF8000000000000, float 0x7FF8000000000000>
+; NAN: %fadd12 = fadd <2 x float> <float 0x7FF8000000000000, float 0x7FF8000000000000>, <float 0x7FF8000000000000, float 0x7FF8000000000000>
 
 define void @foo(float %arg0, float %arg1, <2 x float> %arg2, <2 x float> %arg3) {
 bb0:
@@ -84,5 +88,6 @@ bb0:
   %fadd9 = fadd <2 x float> %arg2, <float 1.0, float 1.0>
   %fadd10 = fadd <2 x float> %arg2, undef
   %fadd11 = fadd <2 x float> %arg2, <float 0x7FF8000000000000, float 0x7FF8000000000000>
+  %fadd12 = fadd <2 x float> %arg2, <float 0x7FF8000000000000, float 2.0>
   ret void
 }

diff  --git a/llvm/test/tools/llvm-reduce/reduce-operands-int.ll b/llvm/test/tools/llvm-reduce/reduce-operands-int.ll
new file mode 100644
index 0000000000000..3005058742ce3
--- /dev/null
+++ b/llvm/test/tools/llvm-reduce/reduce-operands-int.ll
@@ -0,0 +1,67 @@
+; Test that llvm-reduce can reduce floating point operands
+;
+; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=operands-one --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t
+; RUN: FileCheck --check-prefixes=CHECK,ONE %s < %t
+
+; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=operands-zero --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t
+; RUN: FileCheck --check-prefixes=CHECK,ZERO %s < %t
+
+; RUN: llvm-reduce --abort-on-invalid-reduction --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t
+; RUN: FileCheck --check-prefixes=CHECK,ZERO %s < %t
+
+; CHECK-INTERESTINGNESS: = add i32 %
+; CHECK-INTERESTINGNESS: = add i32
+; CHECK-INTERESTINGNESS: = add i32
+; CHECK-INTERESTINGNESS: = add i32
+; CHECK-INTERESTINGNESS: = add i32
+
+; CHECK-INTERESTINGNESS: = add <2 x i32> %
+; CHECK-INTERESTINGNESS: = add <2 x i32>
+; CHECK-INTERESTINGNESS: = add <2 x i32>
+; CHECK-INTERESTINGNESS: = add <2 x i32>
+; CHECK-INTERESTINGNESS: = add <2 x i32>
+; CHECK-INTERESTINGNESS: = add <2 x i32>
+
+; CHECK-LABEL: define void @foo(
+
+
+; ONE: %add0 = add i32 %arg0, 1
+; ONE: %add1 = add i32 1, 1
+; ONE: %add2 = add i32 1, 0
+; ONE: %add3 = add i32 1, 1
+; ONE: %add4 = add i32 1, 1
+; ONE: %add5 = add <2 x i32> %arg2, <i32 1, i32 1>
+; ONE: %add6 = add <2 x i32> <i32 1, i32 1>, <i32 1, i32 1>
+; ONE: %add7 = add <2 x i32> <i32 1, i32 1>, zeroinitializer
+; ONE: %add8 = add <2 x i32> <i32 1, i32 1>, <i32 1, i32 1>
+; ONE: %add9 = add <2 x i32> <i32 1, i32 1>, <i32 1, i32 1>
+; ONE: %add10 = add <2 x i32> <i32 1, i32 1>, <i32 1, i32 1>
+
+
+; ZERO: %add0 = add i32 %arg0, 0
+; ZERO: %add1 = add i32 0, 0
+; ZERO: %add2 = add i32 0, 0
+; ZERO: %add3 = add i32 0, 0
+; ZERO: %add4 = add i32 0, 0
+; ZERO: %add5 = add <2 x i32> %arg2, zeroinitializer
+; ZERO: %add6 = add <2 x i32> zeroinitializer, zeroinitializer
+; ZERO: %add7 = add <2 x i32> zeroinitializer, zeroinitializer
+; ZERO: %add8 = add <2 x i32> zeroinitializer, zeroinitializer
+; ZERO: %add9 = add <2 x i32> zeroinitializer, zeroinitializer
+; ZERO: %add10 = add <2 x i32> zeroinitializer, zeroinitializer
+
+define void @foo(i32 %arg0, i32 %arg1, <2 x i32> %arg2, <2 x i32> %arg3) {
+bb0:
+  %add0 = add i32 %arg0, %arg1
+  %add1 = add i32 %arg0, %arg1
+  %add2 = add i32 %arg0, 0
+  %add3 = add i32 %arg0, 1
+  %add4 = add i32 %arg0, undef
+  %add5 = add <2 x i32> %arg2, %arg3
+  %add6 = add <2 x i32> %arg2, %arg3
+  %add7 = add <2 x i32> %arg2, zeroinitializer
+  %add8 = add <2 x i32> %arg2, <i32 1, i32 1>
+  %add9 = add <2 x i32> %arg2, undef
+  %add10 = add <2 x i32> %arg2, <i32 4, i32 6>
+  ret void
+}

diff  --git a/llvm/test/tools/llvm-reduce/remove-operands.ll b/llvm/test/tools/llvm-reduce/reduce-operands.ll
similarity index 100%
rename from llvm/test/tools/llvm-reduce/remove-operands.ll
rename to llvm/test/tools/llvm-reduce/reduce-operands.ll

diff  --git a/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp b/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp
index d008a39d63424..7c144eb7302f2 100644
--- a/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp
+++ b/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp
@@ -79,9 +79,13 @@ void llvm::reduceOperandsOneDeltaPass(TestRunner &Test) {
       return isZeroOrOneFP(Op) ? nullptr : ConstantFP::get(Ty, 1.0);
 
     if (VectorType *VT = dyn_cast<VectorType>(Ty)) {
-      if (isZeroOrOneFP(Op))
+      if (isOne(Op) || isZero(Op) || isZeroOrOneFP(Op))
         return nullptr;
 
+      if (auto *IntTy = dyn_cast<IntegerType>(VT->getElementType()))
+        return ConstantVector::getSplat(VT->getElementCount(),
+                                        ConstantInt::get(IntTy, 1));
+
       return ConstantVector::getSplat(
           VT->getElementCount(), ConstantFP::get(VT->getElementType(), 1.0));
     }


        


More information about the llvm-commits mailing list