Skip to content

Commit c558702

Browse files
committed
Don't match with udiv and sdiv because if the denominator is 0 we can create undef value
1 parent 1114d55 commit c558702

File tree

2 files changed

+8
-8
lines changed

2 files changed

+8
-8
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -911,8 +911,6 @@ static Instruction *foldSelectZeroOrFixedOp(SelectInst &SI,
911911
match(FalseVal, m_c_And(m_Specific(X), m_Value(Y))) ||
912912
match(FalseVal, m_FShl(m_Specific(X), m_Specific(X), m_Value(Y))) ||
913913
match(FalseVal, m_FShr(m_Specific(X), m_Specific(X), m_Value(Y))) ||
914-
match(FalseVal, m_SDiv(m_Specific(X), m_Value(Y))) ||
915-
match(FalseVal, m_UDiv(m_Specific(X), m_Value(Y))) ||
916914
match(FalseVal,
917915
m_c_Intrinsic<Intrinsic::umin>(m_Specific(X), m_Value(Y))))) {
918916
return nullptr;

llvm/test/Transforms/InstCombine/select-fixed-zero.ll

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,10 @@ define i64 @fshr_select_no_combine(i64 %a, i64 %b, i64 %c) {
125125
; (select (icmp x, 0, eq), 0, (sdiv x, y)) -> (sdiv x, y)
126126
define i64 @sdiv_select(i64 %a, i64 %b) {
127127
; CHECK-LABEL: @sdiv_select(
128-
; CHECK-NEXT: [[B_FR:%.*]] = freeze i64 [[B:%.*]]
129-
; CHECK-NEXT: [[DIV:%.*]] = sdiv i64 [[A:%.*]], [[B_FR]]
130-
; CHECK-NEXT: ret i64 [[DIV]]
128+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
129+
; CHECK-NEXT: [[DIV:%.*]] = sdiv i64 [[A]], [[B_FR:%.*]]
130+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[DIV]]
131+
; CHECK-NEXT: ret i64 [[SELECT]]
131132
;
132133
%cond = icmp eq i64 %a, 0
133134
%div = sdiv i64 %a, %b
@@ -138,9 +139,10 @@ define i64 @sdiv_select(i64 %a, i64 %b) {
138139
; (select (icmp x, 0, eq), 0, (udiv x, y)) -> (udiv x, y)
139140
define i64 @udiv_select(i64 %a, i64 %b) {
140141
; CHECK-LABEL: @udiv_select(
141-
; CHECK-NEXT: [[B_FR:%.*]] = freeze i64 [[B:%.*]]
142-
; CHECK-NEXT: [[DIV:%.*]] = udiv i64 [[A:%.*]], [[B_FR]]
143-
; CHECK-NEXT: ret i64 [[DIV]]
142+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
143+
; CHECK-NEXT: [[DIV:%.*]] = udiv i64 [[A]], [[B_FR:%.*]]
144+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[DIV]]
145+
; CHECK-NEXT: ret i64 [[SELECT]]
144146
;
145147
%cond = icmp eq i64 %a, 0
146148
%div = udiv i64 %a, %b

0 commit comments

Comments
 (0)