Commit b3c29bd1 authored by Hans Wennborg's avatar Hans Wennborg
Browse files

Back-port r276209:

------------------------------------------------------------------------
r276209 | spatel | 2016-07-20 16:40:01 -0700 (Wed, 20 Jul 2016) | 4 lines

[InstSimplify][InstCombine] don't crash when folding vector selects of icmp

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

------------------------------------------------------------------------

llvm-svn: 276986
parent c6d28602
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -3400,7 +3400,10 @@ static Value *SimplifySelectInst(Value *CondVal, Value *TrueVal,
    return TrueVal;

  if (const auto *ICI = dyn_cast<ICmpInst>(CondVal)) {
    unsigned BitWidth = Q.DL.getTypeSizeInBits(TrueVal->getType());
    // FIXME: This code is nearly duplicated in InstCombine. Using/refactoring
    // decomposeBitTestICmp() might help.
    unsigned BitWidth =
        Q.DL.getTypeSizeInBits(TrueVal->getType()->getScalarType());
    ICmpInst::Predicate Pred = ICI->getPredicate();
    Value *CmpLHS = ICI->getOperand(0);
    Value *CmpRHS = ICI->getOperand(1);
+4 −1
Original line number Diff line number Diff line
@@ -553,8 +553,11 @@ Instruction *InstCombiner::visitSelectInstWithICmp(SelectInst &SI,
    }
  }

  // FIXME: This code is nearly duplicated in InstSimplify. Using/refactoring
  // decomposeBitTestICmp() might help.
  {
    unsigned BitWidth = DL.getTypeSizeInBits(TrueVal->getType());
    unsigned BitWidth =
        DL.getTypeSizeInBits(TrueVal->getType()->getScalarType());
    APInt MinSignedValue = APInt::getSignBit(BitWidth);
    Value *X;
    const APInt *Y, *C;
+23 −0
Original line number Diff line number Diff line
@@ -1737,3 +1737,26 @@ define i32 @PR27137(i32 %a) {
  %s1 = select i1 %c1, i32 %s0, i32 -1
  ret i32 %s1
}

define i32 @select_icmp_slt0_xor(i32 %x) {
; CHECK-LABEL: @select_icmp_slt0_xor(
; CHECK-NEXT:    [[TMP1:%.*]] = or i32 %x, -2147483648
; CHECK-NEXT:    ret i32 [[TMP1]]
;
  %cmp = icmp slt i32 %x, zeroinitializer
  %xor = xor i32 %x, 2147483648
  %x.xor = select i1 %cmp, i32 %x, i32 %xor
  ret i32 %x.xor
}

define <2 x i32> @select_icmp_slt0_xor_vec(<2 x i32> %x) {
; CHECK-LABEL: @select_icmp_slt0_xor_vec(
; CHECK-NEXT:    [[TMP1:%.*]] = or <2 x i32> %x, <i32 -2147483648, i32 -2147483648>
; CHECK-NEXT:    ret <2 x i32> [[TMP1]]
;
  %cmp = icmp slt <2 x i32> %x, zeroinitializer
  %xor = xor <2 x i32> %x, <i32 2147483648, i32 2147483648>
  %x.xor = select <2 x i1> %cmp, <2 x i32> %x, <2 x i32> %xor
  ret <2 x i32> %x.xor
}