Skip to content

Commit ab3fdbd

Browse files
authored
[ValueTracking] Support srem/urem for isKnownNonNullFromDominatingCondition (#74021)
Similar to div, the rem should also proof its second operand is non-zero, otherwise it is a UB. Fix #71782
1 parent 0e163e7 commit ab3fdbd

File tree

3 files changed

+58
-5
lines changed

3 files changed

+58
-5
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2186,7 +2186,8 @@ static bool isKnownNonNullFromDominatingCondition(const Value *V,
21862186
return true;
21872187
}
21882188

2189-
if (match(U, m_IDiv(m_Value(), m_Specific(V))) &&
2189+
if ((match(U, m_IDiv(m_Value(), m_Specific(V))) ||
2190+
match(U, m_IRem(m_Value(), m_Specific(V)))) &&
21902191
isValidAssumeForContext(cast<Instruction>(U), CtxI, DT))
21912192
return true;
21922193

llvm/test/Analysis/ValueTracking/select-known-non-zero.ll

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
33

44
declare void @llvm.assume(i1)
5+
declare void @use(i64)
6+
declare void @use4(i4)
57

68
define i1 @select_v_ne_fail(i8 %v, i8 %C, i8 %y) {
79
; CHECK-LABEL: @select_v_ne_fail(
@@ -446,4 +448,56 @@ define i64 @incorrect_safe_div_call_2(i64 %n, i64 %d) {
446448
ret i64 %3
447449
}
448450

449-
declare void @use(i64)
451+
; https://alive2.llvm.org/ce/z/Si_B7b
452+
define i4 @icmp_urem(i4 %n, i4 %d) {
453+
; CHECK-LABEL: @icmp_urem(
454+
; CHECK-NEXT: [[TMP1:%.*]] = urem i4 [[N:%.*]], [[D:%.*]]
455+
; CHECK-NEXT: ret i4 [[TMP1]]
456+
;
457+
%1 = icmp eq i4 %d, 0
458+
%2 = urem i4 %n, %d
459+
%3 = select i1 %1, i4 -1, i4 %2
460+
ret i4 %3
461+
}
462+
463+
define i4 @icmp_urem_clobber_by_call(i4 %n, i4 %d) {
464+
; CHECK-LABEL: @icmp_urem_clobber_by_call(
465+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i4 [[D:%.*]], 0
466+
; CHECK-NEXT: tail call void @use4(i4 [[D]])
467+
; CHECK-NEXT: [[TMP2:%.*]] = urem i4 [[N:%.*]], [[D]]
468+
; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP1]], i4 -1, i4 [[TMP2]]
469+
; CHECK-NEXT: ret i4 [[TMP3]]
470+
;
471+
%1 = icmp eq i4 %d, 0
472+
tail call void @use4(i4 %d)
473+
%2 = urem i4 %n, %d
474+
%3 = select i1 %1, i4 -1, i4 %2
475+
ret i4 %3
476+
}
477+
478+
; https://alive2.llvm.org/ce/z/Fn3Wac
479+
define i4 @icmp_srem(i4 %n, i4 %d) {
480+
; CHECK-LABEL: @icmp_srem(
481+
; CHECK-NEXT: [[TMP1:%.*]] = srem i4 [[N:%.*]], [[D:%.*]]
482+
; CHECK-NEXT: ret i4 [[TMP1]]
483+
;
484+
%1 = icmp eq i4 %d, 0
485+
%2 = srem i4 %n, %d
486+
%3 = select i1 %1, i4 -1, i4 %2
487+
ret i4 %3
488+
}
489+
490+
define i4 @icmp_srem_clobber_by_call(i4 %n, i4 %d) {
491+
; CHECK-LABEL: @icmp_srem_clobber_by_call(
492+
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i4 [[D:%.*]], 0
493+
; CHECK-NEXT: tail call void @use4(i4 [[D]])
494+
; CHECK-NEXT: [[TMP2:%.*]] = srem i4 [[N:%.*]], [[D]]
495+
; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP1]], i4 -1, i4 [[TMP2]]
496+
; CHECK-NEXT: ret i4 [[TMP3]]
497+
;
498+
%1 = icmp eq i4 %d, 0
499+
tail call void @use4(i4 %d)
500+
%2 = srem i4 %n, %d
501+
%3 = select i1 %1, i4 -1, i4 %2
502+
ret i4 %3
503+
}

llvm/test/Transforms/InstCombine/zext-or-icmp.ll

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -231,9 +231,7 @@ define i1 @PR51762(ptr %i, i32 %t0, i16 %t1, ptr %p, ptr %d, ptr %f, i32 %p2, i1
231231
; CHECK-NEXT: [[INSERT_INSERT41:%.*]] = or i64 [[INSERT_SHIFT52]], [[INSERT_EXT39]]
232232
; CHECK-NEXT: [[REM:%.*]] = urem i64 [[S1]], [[INSERT_INSERT41]]
233233
; CHECK-NEXT: [[NE:%.*]] = icmp ne i64 [[REM]], 0
234-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[INSERT_INSERT41]], 0
235-
; CHECK-NEXT: [[SPEC_SELECT57:%.*]] = or i1 [[NE]], [[CMP]]
236-
; CHECK-NEXT: [[LOR_EXT:%.*]] = zext i1 [[SPEC_SELECT57]] to i32
234+
; CHECK-NEXT: [[LOR_EXT:%.*]] = zext i1 [[NE]] to i32
237235
; CHECK-NEXT: [[T2:%.*]] = load i32, ptr [[D:%.*]], align 4
238236
; CHECK-NEXT: [[CONV15:%.*]] = sext i16 [[T1]] to i32
239237
; CHECK-NEXT: [[CMP16:%.*]] = icmp sge i32 [[T2]], [[CONV15]]

0 commit comments

Comments
 (0)