xref: /llvm-project/llvm/test/Analysis/ValueTracking/knownbits-div.ll (revision 124547eae8a610a9a77fe3e219e9cd98a2580cfe)
153a079c8SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
253a079c8SNoah Goldstein; RUN: opt -passes=instsimplify -S < %s | FileCheck %s
353a079c8SNoah Goldstein
453a079c8SNoah Goldsteindefine i1 @sdiv_neg_neg_high_bits(i8 %x, i8 %y) {
553a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_neg_neg_high_bits(
6*124547eaSNoah Goldstein; CHECK-NEXT:    ret i1 false
753a079c8SNoah Goldstein;
853a079c8SNoah Goldstein  %num = or i8 %x, 128
953a079c8SNoah Goldstein  %denum = or i8 %y, 131
1053a079c8SNoah Goldstein  %div = sdiv i8 %num, %denum
1153a079c8SNoah Goldstein  %and = and i8 %div, 128
1253a079c8SNoah Goldstein  %r = icmp eq i8 %and, 128
1353a079c8SNoah Goldstein  ret i1 %r
1453a079c8SNoah Goldstein}
1553a079c8SNoah Goldstein
1653a079c8SNoah Goldsteindefine i1 @sdiv_pos_neg_high_bits(i8 %x, i8 %y) {
1753a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_pos_neg_high_bits(
18*124547eaSNoah Goldstein; CHECK-NEXT:    ret i1 false
1953a079c8SNoah Goldstein;
2053a079c8SNoah Goldstein  %xx = and i8 %x, 127
2153a079c8SNoah Goldstein  %num = or i8 %xx, 49
2253a079c8SNoah Goldstein  %denum = or i8 %y, 241
2353a079c8SNoah Goldstein  %div = sdiv i8 %num, %denum
2453a079c8SNoah Goldstein  %and = and i8 %div, 128
2553a079c8SNoah Goldstein  %r = icmp eq i8 %and, 0
2653a079c8SNoah Goldstein  ret i1 %r
2753a079c8SNoah Goldstein}
2853a079c8SNoah Goldstein
2953a079c8SNoah Goldsteindefine i1 @sdiv_pos_neg_high_bits_fail_maybez(i8 %x, i8 %y) {
3053a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_pos_neg_high_bits_fail_maybez(
3153a079c8SNoah Goldstein; CHECK-NEXT:    [[XX:%.*]] = and i8 [[X:%.*]], 127
3253a079c8SNoah Goldstein; CHECK-NEXT:    [[NUM:%.*]] = or i8 [[XX]], 49
3353a079c8SNoah Goldstein; CHECK-NEXT:    [[DENUM:%.*]] = or i8 [[Y:%.*]], -64
3453a079c8SNoah Goldstein; CHECK-NEXT:    [[DIV:%.*]] = sdiv i8 [[NUM]], [[DENUM]]
3553a079c8SNoah Goldstein; CHECK-NEXT:    [[AND:%.*]] = and i8 [[DIV]], -128
3653a079c8SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 0
3753a079c8SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
3853a079c8SNoah Goldstein;
3953a079c8SNoah Goldstein  %xx = and i8 %x, 127
4053a079c8SNoah Goldstein  %num = or i8 %xx, 49
4153a079c8SNoah Goldstein  %denum = or i8 %y, 192
4253a079c8SNoah Goldstein  %div = sdiv i8 %num, %denum
4353a079c8SNoah Goldstein  %and = and i8 %div, 128
4453a079c8SNoah Goldstein  %r = icmp eq i8 %and, 0
4553a079c8SNoah Goldstein  ret i1 %r
4653a079c8SNoah Goldstein}
4753a079c8SNoah Goldstein
4853a079c8SNoah Goldsteindefine i1 @sdiv_exact_pos_neg_high_bits(i8 %x, i8 %y) {
4953a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_exact_pos_neg_high_bits(
50*124547eaSNoah Goldstein; CHECK-NEXT:    ret i1 false
5153a079c8SNoah Goldstein;
5253a079c8SNoah Goldstein  %xx = and i8 %x, 127
5353a079c8SNoah Goldstein  %num = or i8 %xx, 49
5453a079c8SNoah Goldstein  %denum = or i8 %y, 192
5553a079c8SNoah Goldstein  %div = sdiv exact i8 %num, %denum
5653a079c8SNoah Goldstein  %and = and i8 %div, 128
5753a079c8SNoah Goldstein  %r = icmp eq i8 %and, 0
5853a079c8SNoah Goldstein  ret i1 %r
5953a079c8SNoah Goldstein}
6053a079c8SNoah Goldstein
6153a079c8SNoah Goldsteindefine i1 @sdiv_neg_pos_high_bits(i8 %x, i8 %y) {
6253a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_neg_pos_high_bits(
63*124547eaSNoah Goldstein; CHECK-NEXT:    ret i1 false
6453a079c8SNoah Goldstein;
6553a079c8SNoah Goldstein  %xx = and i8 %x, 159
6653a079c8SNoah Goldstein  %num = or i8 %xx, 129
6753a079c8SNoah Goldstein  %yy = and i8 %y, 15
6853a079c8SNoah Goldstein  %denum = or i8 %yy, 9
6953a079c8SNoah Goldstein  %div = sdiv i8 %num, %denum
7053a079c8SNoah Goldstein  %and = and i8 %div, 128
7153a079c8SNoah Goldstein  %r = icmp eq i8 %and, 0
7253a079c8SNoah Goldstein  ret i1 %r
7353a079c8SNoah Goldstein}
7453a079c8SNoah Goldstein
7553a079c8SNoah Goldsteindefine i1 @sdiv_neg_pos_high_bits_fail_maybez(i8 %x, i8 %y) {
7653a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_neg_pos_high_bits_fail_maybez(
7753a079c8SNoah Goldstein; CHECK-NEXT:    [[NUM:%.*]] = or i8 [[X:%.*]], -128
7853a079c8SNoah Goldstein; CHECK-NEXT:    [[YY:%.*]] = and i8 [[Y:%.*]], 15
7953a079c8SNoah Goldstein; CHECK-NEXT:    [[DENUM:%.*]] = or i8 [[YY]], 9
8053a079c8SNoah Goldstein; CHECK-NEXT:    [[DIV:%.*]] = sdiv i8 [[NUM]], [[DENUM]]
8153a079c8SNoah Goldstein; CHECK-NEXT:    [[AND:%.*]] = and i8 [[DIV]], -128
8253a079c8SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 0
8353a079c8SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
8453a079c8SNoah Goldstein;
8553a079c8SNoah Goldstein  %num = or i8 %x, 128
8653a079c8SNoah Goldstein  %yy = and i8 %y, 15
8753a079c8SNoah Goldstein  %denum = or i8 %yy, 9
8853a079c8SNoah Goldstein  %div = sdiv i8 %num, %denum
8953a079c8SNoah Goldstein  %and = and i8 %div, 128
9053a079c8SNoah Goldstein  %r = icmp eq i8 %and, 0
9153a079c8SNoah Goldstein  ret i1 %r
9253a079c8SNoah Goldstein}
9353a079c8SNoah Goldstein
9453a079c8SNoah Goldsteindefine i1 @sdiv_exact_odd_odd(i8 %x, i8 %y) {
9553a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_exact_odd_odd(
96*124547eaSNoah Goldstein; CHECK-NEXT:    ret i1 false
9753a079c8SNoah Goldstein;
9853a079c8SNoah Goldstein  %num = or i8 %x, 1
9953a079c8SNoah Goldstein  %denum = or i8 %y, 1
10053a079c8SNoah Goldstein  %div = sdiv exact i8 %num, %denum
10153a079c8SNoah Goldstein  %and = and i8 %div, 1
10253a079c8SNoah Goldstein  %r = icmp eq i8 %and, 0
10353a079c8SNoah Goldstein  ret i1 %r
10453a079c8SNoah Goldstein}
10553a079c8SNoah Goldstein
10653a079c8SNoah Goldsteindefine i1 @sdiv_exact_even_odd(i8 %x, i8 %y) {
10753a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_exact_even_odd(
108*124547eaSNoah Goldstein; CHECK-NEXT:    ret i1 false
10953a079c8SNoah Goldstein;
11053a079c8SNoah Goldstein  %num = and i8 %x, -2
11153a079c8SNoah Goldstein  %denum = or i8 %y, 1
11253a079c8SNoah Goldstein  %div = sdiv exact i8 %num, %denum
11353a079c8SNoah Goldstein  %and = and i8 %div, 1
11453a079c8SNoah Goldstein  %r = icmp eq i8 %and, 1
11553a079c8SNoah Goldstein  ret i1 %r
11653a079c8SNoah Goldstein}
11753a079c8SNoah Goldstein
11853a079c8SNoah Goldsteindefine i1 @sdiv_exact_even_even_fail_unknown(i8 %x, i8 %y) {
11953a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_exact_even_even_fail_unknown(
12053a079c8SNoah Goldstein; CHECK-NEXT:    [[NUM:%.*]] = and i8 [[X:%.*]], -2
12153a079c8SNoah Goldstein; CHECK-NEXT:    [[DENUM:%.*]] = and i8 [[Y:%.*]], -2
12253a079c8SNoah Goldstein; CHECK-NEXT:    [[DIV:%.*]] = sdiv exact i8 [[NUM]], [[DENUM]]
12353a079c8SNoah Goldstein; CHECK-NEXT:    [[AND:%.*]] = and i8 [[DIV]], 1
12453a079c8SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 1
12553a079c8SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
12653a079c8SNoah Goldstein;
12753a079c8SNoah Goldstein  %num = and i8 %x, -2
12853a079c8SNoah Goldstein  %denum = and i8 %y, -2
12953a079c8SNoah Goldstein  %div = sdiv exact i8 %num, %denum
13053a079c8SNoah Goldstein  %and = and i8 %div, 1
13153a079c8SNoah Goldstein  %r = icmp eq i8 %and, 1
13253a079c8SNoah Goldstein  ret i1 %r
13353a079c8SNoah Goldstein}
13453a079c8SNoah Goldstein
13553a079c8SNoah Goldsteindefine i1 @sdiv_exact_even_even_fail_unknown2(i8 %x, i8 %y) {
13653a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_exact_even_even_fail_unknown2(
13753a079c8SNoah Goldstein; CHECK-NEXT:    [[NUM:%.*]] = and i8 [[X:%.*]], -2
13853a079c8SNoah Goldstein; CHECK-NEXT:    [[DENUM:%.*]] = and i8 [[Y:%.*]], -2
13953a079c8SNoah Goldstein; CHECK-NEXT:    [[DIV:%.*]] = sdiv exact i8 [[NUM]], [[DENUM]]
14053a079c8SNoah Goldstein; CHECK-NEXT:    [[AND:%.*]] = and i8 [[DIV]], 1
14153a079c8SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 0
14253a079c8SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
14353a079c8SNoah Goldstein;
14453a079c8SNoah Goldstein  %num = and i8 %x, -2
14553a079c8SNoah Goldstein  %denum = and i8 %y, -2
14653a079c8SNoah Goldstein  %div = sdiv exact i8 %num, %denum
14753a079c8SNoah Goldstein  %and = and i8 %div, 1
14853a079c8SNoah Goldstein  %r = icmp eq i8 %and, 0
14953a079c8SNoah Goldstein  ret i1 %r
15053a079c8SNoah Goldstein}
15153a079c8SNoah Goldstein
15253a079c8SNoah Goldsteindefine i1 @udiv_high_bits(i8 %x, i8 %y) {
15353a079c8SNoah Goldstein; CHECK-LABEL: @udiv_high_bits(
1547d05ab99SNoah Goldstein; CHECK-NEXT:    ret i1 false
15553a079c8SNoah Goldstein;
15653a079c8SNoah Goldstein  %num = and i8 %x, 129
15753a079c8SNoah Goldstein  %denum = or i8 %y, 31
15853a079c8SNoah Goldstein  %div = udiv i8 %num, %denum
15953a079c8SNoah Goldstein  %and = and i8 %div, 8
16053a079c8SNoah Goldstein  %r = icmp eq i8 %and, 8
16153a079c8SNoah Goldstein  ret i1 %r
16253a079c8SNoah Goldstein}
16353a079c8SNoah Goldstein
16453a079c8SNoah Goldsteindefine i1 @udiv_exact_odd_odd(i8 %x, i8 %y) {
16553a079c8SNoah Goldstein; CHECK-LABEL: @udiv_exact_odd_odd(
16699795afbSNoah Goldstein; CHECK-NEXT:    ret i1 false
16753a079c8SNoah Goldstein;
16853a079c8SNoah Goldstein  %num = or i8 %x, 1
16953a079c8SNoah Goldstein  %denum = or i8 %y, 1
17053a079c8SNoah Goldstein  %div = udiv exact i8 %num, %denum
17153a079c8SNoah Goldstein  %and = and i8 %div, 1
17253a079c8SNoah Goldstein  %r = icmp eq i8 %and, 0
17353a079c8SNoah Goldstein  ret i1 %r
17453a079c8SNoah Goldstein}
17553a079c8SNoah Goldstein
17653a079c8SNoah Goldsteindefine i1 @udiv_exact_even_odd(i8 %x, i8 %y) {
17753a079c8SNoah Goldstein; CHECK-LABEL: @udiv_exact_even_odd(
17899795afbSNoah Goldstein; CHECK-NEXT:    ret i1 false
17953a079c8SNoah Goldstein;
18053a079c8SNoah Goldstein  %num = and i8 %x, -2
18153a079c8SNoah Goldstein  %denum = or i8 %y, 1
18253a079c8SNoah Goldstein  %div = udiv exact i8 %num, %denum
18353a079c8SNoah Goldstein  %and = and i8 %div, 1
18453a079c8SNoah Goldstein  %r = icmp eq i8 %and, 1
18553a079c8SNoah Goldstein  ret i1 %r
18653a079c8SNoah Goldstein}
18753a079c8SNoah Goldstein
18853a079c8SNoah Goldsteindefine i1 @udiv_exact_even_even_fail_unknown(i8 %x, i8 %y) {
18953a079c8SNoah Goldstein; CHECK-LABEL: @udiv_exact_even_even_fail_unknown(
19053a079c8SNoah Goldstein; CHECK-NEXT:    [[NUM:%.*]] = and i8 [[X:%.*]], -2
19153a079c8SNoah Goldstein; CHECK-NEXT:    [[DENUM:%.*]] = and i8 [[Y:%.*]], -2
19253a079c8SNoah Goldstein; CHECK-NEXT:    [[DIV:%.*]] = udiv exact i8 [[NUM]], [[DENUM]]
19353a079c8SNoah Goldstein; CHECK-NEXT:    [[AND:%.*]] = and i8 [[DIV]], 1
19453a079c8SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 1
19553a079c8SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
19653a079c8SNoah Goldstein;
19753a079c8SNoah Goldstein  %num = and i8 %x, -2
19853a079c8SNoah Goldstein  %denum = and i8 %y, -2
19953a079c8SNoah Goldstein  %div = udiv exact i8 %num, %denum
20053a079c8SNoah Goldstein  %and = and i8 %div, 1
20153a079c8SNoah Goldstein  %r = icmp eq i8 %and, 1
20253a079c8SNoah Goldstein  ret i1 %r
20353a079c8SNoah Goldstein}
20453a079c8SNoah Goldstein
20553a079c8SNoah Goldsteindefine i1 @udiv_exact_even_even_fail_unknown2(i8 %x, i8 %y) {
20653a079c8SNoah Goldstein; CHECK-LABEL: @udiv_exact_even_even_fail_unknown2(
20753a079c8SNoah Goldstein; CHECK-NEXT:    [[NUM:%.*]] = and i8 [[X:%.*]], -2
20853a079c8SNoah Goldstein; CHECK-NEXT:    [[DENUM:%.*]] = and i8 [[Y:%.*]], -2
20953a079c8SNoah Goldstein; CHECK-NEXT:    [[DIV:%.*]] = udiv exact i8 [[NUM]], [[DENUM]]
21053a079c8SNoah Goldstein; CHECK-NEXT:    [[AND:%.*]] = and i8 [[DIV]], 1
21153a079c8SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 0
21253a079c8SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
21353a079c8SNoah Goldstein;
21453a079c8SNoah Goldstein  %num = and i8 %x, -2
21553a079c8SNoah Goldstein  %denum = and i8 %y, -2
21653a079c8SNoah Goldstein  %div = udiv exact i8 %num, %denum
21753a079c8SNoah Goldstein  %and = and i8 %div, 1
21853a079c8SNoah Goldstein  %r = icmp eq i8 %and, 0
21953a079c8SNoah Goldstein  ret i1 %r
22053a079c8SNoah Goldstein}
221