From: Fraser Cormack Date: Wed, 13 Jul 2022 10:10:41 +0000 (+0100) Subject: [llvm-reduce] Fix crash when reducing integer vectors to 1 X-Git-Tag: upstream/15.0.7~1829 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bb3f99cd858e5a769f82c609f1536b1a00dcdcaf;p=platform%2Fupstream%2Fllvm.git [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 --- 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 e3ea033..2ceebd7 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> , ; ONE: %fadd10 = fadd <2 x float> , ; ONE: %fadd11 = fadd <2 x float> , +; ONE: %fadd12 = fadd <2 x float> , ; 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> , ; NAN: %fadd10 = fadd <2 x float> , ; NAN: %fadd11 = fadd <2 x float> , +; NAN: %fadd12 = fadd <2 x float> , 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, %fadd10 = fadd <2 x float> %arg2, undef %fadd11 = fadd <2 x float> %arg2, + %fadd12 = fadd <2 x float> %arg2, 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 0000000..3005058 --- /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, +; ONE: %add6 = add <2 x i32> , +; ONE: %add7 = add <2 x i32> , zeroinitializer +; ONE: %add8 = add <2 x i32> , +; ONE: %add9 = add <2 x i32> , +; ONE: %add10 = add <2 x i32> , + + +; 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, + %add9 = add <2 x i32> %arg2, undef + %add10 = add <2 x i32> %arg2, + 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 d008a39..7c144eb 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(Ty)) { - if (isZeroOrOneFP(Op)) + if (isOne(Op) || isZero(Op) || isZeroOrOneFP(Op)) return nullptr; + if (auto *IntTy = dyn_cast(VT->getElementType())) + return ConstantVector::getSplat(VT->getElementCount(), + ConstantInt::get(IntTy, 1)); + return ConstantVector::getSplat( VT->getElementCount(), ConstantFP::get(VT->getElementType(), 1.0)); }