Skip to content

Commit fae37f7

Browse files
committed
[InstCombine] Add one-use check.
1 parent 44f1ddc commit fae37f7

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2166,7 +2166,8 @@ Value *InstCombinerImpl::OptimizePointerDifference(Value *LHS, Value *RHS,
21662166
// then the final multiplication is also nuw.
21672167
if (auto *I = dyn_cast<OverflowingBinaryOperator>(Result))
21682168
if (IsNUW && match(Offset2, m_Zero()) && Base.LHSNW.isInBounds() &&
2169-
I->hasNoSignedWrap() && !I->hasNoUnsignedWrap() &&
2169+
(I->use_empty() || I->hasOneUse()) && I->hasNoSignedWrap() &&
2170+
!I->hasNoUnsignedWrap() &&
21702171
((I->getOpcode() == Instruction::Mul &&
21712172
match(I->getOperand(1), m_NonNegative())) ||
21722173
I->getOpcode() == Instruction::Shl))

llvm/test/Transforms/InstCombine/sub-gep.ll

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1141,3 +1141,20 @@ define i64 @nuw_ptrdiff_mul_nsw_unknown_scale(ptr %base, i64 %idx, i64 %scale) {
11411141
%diff = sub nuw i64 %lhs, %rhs
11421142
ret i64 %diff
11431143
}
1144+
1145+
declare void @usei64(i64)
1146+
1147+
define i64 @nuw_ptrdiff_mul_nsw_nneg_scale_multiuse(ptr %base, i64 %idx) {
1148+
; CHECK-LABEL: @nuw_ptrdiff_mul_nsw_nneg_scale_multiuse(
1149+
; CHECK-NEXT: [[OFFSET:%.*]] = mul nsw i64 [[IDX:%.*]], 3
1150+
; CHECK-NEXT: call void @usei64(i64 [[OFFSET]])
1151+
; CHECK-NEXT: ret i64 [[OFFSET]]
1152+
;
1153+
%offset = mul nsw i64 %idx, 3
1154+
call void @usei64(i64 %offset)
1155+
%gep = getelementptr inbounds i8, ptr %base, i64 %offset
1156+
%lhs = ptrtoint ptr %gep to i64
1157+
%rhs = ptrtoint ptr %base to i64
1158+
%diff = sub nuw i64 %lhs, %rhs
1159+
ret i64 %diff
1160+
}

0 commit comments

Comments
 (0)