Skip to content

Commit

Permalink
Transform (sub 0, (zext bool to A)) to (sext bool to A) and
Browse files Browse the repository at this point in the history
(sub 0, (sext bool to A)) to (zext bool to A).

Patch by Muhammad Ahmad
Reviewed by Duncan Sands


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173093 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Paul Redmond committed Jan 21, 2013
1 parent e4b1efe commit 8e52810
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 4 deletions.
10 changes: 10 additions & 0 deletions lib/Transforms/InstCombine/InstCombineAddSub.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1250,6 +1250,16 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) {

if (SimplifyDemandedInstructionBits(I))
return &I;

// Fold (sub 0, (zext bool to B)) --> (sext bool to B)
if (C->isZero() && match(Op1, m_ZExt(m_Value(X))))
if (X->getType()->isIntegerTy(1))
return CastInst::CreateSExtOrBitCast(X, Op1->getType());

// Fold (sub 0, (sext bool to B)) --> (zext bool to B)
if (C->isZero() && match(Op1, m_SExt(m_Value(X))))
if (X->getType()->isIntegerTy(1))
return CastInst::CreateZExtOrBitCast(X, Op1->getType());
}


Expand Down
3 changes: 1 addition & 2 deletions test/Transforms/InstCombine/mul.ll
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,7 @@ define i32 @test16(i32 %b, i1 %c) {
; e = b & (a >> 31)
%e = mul i32 %d, %b ; <i32> [#uses=1]
ret i32 %e
; CHECK: [[TEST16:%.*]] = zext i1 %c to i32
; CHECK-NEXT: %1 = sub i32 0, [[TEST16]]
; CHECK: [[TEST16:%.*]] = sext i1 %c to i32
; CHECK-NEXT: %e = and i32 %1, %b
; CHECK-NEXT: ret i32 %e
}
Expand Down
9 changes: 9 additions & 0 deletions test/Transforms/InstCombine/sext.ll
Original file line number Diff line number Diff line change
Expand Up @@ -184,3 +184,12 @@ define i32 @test16(i16 %x) nounwind {
; CHECK-NEXT: %ext = sext i16 %sext to i32
; CHECK-NEXT: ret i32 %ext
}

define i32 @test17(i1 %x) nounwind {
%c1 = sext i1 %x to i32
%c2 = sub i32 0, %c1
ret i32 %c2
; CHECK: @test17
; CHECK-NEXT: [[TEST17:%.*]] = zext i1 %x to i32
; CHECK-NEXT: ret i32 [[TEST17]]
}
4 changes: 2 additions & 2 deletions test/Transforms/InstCombine/zext-bool-add-sub.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
define i32 @a(i1 zeroext %x, i1 zeroext %y) {
entry:
; CHECK: @a
; CHECK: [[TMP1:%.*]] = zext i1 %y to i32
; CHECK: [[TMP1:%.*]] = sext i1 %y to i32
; CHECK: [[TMP2:%.*]] = select i1 %x, i32 2, i32 1
; CHECK-NEXT: sub i32 [[TMP2]], [[TMP1]]
; CHECK-NEXT: add i32 [[TMP2]], [[TMP1]]
%conv = zext i1 %x to i32
%conv3 = zext i1 %y to i32
%conv3.neg = sub i32 0, %conv3
Expand Down

0 comments on commit 8e52810

Please sign in to comment.