xref: /llvm-project/llvm/test/Analysis/ValueTracking/knownbits-abs.ll (revision 4fd3401e76b6a153c617a13aa399bf5095f206f9)
1261e5d09SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2261e5d09SNoah Goldstein; RUN: opt -passes=instsimplify -S < %s | FileCheck %s
3261e5d09SNoah Goldsteindeclare i8 @llvm.abs.i8(i8, i1)
4261e5d09SNoah Goldstein
5261e5d09SNoah Goldsteindefine i1 @abs_low_bit_set(i8 %x) {
6261e5d09SNoah Goldstein; CHECK-LABEL: @abs_low_bit_set(
7*4fd3401eSNoah Goldstein; CHECK-NEXT:    ret i1 false
8261e5d09SNoah Goldstein;
9261e5d09SNoah Goldstein  %xx = and i8 %x, 240
10261e5d09SNoah Goldstein  %v = or i8 %xx, 4
11261e5d09SNoah Goldstein  %abs = call i8 @llvm.abs.i8(i8 %v, i1 true)
12261e5d09SNoah Goldstein  %and = and i8 %abs, 4
13261e5d09SNoah Goldstein  %r = icmp eq i8 %and, 0
14261e5d09SNoah Goldstein  ret i1 %r
15261e5d09SNoah Goldstein}
16261e5d09SNoah Goldstein
17261e5d09SNoah Goldsteindefine i1 @abs_unknown_low_bit_set_fail(i8 %x) {
18261e5d09SNoah Goldstein; CHECK-LABEL: @abs_unknown_low_bit_set_fail(
19261e5d09SNoah Goldstein; CHECK-NEXT:    [[V:%.*]] = or i8 [[X:%.*]], 2
20261e5d09SNoah Goldstein; CHECK-NEXT:    [[ABS:%.*]] = call i8 @llvm.abs.i8(i8 [[V]], i1 true)
21261e5d09SNoah Goldstein; CHECK-NEXT:    [[AND:%.*]] = and i8 [[ABS]], 2
22261e5d09SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 0
23261e5d09SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
24261e5d09SNoah Goldstein;
25261e5d09SNoah Goldstein  %v = or i8 %x, 2
26261e5d09SNoah Goldstein  %abs = call i8 @llvm.abs.i8(i8 %v, i1 true)
27261e5d09SNoah Goldstein  %and = and i8 %abs, 2
28261e5d09SNoah Goldstein  %r = icmp eq i8 %and, 0
29261e5d09SNoah Goldstein  ret i1 %r
30261e5d09SNoah Goldstein}
31261e5d09SNoah Goldstein
32261e5d09SNoah Goldsteindefine i1 @abs_negative(i8 %x) {
33261e5d09SNoah Goldstein; CHECK-LABEL: @abs_negative(
34*4fd3401eSNoah Goldstein; CHECK-NEXT:    ret i1 false
35261e5d09SNoah Goldstein;
36261e5d09SNoah Goldstein  %xx = and i8 %x, 240
37261e5d09SNoah Goldstein  %v = or i8 %xx, 132
38261e5d09SNoah Goldstein  %abs = call i8 @llvm.abs.i8(i8 %v, i1 true)
39261e5d09SNoah Goldstein  %and = and i8 %abs, 8
40261e5d09SNoah Goldstein  %r = icmp eq i8 %and, 0
41261e5d09SNoah Goldstein  ret i1 %r
42261e5d09SNoah Goldstein}
43261e5d09SNoah Goldstein
44261e5d09SNoah Goldsteindefine i1 @abs_negative2(i8 %x) {
45261e5d09SNoah Goldstein; CHECK-LABEL: @abs_negative2(
46*4fd3401eSNoah Goldstein; CHECK-NEXT:    ret i1 false
47261e5d09SNoah Goldstein;
48261e5d09SNoah Goldstein  %v = or i8 %x, 131
49261e5d09SNoah Goldstein  %abs = call i8 @llvm.abs.i8(i8 %v, i1 true)
50261e5d09SNoah Goldstein  %and = and i8 %abs, 2
51261e5d09SNoah Goldstein  %r = icmp eq i8 %and, 2
52261e5d09SNoah Goldstein  ret i1 %r
53261e5d09SNoah Goldstein}
54261e5d09SNoah Goldstein
55261e5d09SNoah Goldsteindefine i1 @abs_negative_no_carry_info_fail(i8 %x) {
56261e5d09SNoah Goldstein; CHECK-LABEL: @abs_negative_no_carry_info_fail(
57261e5d09SNoah Goldstein; CHECK-NEXT:    [[V:%.*]] = or i8 [[X:%.*]], -126
58261e5d09SNoah Goldstein; CHECK-NEXT:    [[ABS:%.*]] = call i8 @llvm.abs.i8(i8 [[V]], i1 true)
59261e5d09SNoah Goldstein; CHECK-NEXT:    [[AND:%.*]] = and i8 [[ABS]], 2
60261e5d09SNoah Goldstein; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 0
61261e5d09SNoah Goldstein; CHECK-NEXT:    ret i1 [[R]]
62261e5d09SNoah Goldstein;
63261e5d09SNoah Goldstein  %v = or i8 %x, 130
64261e5d09SNoah Goldstein  %abs = call i8 @llvm.abs.i8(i8 %v, i1 true)
65261e5d09SNoah Goldstein  %and = and i8 %abs, 2
66261e5d09SNoah Goldstein  %r = icmp eq i8 %and, 0
67261e5d09SNoah Goldstein  ret i1 %r
68261e5d09SNoah Goldstein}
69