mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 13:11:39 +01:00
[ConstantFold] vector div/rem with any zero element in divisor is undef
Follow-up for: https://reviews.llvm.org/D30665 https://reviews.llvm.org/rL297390 llvm-svn: 297409
This commit is contained in:
parent
1ba425d265
commit
e2ddb72a54
@ -1209,10 +1209,15 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
|
||||
SmallVector<Constant*, 16> Result;
|
||||
Type *Ty = IntegerType::get(VTy->getContext(), 32);
|
||||
for (unsigned i = 0, e = VTy->getNumElements(); i != e; ++i) {
|
||||
Constant *LHS =
|
||||
ConstantExpr::getExtractElement(C1, ConstantInt::get(Ty, i));
|
||||
Constant *RHS =
|
||||
ConstantExpr::getExtractElement(C2, ConstantInt::get(Ty, i));
|
||||
Constant *ExtractIdx = ConstantInt::get(Ty, i);
|
||||
Constant *LHS = ConstantExpr::getExtractElement(C1, ExtractIdx);
|
||||
Constant *RHS = ConstantExpr::getExtractElement(C2, ExtractIdx);
|
||||
|
||||
// If any element of a divisor vector is zero, the whole op is undef.
|
||||
if ((Opcode == Instruction::SDiv || Opcode == Instruction::UDiv ||
|
||||
Opcode == Instruction::SRem || Opcode == Instruction::URem) &&
|
||||
RHS->isNullValue())
|
||||
return UndefValue::get(VTy);
|
||||
|
||||
Result.push_back(ConstantExpr::get(Opcode, LHS, RHS));
|
||||
}
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
define <2 x i8> @sdiv_zero_elt_vec_constfold(<2 x i8> %x) {
|
||||
; CHECK-LABEL: @sdiv_zero_elt_vec_constfold(
|
||||
; CHECK-NEXT: ret <2 x i8> <i8 undef, i8 0>
|
||||
; CHECK-NEXT: ret <2 x i8> undef
|
||||
;
|
||||
%div = sdiv <2 x i8> <i8 1, i8 2>, <i8 0, i8 -42>
|
||||
ret <2 x i8> %div
|
||||
@ -12,7 +12,7 @@ define <2 x i8> @sdiv_zero_elt_vec_constfold(<2 x i8> %x) {
|
||||
|
||||
define <2 x i8> @udiv_zero_elt_vec_constfold(<2 x i8> %x) {
|
||||
; CHECK-LABEL: @udiv_zero_elt_vec_constfold(
|
||||
; CHECK-NEXT: ret <2 x i8> <i8 0, i8 undef>
|
||||
; CHECK-NEXT: ret <2 x i8> undef
|
||||
;
|
||||
%div = udiv <2 x i8> <i8 1, i8 2>, <i8 42, i8 0>
|
||||
ret <2 x i8> %div
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
define <2 x i8> @srem_zero_elt_vec_constfold(<2 x i8> %x) {
|
||||
; CHECK-LABEL: @srem_zero_elt_vec_constfold(
|
||||
; CHECK-NEXT: ret <2 x i8> <i8 undef, i8 2>
|
||||
; CHECK-NEXT: ret <2 x i8> undef
|
||||
;
|
||||
%rem = srem <2 x i8> <i8 1, i8 2>, <i8 0, i8 -42>
|
||||
ret <2 x i8> %rem
|
||||
@ -13,7 +13,7 @@ define <2 x i8> @srem_zero_elt_vec_constfold(<2 x i8> %x) {
|
||||
|
||||
define <2 x i8> @urem_zero_elt_vec_constfold(<2 x i8> %x) {
|
||||
; CHECK-LABEL: @urem_zero_elt_vec_constfold(
|
||||
; CHECK-NEXT: ret <2 x i8> <i8 1, i8 undef>
|
||||
; CHECK-NEXT: ret <2 x i8> undef
|
||||
;
|
||||
%rem = urem <2 x i8> <i8 1, i8 2>, <i8 42, i8 0>
|
||||
ret <2 x i8> %rem
|
||||
|
Loading…
x
Reference in New Issue
Block a user