forked from OSchip/llvm-project
[InstCombine] add hasOneUse check to add-zext-add fold to prevent increasing instructions
llvm-svn: 315718
This commit is contained in:
parent
399fcbea37
commit
c419c9f640
|
@ -988,10 +988,8 @@ Instruction *InstCombiner::foldAddWithConstant(BinaryOperator &Add) {
|
|||
return CastInst::Create(Instruction::SExt, X, Ty);
|
||||
|
||||
// (add (zext (add nuw X, C2)), C) --> (zext (add nuw X, C2 + C))
|
||||
// FIXME: This should check hasOneUse to not increase the instruction count?
|
||||
if (C->isNegative() &&
|
||||
match(Op0, m_ZExt(m_NUWAdd(m_Value(X), m_APInt(C2)))) &&
|
||||
C->sge(-C2->sext(C->getBitWidth()))) {
|
||||
if (match(Op0, m_OneUse(m_ZExt(m_NUWAdd(m_Value(X), m_APInt(C2))))) &&
|
||||
C->isNegative() && C->sge(-C2->sext(C->getBitWidth()))) {
|
||||
Constant *NewC =
|
||||
ConstantInt::get(X->getType(), *C2 + C->trunc(C2->getBitWidth()));
|
||||
return new ZExtInst(Builder.CreateNUWAdd(X, NewC), Ty);
|
||||
|
|
|
@ -633,9 +633,8 @@ define <2 x i64> @test41vec_and_multiuse(<2 x i32> %a) {
|
|||
; CHECK-LABEL: @test41vec_and_multiuse(
|
||||
; CHECK-NEXT: [[ADD:%.*]] = add nuw <2 x i32> %a, <i32 16, i32 16>
|
||||
; CHECK-NEXT: [[ZEXT:%.*]] = zext <2 x i32> [[ADD]] to <2 x i64>
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = add nuw <2 x i32> %a, <i32 15, i32 15>
|
||||
; CHECK-NEXT: [[SUB:%.*]] = zext <2 x i32> [[TMP1]] to <2 x i64>
|
||||
; CHECK-NEXT: [[EXTRAUSE:%.*]] = add nuw nsw <2 x i64> [[ZEXT]], [[SUB]]
|
||||
; CHECK-NEXT: [[SUB:%.*]] = add nsw <2 x i64> [[ZEXT]], <i64 -1, i64 -1>
|
||||
; CHECK-NEXT: [[EXTRAUSE:%.*]] = add nsw <2 x i64> [[SUB]], [[ZEXT]]
|
||||
; CHECK-NEXT: ret <2 x i64> [[EXTRAUSE]]
|
||||
;
|
||||
%add = add nuw <2 x i32> %a, <i32 16, i32 16>
|
||||
|
|
Loading…
Reference in New Issue