Skip to content

Commit df01cdf

Browse files
committed
[InstCombine] Remove one-use requirement for add iN (sext i1 X), (sext i1 Y) --> sext (X | Y) to iN
Since these remove instructions, we can forgo the one-use check
1 parent b329179 commit df01cdf

File tree

2 files changed

+12
-20
lines changed

2 files changed

+12
-20
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -510,9 +510,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,
510510
}
511511

512512
// add iN (sext i1 X), (sext i1 Y) --> sext (X | Y) to iN
513-
// TODO: Relax the one-use checks because we are removing an instruction?
514-
if (match(I, m_Add(m_OneUse(m_SExt(m_Value(X))),
515-
m_OneUse(m_SExt(m_Value(Y))))) &&
513+
if (match(I, m_Add(m_SExt(m_Value(X)), m_SExt(m_Value(Y)))) &&
516514
X->getType()->isIntOrIntVectorTy(1) && X->getType() == Y->getType()) {
517515
// Truth table for inputs and output signbits:
518516
// X:0 | X:1

llvm/test/Transforms/InstCombine/add.ll

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1435,15 +1435,12 @@ define i32 @and31_add_sexts(i1 %x, i1 %y) {
14351435
ret i32 %r
14361436
}
14371437

1438-
; Negative test - extra use
1439-
14401438
define i32 @lshr_add_use_sexts(i1 %x, i1 %y, ptr %p) {
14411439
; CHECK-LABEL: @lshr_add_use_sexts(
14421440
; CHECK-NEXT: [[XS:%.*]] = sext i1 [[X:%.*]] to i32
14431441
; CHECK-NEXT: store i32 [[XS]], ptr [[P:%.*]], align 4
1444-
; CHECK-NEXT: [[YS:%.*]] = sext i1 [[Y:%.*]] to i32
1445-
; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[XS]], [[YS]]
1446-
; CHECK-NEXT: [[R:%.*]] = lshr i32 [[SUB]], 31
1442+
; CHECK-NEXT: [[TMP1:%.*]] = or i1 [[X]], [[Y:%.*]]
1443+
; CHECK-NEXT: [[R:%.*]] = zext i1 [[TMP1]] to i32
14471444
; CHECK-NEXT: ret i32 [[R]]
14481445
;
14491446
%xs = sext i1 %x to i32
@@ -1454,15 +1451,12 @@ define i32 @lshr_add_use_sexts(i1 %x, i1 %y, ptr %p) {
14541451
ret i32 %r
14551452
}
14561453

1457-
; Negative test - extra use
1458-
14591454
define i32 @lshr_add_use2_sexts(i1 %x, i1 %y, ptr %p) {
14601455
; CHECK-LABEL: @lshr_add_use2_sexts(
1461-
; CHECK-NEXT: [[XS:%.*]] = sext i1 [[X:%.*]] to i32
14621456
; CHECK-NEXT: [[YS:%.*]] = sext i1 [[Y:%.*]] to i32
14631457
; CHECK-NEXT: store i32 [[YS]], ptr [[P:%.*]], align 4
1464-
; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[XS]], [[YS]]
1465-
; CHECK-NEXT: [[R:%.*]] = lshr i32 [[SUB]], 31
1458+
; CHECK-NEXT: [[TMP1:%.*]] = or i1 [[X:%.*]], [[Y]]
1459+
; CHECK-NEXT: [[R:%.*]] = zext i1 [[TMP1]] to i32
14661460
; CHECK-NEXT: ret i32 [[R]]
14671461
;
14681462
%xs = sext i1 %x to i32
@@ -4018,8 +4012,8 @@ define i32 @add_reduce_sqr_sum_varC_invalid2(i32 %a, i32 %b) {
40184012

40194013
define i32 @fold_sext_addition_or_disjoint(i8 %x) {
40204014
; CHECK-LABEL: @fold_sext_addition_or_disjoint(
4021-
; CHECK-NEXT: [[SE:%.*]] = sext i8 [[XX:%.*]] to i32
4022-
; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[SE]], 1246
4015+
; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[X:%.*]] to i32
4016+
; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[TMP1]], 1246
40234017
; CHECK-NEXT: ret i32 [[R]]
40244018
;
40254019
%xx = or disjoint i8 %x, 12
@@ -4043,8 +4037,8 @@ define i32 @fold_sext_addition_fail(i8 %x) {
40434037

40444038
define i32 @fold_zext_addition_or_disjoint(i8 %x) {
40454039
; CHECK-LABEL: @fold_zext_addition_or_disjoint(
4046-
; CHECK-NEXT: [[SE:%.*]] = zext i8 [[XX:%.*]] to i32
4047-
; CHECK-NEXT: [[R:%.*]] = add nuw nsw i32 [[SE]], 1246
4040+
; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[X:%.*]] to i32
4041+
; CHECK-NEXT: [[R:%.*]] = add nuw nsw i32 [[TMP1]], 1246
40484042
; CHECK-NEXT: ret i32 [[R]]
40494043
;
40504044
%xx = or disjoint i8 %x, 12
@@ -4055,9 +4049,9 @@ define i32 @fold_zext_addition_or_disjoint(i8 %x) {
40554049

40564050
define i32 @fold_zext_addition_or_disjoint2(i8 %x) {
40574051
; CHECK-LABEL: @fold_zext_addition_or_disjoint2(
4058-
; CHECK-NEXT: [[XX:%.*]] = add nuw i8 [[X:%.*]], 4
4059-
; CHECK-NEXT: [[SE:%.*]] = zext i8 [[XX]] to i32
4060-
; CHECK-NEXT: ret i32 [[SE]]
4052+
; CHECK-NEXT: [[TMP1:%.*]] = add nuw i8 [[X:%.*]], 4
4053+
; CHECK-NEXT: [[R:%.*]] = zext i8 [[TMP1]] to i32
4054+
; CHECK-NEXT: ret i32 [[R]]
40614055
;
40624056
%xx = or disjoint i8 %x, 18
40634057
%se = zext i8 %xx to i32

0 commit comments

Comments
 (0)