Skip to content

Commit 1114d55

Browse files
committed
Don't match with shl, ashr, and ashl because if the shfamt is too large we can create a poison value
1 parent c51c4ee commit 1114d55

File tree

3 files changed

+16
-15
lines changed

3 files changed

+16
-15
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -909,9 +909,6 @@ static Instruction *foldSelectZeroOrFixedOp(SelectInst &SI,
909909

910910
if (!(match(FalseVal, m_c_Mul(m_Specific(X), m_Value(Y))) ||
911911
match(FalseVal, m_c_And(m_Specific(X), m_Value(Y))) ||
912-
match(FalseVal, m_Shl(m_Specific(X), m_Value(Y))) ||
913-
match(FalseVal, m_AShr(m_Specific(X), m_Value(Y))) ||
914-
match(FalseVal, m_LShr(m_Specific(X), m_Value(Y))) ||
915912
match(FalseVal, m_FShl(m_Specific(X), m_Specific(X), m_Value(Y))) ||
916913
match(FalseVal, m_FShr(m_Specific(X), m_Specific(X), m_Value(Y))) ||
917914
match(FalseVal, m_SDiv(m_Specific(X), m_Value(Y))) ||

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

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ define i64 @mul_select(i64 %a, i64 %b) {
3030
; (select (icmp x, 0, eq), 0, (shl x, y)) -> (shl x, y)
3131
define i64 @shl_select(i64 %a, i64 %b) {
3232
; CHECK-LABEL: @shl_select(
33-
; CHECK-NEXT: [[B_FR:%.*]] = freeze i64 [[B:%.*]]
34-
; CHECK-NEXT: [[SHL:%.*]] = shl i64 [[A:%.*]], [[B_FR]]
35-
; CHECK-NEXT: ret i64 [[SHL]]
33+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[A:%.*]], 0
34+
; CHECK-NEXT: [[SHL:%.*]] = shl i64 [[A]], [[B_FR:%.*]]
35+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], i64 0, i64 [[SHL]]
36+
; CHECK-NEXT: ret i64 [[SELECT]]
3637
;
3738
%cond = icmp eq i64 %a, 0
3839
%shl = shl i64 %a, %b
@@ -56,9 +57,10 @@ define i64 @and_select(i64 %a, i64 %b) {
5657
; (select (icmp x, 0, ne), (ashr x, y), 0) -> (ashr x, y)
5758
define i64 @ashr_select(i64 %a, i64 %b) {
5859
; CHECK-LABEL: @ashr_select(
59-
; CHECK-NEXT: [[B_FR:%.*]] = freeze i64 [[B:%.*]]
60-
; CHECK-NEXT: [[ASHR:%.*]] = ashr i64 [[A:%.*]], [[B_FR]]
61-
; CHECK-NEXT: ret i64 [[ASHR]]
60+
; CHECK-NEXT: [[COND_NOT:%.*]] = icmp eq i64 [[A:%.*]], 0
61+
; CHECK-NEXT: [[ASHR:%.*]] = ashr i64 [[A]], [[B_FR:%.*]]
62+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND_NOT]], i64 0, i64 [[ASHR]]
63+
; CHECK-NEXT: ret i64 [[SELECT]]
6264
;
6365
%cond = icmp ne i64 0, %a
6466
%ashr = ashr i64 %a, %b
@@ -69,9 +71,10 @@ define i64 @ashr_select(i64 %a, i64 %b) {
6971
; (select (icmp x, 0, ne), (lshr x, y), 0) -> (lshr x, y)
7072
define i64 @lshr_select(i64 %a, i64 %b) {
7173
; CHECK-LABEL: @lshr_select(
72-
; CHECK-NEXT: [[B_FR:%.*]] = freeze i64 [[B:%.*]]
73-
; CHECK-NEXT: [[LSHR:%.*]] = lshr i64 [[A:%.*]], [[B_FR]]
74-
; CHECK-NEXT: ret i64 [[LSHR]]
74+
; CHECK-NEXT: [[COND_NOT:%.*]] = icmp eq i64 [[A:%.*]], 0
75+
; CHECK-NEXT: [[LSHR:%.*]] = lshr i64 [[A]], [[B_FR:%.*]]
76+
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND_NOT]], i64 0, i64 [[LSHR]]
77+
; CHECK-NEXT: ret i64 [[SELECT]]
7578
;
7679
%cond = icmp ne i64 0, %a
7780
%lshr = lshr i64 %a, %b

llvm/test/Transforms/InstCombine/select.ll

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2733,9 +2733,10 @@ define void @select_freeze_icmp_multuses(i32 %x, i32 %y) {
27332733

27342734
define i32 @pr47322_more_poisonous_replacement(i32 %arg) {
27352735
; CHECK-LABEL: @pr47322_more_poisonous_replacement(
2736-
; CHECK-NEXT: [[TRAILING:%.*]] = call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[ARG:%.*]], i1 true)
2737-
; CHECK-NEXT: [[TRAILING_FR:%.*]] = freeze i32 [[TRAILING]]
2738-
; CHECK-NEXT: [[R1_SROA_0_1:%.*]] = lshr exact i32 [[ARG]], [[TRAILING_FR]]
2736+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[ARG:%.*]], 0
2737+
; CHECK-NEXT: [[TRAILING:%.*]] = call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[ARG]], i1 true)
2738+
; CHECK-NEXT: [[SHIFTED:%.*]] = lshr exact i32 [[ARG]], [[TRAILING]]
2739+
; CHECK-NEXT: [[R1_SROA_0_1:%.*]] = select i1 [[CMP]], i32 0, i32 [[SHIFTED]]
27392740
; CHECK-NEXT: ret i32 [[R1_SROA_0_1]]
27402741
;
27412742
%cmp = icmp eq i32 %arg, 0

0 commit comments

Comments
 (0)