Skip to content

Commit ac13e5c

Browse files
committed
[InstCombine] Add tests for integrating N{U,S}WAddLike; NFC
1 parent aa7f820 commit ac13e5c

File tree

5 files changed

+195
-0
lines changed

5 files changed

+195
-0
lines changed

llvm/test/Transforms/InstCombine/add.ll

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3986,5 +3986,84 @@ define i32 @add_reduce_sqr_sum_varC_invalid2(i32 %a, i32 %b) {
39863986
ret i32 %ab2
39873987
}
39883988

3989+
define i32 @fold_sext_addition_or_disjoint(i8 %x) {
3990+
; CHECK-LABEL: @fold_sext_addition_or_disjoint(
3991+
; CHECK-NEXT: [[XX:%.*]] = or disjoint i8 [[X:%.*]], 12
3992+
; CHECK-NEXT: [[SE:%.*]] = sext i8 [[XX]] to i32
3993+
; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[SE]], 1234
3994+
; CHECK-NEXT: ret i32 [[R]]
3995+
;
3996+
%xx = or disjoint i8 %x, 12
3997+
%se = sext i8 %xx to i32
3998+
%r = add i32 %se, 1234
3999+
ret i32 %r
4000+
}
4001+
4002+
define i32 @fold_sext_addition_fail(i8 %x) {
4003+
; CHECK-LABEL: @fold_sext_addition_fail(
4004+
; CHECK-NEXT: [[XX:%.*]] = or i8 [[X:%.*]], 12
4005+
; CHECK-NEXT: [[SE:%.*]] = sext i8 [[XX]] to i32
4006+
; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[SE]], 1234
4007+
; CHECK-NEXT: ret i32 [[R]]
4008+
;
4009+
%xx = or i8 %x, 12
4010+
%se = sext i8 %xx to i32
4011+
%r = add i32 %se, 1234
4012+
ret i32 %r
4013+
}
4014+
4015+
define i32 @fold_zext_addition_or_disjoint(i8 %x) {
4016+
; CHECK-LABEL: @fold_zext_addition_or_disjoint(
4017+
; CHECK-NEXT: [[XX:%.*]] = or disjoint i8 [[X:%.*]], 12
4018+
; CHECK-NEXT: [[SE:%.*]] = zext i8 [[XX]] to i32
4019+
; CHECK-NEXT: [[R:%.*]] = add nuw nsw i32 [[SE]], 1234
4020+
; CHECK-NEXT: ret i32 [[R]]
4021+
;
4022+
%xx = or disjoint i8 %x, 12
4023+
%se = zext i8 %xx to i32
4024+
%r = add i32 %se, 1234
4025+
ret i32 %r
4026+
}
4027+
4028+
define i32 @fold_zext_addition_or_disjoint2(i8 %x) {
4029+
; CHECK-LABEL: @fold_zext_addition_or_disjoint2(
4030+
; CHECK-NEXT: [[XX:%.*]] = or disjoint i8 [[X:%.*]], 18
4031+
; CHECK-NEXT: [[SE:%.*]] = zext i8 [[XX]] to i32
4032+
; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[SE]], -14
4033+
; CHECK-NEXT: ret i32 [[R]]
4034+
;
4035+
%xx = or disjoint i8 %x, 18
4036+
%se = zext i8 %xx to i32
4037+
%r = add i32 %se, -14
4038+
ret i32 %r
4039+
}
4040+
4041+
define i32 @fold_zext_addition_fail(i8 %x) {
4042+
; CHECK-LABEL: @fold_zext_addition_fail(
4043+
; CHECK-NEXT: [[XX:%.*]] = or i8 [[X:%.*]], 12
4044+
; CHECK-NEXT: [[SE:%.*]] = zext i8 [[XX]] to i32
4045+
; CHECK-NEXT: [[R:%.*]] = add nuw nsw i32 [[SE]], 1234
4046+
; CHECK-NEXT: ret i32 [[R]]
4047+
;
4048+
%xx = or i8 %x, 12
4049+
%se = zext i8 %xx to i32
4050+
%r = add i32 %se, 1234
4051+
ret i32 %r
4052+
}
4053+
4054+
define i32 @fold_zext_addition_fail2(i8 %x) {
4055+
; CHECK-LABEL: @fold_zext_addition_fail2(
4056+
; CHECK-NEXT: [[XX:%.*]] = or i8 [[X:%.*]], 18
4057+
; CHECK-NEXT: [[SE:%.*]] = zext i8 [[XX]] to i32
4058+
; CHECK-NEXT: [[R:%.*]] = add nsw i32 [[SE]], -14
4059+
; CHECK-NEXT: ret i32 [[R]]
4060+
;
4061+
%xx = or i8 %x, 18
4062+
%se = zext i8 %xx to i32
4063+
%r = add i32 %se, -14
4064+
ret i32 %r
4065+
}
4066+
4067+
39894068
declare void @llvm.assume(i1)
39904069
declare void @fake_func(i32)

llvm/test/Transforms/InstCombine/div.ll

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1810,3 +1810,29 @@ define i6 @udiv_distribute_mul_nsw_add_nuw(i6 %x) {
18101810
%div = udiv i6 %add, 3
18111811
ret i6 %div
18121812
}
1813+
1814+
define i32 @fold_disjoint_or_over_sdiv(i32 %x) {
1815+
; CHECK-LABEL: @fold_disjoint_or_over_sdiv(
1816+
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[X:%.*]], 9
1817+
; CHECK-NEXT: [[OR:%.*]] = or disjoint i32 [[MUL]], 81
1818+
; CHECK-NEXT: [[R:%.*]] = sdiv i32 [[OR]], 9
1819+
; CHECK-NEXT: ret i32 [[R]]
1820+
;
1821+
%mul = mul nsw i32 %x, 9
1822+
%or = or disjoint i32 %mul, 81
1823+
%r = sdiv i32 %or, 9
1824+
ret i32 %r
1825+
}
1826+
1827+
define i32 @fold_disjoint_or_over_udiv(i32 %x) {
1828+
; CHECK-LABEL: @fold_disjoint_or_over_udiv(
1829+
; CHECK-NEXT: [[MUL:%.*]] = mul nuw i32 [[X:%.*]], 9
1830+
; CHECK-NEXT: [[OR:%.*]] = or disjoint i32 [[MUL]], 81
1831+
; CHECK-NEXT: [[R:%.*]] = udiv i32 [[OR]], 9
1832+
; CHECK-NEXT: ret i32 [[R]]
1833+
;
1834+
%mul = mul nuw i32 %x, 9
1835+
%or = or disjoint i32 %mul, 81
1836+
%r = udiv i32 %or, 9
1837+
ret i32 %r
1838+
}

llvm/test/Transforms/InstCombine/sadd-with-overflow.ll

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,36 @@ define { i32, i1 } @fold_sub_simple(i32 %x) {
122122
%b = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a, i32 30)
123123
ret { i32, i1 } %b
124124
}
125+
126+
define { i32, i1 } @fold_with_distjoin_or(i32 %x) {
127+
; CHECK-LABEL: @fold_with_distjoin_or(
128+
; CHECK-NEXT: [[B:%.*]] = add i32 [[X:%.*]], 6
129+
; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { i32, i1 } { i32 poison, i1 false }, i32 [[B]], 0
130+
; CHECK-NEXT: ret { i32, i1 } [[TMP1]]
131+
;
132+
%a = or disjoint i32 %x, 13
133+
%b = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a, i32 -7)
134+
ret { i32, i1 } %b
135+
}
136+
137+
define { i32, i1 } @fold_with_disjoint_or2(i32 %x) {
138+
; CHECK-LABEL: @fold_with_disjoint_or2(
139+
; CHECK-NEXT: [[A:%.*]] = or disjoint i32 [[X:%.*]], 100
140+
; CHECK-NEXT: [[B:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[A]], i32 27)
141+
; CHECK-NEXT: ret { i32, i1 } [[B]]
142+
;
143+
%a = or disjoint i32 %x, 100
144+
%b = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a, i32 27)
145+
ret { i32, i1 } %b
146+
}
147+
148+
define { i32, i1 } @fold_with_or_fail(i32 %x) {
149+
; CHECK-LABEL: @fold_with_or_fail(
150+
; CHECK-NEXT: [[A:%.*]] = or i32 [[X:%.*]], 100
151+
; CHECK-NEXT: [[B:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[A]], i32 27)
152+
; CHECK-NEXT: ret { i32, i1 } [[B]]
153+
;
154+
%a = or i32 %x, 100
155+
%b = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a, i32 27)
156+
ret { i32, i1 } %b
157+
}

llvm/test/Transforms/InstCombine/shift-add.ll

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,3 +775,36 @@ define <3 x i32> @add3_i96(<3 x i32> %0, <3 x i32> %1) {
775775
%25 = insertelement <3 x i32> %24, i32 %20, i32 2
776776
ret <3 x i32> %25
777777
}
778+
779+
define i8 @shl_fold_or_disjoint_cnt(i8 %x) {
780+
; CHECK-LABEL: @shl_fold_or_disjoint_cnt(
781+
; CHECK-NEXT: [[A:%.*]] = or disjoint i8 [[X:%.*]], 3
782+
; CHECK-NEXT: [[R:%.*]] = shl i8 2, [[A]]
783+
; CHECK-NEXT: ret i8 [[R]]
784+
;
785+
%a = or disjoint i8 %x, 3
786+
%r = shl i8 2, %a
787+
ret i8 %r
788+
}
789+
790+
define <2 x i8> @ashr_fold_or_disjoint_cnt(<2 x i8> %x) {
791+
; CHECK-LABEL: @ashr_fold_or_disjoint_cnt(
792+
; CHECK-NEXT: [[A:%.*]] = or disjoint <2 x i8> [[X:%.*]], <i8 3, i8 1>
793+
; CHECK-NEXT: [[R:%.*]] = lshr <2 x i8> <i8 2, i8 3>, [[A]]
794+
; CHECK-NEXT: ret <2 x i8> [[R]]
795+
;
796+
%a = or disjoint <2 x i8> %x, <i8 3, i8 1>
797+
%r = ashr <2 x i8> <i8 2, i8 3>, %a
798+
ret <2 x i8> %r
799+
}
800+
801+
define <2 x i8> @lshr_fold_or_disjoint_cnt_out_of_bounds(<2 x i8> %x) {
802+
; CHECK-LABEL: @lshr_fold_or_disjoint_cnt_out_of_bounds(
803+
; CHECK-NEXT: [[A:%.*]] = or disjoint <2 x i8> [[X:%.*]], <i8 3, i8 8>
804+
; CHECK-NEXT: [[R:%.*]] = lshr <2 x i8> <i8 2, i8 3>, [[A]]
805+
; CHECK-NEXT: ret <2 x i8> [[R]]
806+
;
807+
%a = or disjoint <2 x i8> %x, <i8 3, i8 8>
808+
%r = lshr <2 x i8> <i8 2, i8 3>, %a
809+
ret <2 x i8> %r
810+
}

llvm/test/Transforms/InstCombine/uadd-with-overflow.ll

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,27 @@ define { i32, i1 } @no_fold_wrapped_add(i32 %x) {
124124
%b = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 30, i32 %a)
125125
ret { i32, i1 } %b
126126
}
127+
128+
129+
define { <2 x i32>, <2 x i1> } @fold_simple_splat_with_disjoint_or_constant(<2 x i32> %x) {
130+
; CHECK-LABEL: @fold_simple_splat_with_disjoint_or_constant(
131+
; CHECK-NEXT: [[A:%.*]] = or disjoint <2 x i32> [[X:%.*]], <i32 12, i32 12>
132+
; CHECK-NEXT: [[B:%.*]] = tail call { <2 x i32>, <2 x i1> } @llvm.uadd.with.overflow.v2i32(<2 x i32> [[A]], <2 x i32> <i32 30, i32 30>)
133+
; CHECK-NEXT: ret { <2 x i32>, <2 x i1> } [[B]]
134+
;
135+
%a = or disjoint <2 x i32> %x, <i32 12, i32 12>
136+
%b = tail call { <2 x i32>, <2 x i1> } @llvm.uadd.with.overflow.v2i32(<2 x i32> %a, <2 x i32> <i32 30, i32 30>)
137+
ret { <2 x i32>, <2 x i1> } %b
138+
}
139+
140+
141+
define { <2 x i32>, <2 x i1> } @fold_simple_splat_constant_with_or_fail(<2 x i32> %x) {
142+
; CHECK-LABEL: @fold_simple_splat_constant_with_or_fail(
143+
; CHECK-NEXT: [[A:%.*]] = or <2 x i32> [[X:%.*]], <i32 12, i32 12>
144+
; CHECK-NEXT: [[B:%.*]] = tail call { <2 x i32>, <2 x i1> } @llvm.uadd.with.overflow.v2i32(<2 x i32> [[A]], <2 x i32> <i32 30, i32 30>)
145+
; CHECK-NEXT: ret { <2 x i32>, <2 x i1> } [[B]]
146+
;
147+
%a = or <2 x i32> %x, <i32 12, i32 12>
148+
%b = tail call { <2 x i32>, <2 x i1> } @llvm.uadd.with.overflow.v2i32(<2 x i32> %a, <2 x i32> <i32 30, i32 30>)
149+
ret { <2 x i32>, <2 x i1> } %b
150+
}

0 commit comments

Comments
 (0)