diff --git a/llvm/test/tools/llvm-reduce/reduce-operands-ptr.ll b/llvm/test/tools/llvm-reduce/reduce-operands-ptr.ll new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-reduce/reduce-operands-ptr.ll @@ -0,0 +1,33 @@ +; Test that llvm-reduce can reduce pointer 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-LABEL: define void @foo( + +; ONE: load i32, ptr %a0 +; ONE: load i32, ptr @g +; ONE: extractelement <4 x ptr> , i32 11 + +; ZERO: load i32, ptr null +; ZERO: load i32, ptr null +; ZERO: extractelement <4 x ptr> zeroinitializer, i32 11 + +@g = global i32 0 + +define void @foo(ptr %a0) { + ; CHECK-INTERESTINGNESS: load i32 + %v0 = load i32, ptr %a0 + ; CHECK-INTERESTINGNESS: load i32 + %v1 = load i32, ptr @g + + ; CHECK-INTERESTINGNESS: extractelement{{.*}}i32 11 + %v2 = extractelement <4 x ptr> , i32 11 + + ret void +} diff --git a/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp b/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp --- a/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp +++ b/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp @@ -92,12 +92,16 @@ 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)); + Type *ElementType = VT->getElementType(); + Constant *C; + if (ElementType->isFloatingPointTy()) { + C = ConstantFP::get(ElementType, 1.0); + } else if (IntegerType *IntTy = dyn_cast(ElementType)) { + C = ConstantInt::get(IntTy, 1); + } else { + return nullptr; + } + return ConstantVector::getSplat(VT->getElementCount(), C); } return nullptr;