xref: /llvm-project/llvm/test/Transforms/InstCombine/sdiv-icmp.ll (revision ddd18d02c71be4b683a2f9440c7c0d9c4ca4abe8)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3
4declare void @use.i8(i8)
5define i1 @sdiv_exact_eq_0(i8 %x, i8 %y) {
6; CHECK-LABEL: @sdiv_exact_eq_0(
7; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[X:%.*]], 0
8; CHECK-NEXT:    ret i1 [[R]]
9;
10  %d = sdiv exact i8 %x, %y
11  %r = icmp eq i8 %d, 0
12  ret i1 %r
13}
14
15define i1 @udiv_exact_ne_0(i8 %x, i8 %y) {
16; CHECK-LABEL: @udiv_exact_ne_0(
17; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[X:%.*]], 0
18; CHECK-NEXT:    ret i1 [[R]]
19;
20  %d = udiv exact i8 %x, %y
21  %r = icmp ne i8 %d, 0
22  ret i1 %r
23}
24
25define i1 @sdiv_exact_ne_1(i8 %x, i8 %y) {
26; CHECK-LABEL: @sdiv_exact_ne_1(
27; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[X:%.*]], 0
28; CHECK-NEXT:    ret i1 [[R]]
29;
30  %d = sdiv exact i8 %x, %y
31  %r = icmp eq i8 %d, 0
32  ret i1 %r
33}
34
35define i1 @udiv_exact_eq_1(i8 %x, i8 %y) {
36; CHECK-LABEL: @udiv_exact_eq_1(
37; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]]
38; CHECK-NEXT:    ret i1 [[R]]
39;
40  %d = udiv exact i8 %x, %y
41  %r = icmp ne i8 %d, 1
42  ret i1 %r
43}
44
45define i1 @sdiv_exact_eq_9_no_of(i8 %x, i8 %y) {
46; CHECK-LABEL: @sdiv_exact_eq_9_no_of(
47; CHECK-NEXT:    [[YY:%.*]] = and i8 [[Y:%.*]], 7
48; CHECK-NEXT:    [[TMP1:%.*]] = mul nuw nsw i8 [[YY]], 9
49; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[TMP1]], [[X:%.*]]
50; CHECK-NEXT:    ret i1 [[R]]
51;
52  %yy = and i8 %y, 7
53  %d = sdiv exact i8 %x, %yy
54  %r = icmp eq i8 %d, 9
55  ret i1 %r
56}
57
58define i1 @sdiv_exact_eq_9_may_of(i8 %x, i8 %y) {
59; CHECK-LABEL: @sdiv_exact_eq_9_may_of(
60; CHECK-NEXT:    [[D:%.*]] = sdiv exact i8 [[X:%.*]], [[Y:%.*]]
61; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[D]], 9
62; CHECK-NEXT:    ret i1 [[R]]
63;
64  %d = sdiv exact i8 %x, %y
65  %r = icmp eq i8 %d, 9
66  ret i1 %r
67}
68
69define i1 @sdiv_exact_eq_9_no_of_fail_multiuse(i8 %x, i8 %y) {
70; CHECK-LABEL: @sdiv_exact_eq_9_no_of_fail_multiuse(
71; CHECK-NEXT:    [[YY:%.*]] = and i8 [[Y:%.*]], 7
72; CHECK-NEXT:    [[D:%.*]] = sdiv exact i8 [[X:%.*]], [[YY]]
73; CHECK-NEXT:    call void @use.i8(i8 [[D]])
74; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[D]], 9
75; CHECK-NEXT:    ret i1 [[R]]
76;
77  %yy = and i8 %y, 7
78  %d = sdiv exact i8 %x, %yy
79  call void @use.i8(i8 %d)
80  %r = icmp eq i8 %d, 9
81  ret i1 %r
82}
83
84define i1 @sdiv_exact_eq_9_must_of_todo_is_false(i8 %x, i8 %y) {
85; CHECK-LABEL: @sdiv_exact_eq_9_must_of_todo_is_false(
86; CHECK-NEXT:    [[YY:%.*]] = or i8 [[Y:%.*]], 55
87; CHECK-NEXT:    [[D:%.*]] = sdiv exact i8 [[X:%.*]], [[YY]]
88; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[D]], 9
89; CHECK-NEXT:    ret i1 [[R]]
90;
91  %yy = or i8 %y, 55
92  %d = sdiv exact i8 %x, %yy
93  %r = icmp eq i8 %d, 9
94  ret i1 %r
95}
96
97define i1 @udiv_exact_ne_30_no_of(i8 %x, i8 %y) {
98; CHECK-LABEL: @udiv_exact_ne_30_no_of(
99; CHECK-NEXT:    [[YY:%.*]] = and i8 [[Y:%.*]], 7
100; CHECK-NEXT:    [[TMP1:%.*]] = mul nuw i8 [[YY]], 30
101; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[TMP1]], [[X:%.*]]
102; CHECK-NEXT:    ret i1 [[R]]
103;
104  %yy = and i8 %y, 7
105  %d = udiv exact i8 %x, %yy
106  %r = icmp ne i8 %d, 30
107  ret i1 %r
108}
109