xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/abs.ll (revision 4d8e849dfbf3ca1301f208a7286b31215d2a94db)
11efc0a38SAlexander Shaposhnikov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
21efc0a38SAlexander Shaposhnikov; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
31efc0a38SAlexander Shaposhnikov
41efc0a38SAlexander Shaposhnikovdefine i1 @abs_int_min_is_not_poison(i32 %arg) {
51efc0a38SAlexander Shaposhnikov; CHECK-LABEL: define i1 @abs_int_min_is_not_poison(
61efc0a38SAlexander Shaposhnikov; CHECK-SAME: i32 [[ARG:%.*]]) {
71efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false)
83af59cfeSAlexander Shaposhnikov; CHECK-NEXT:    ret i1 true
91efc0a38SAlexander Shaposhnikov;
101efc0a38SAlexander Shaposhnikov  %abs = tail call i32 @llvm.abs.i32(i32 %arg, i1 false)
111efc0a38SAlexander Shaposhnikov  %cmp = icmp sge i32 %abs, %arg
121efc0a38SAlexander Shaposhnikov  ret i1 %cmp
131efc0a38SAlexander Shaposhnikov}
141efc0a38SAlexander Shaposhnikov
151efc0a38SAlexander Shaposhnikovdefine i1 @abs_int_min_is_poison(i32 %arg) {
161efc0a38SAlexander Shaposhnikov; CHECK-LABEL: define i1 @abs_int_min_is_poison(
171efc0a38SAlexander Shaposhnikov; CHECK-SAME: i32 [[ARG:%.*]]) {
181efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
193af59cfeSAlexander Shaposhnikov; CHECK-NEXT:    ret i1 true
201efc0a38SAlexander Shaposhnikov;
211efc0a38SAlexander Shaposhnikov  %abs = tail call i32 @llvm.abs.i32(i32 %arg, i1 true)
221efc0a38SAlexander Shaposhnikov  %cmp = icmp sge i32 %abs, %arg
231efc0a38SAlexander Shaposhnikov  ret i1 %cmp
241efc0a38SAlexander Shaposhnikov}
251efc0a38SAlexander Shaposhnikov
261efc0a38SAlexander Shaposhnikovdefine i1 @abs_plus_one(i32 %arg) {
271efc0a38SAlexander Shaposhnikov; CHECK-LABEL: define i1 @abs_plus_one(
281efc0a38SAlexander Shaposhnikov; CHECK-SAME: i32 [[ARG:%.*]]) {
291efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
301efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[ABS_PLUS_ONE:%.*]] = add nsw i32 [[ABS]], 1
313af59cfeSAlexander Shaposhnikov; CHECK-NEXT:    ret i1 true
321efc0a38SAlexander Shaposhnikov;
331efc0a38SAlexander Shaposhnikov  %abs = tail call i32 @llvm.abs.i32(i32 %arg, i1 true)
341efc0a38SAlexander Shaposhnikov  %abs_plus_one = add nsw i32 %abs, 1
351efc0a38SAlexander Shaposhnikov  %cmp = icmp sge i32 %abs_plus_one, %arg
361efc0a38SAlexander Shaposhnikov  ret i1 %cmp
371efc0a38SAlexander Shaposhnikov}
381efc0a38SAlexander Shaposhnikov
391efc0a38SAlexander Shaposhnikovdefine i1 @arg_minus_one_strict_less(i32 %arg) {
401efc0a38SAlexander Shaposhnikov; CHECK-LABEL: define i1 @arg_minus_one_strict_less(
411efc0a38SAlexander Shaposhnikov; CHECK-SAME: i32 [[ARG:%.*]]) {
421efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
431efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[ARG_MINUS_ONE:%.*]] = add nsw i32 [[ARG]], -1
443af59cfeSAlexander Shaposhnikov; CHECK-NEXT:    ret i1 true
451efc0a38SAlexander Shaposhnikov;
461efc0a38SAlexander Shaposhnikov  %abs = tail call i32 @llvm.abs.i32(i32 %arg, i1 true)
471efc0a38SAlexander Shaposhnikov  %arg_minus_one = add nsw i32 %arg, -1
481efc0a38SAlexander Shaposhnikov  %cmp = icmp slt i32 %arg_minus_one, %abs
491efc0a38SAlexander Shaposhnikov  ret i1 %cmp
501efc0a38SAlexander Shaposhnikov}
511efc0a38SAlexander Shaposhnikov
521efc0a38SAlexander Shaposhnikovdefine i1 @arg_minus_one_strict_greater(i32 %arg) {
531efc0a38SAlexander Shaposhnikov; CHECK-LABEL: define i1 @arg_minus_one_strict_greater(
541efc0a38SAlexander Shaposhnikov; CHECK-SAME: i32 [[ARG:%.*]]) {
551efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
561efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[ARG_MINUS_ONE:%.*]] = add nsw i32 [[ARG]], -1
573af59cfeSAlexander Shaposhnikov; CHECK-NEXT:    ret i1 false
581efc0a38SAlexander Shaposhnikov;
591efc0a38SAlexander Shaposhnikov  %abs = tail call i32 @llvm.abs.i32(i32 %arg, i1 true)
601efc0a38SAlexander Shaposhnikov  %arg_minus_one = add nsw i32 %arg, -1
611efc0a38SAlexander Shaposhnikov  %cmp = icmp sgt i32 %arg_minus_one, %abs
621efc0a38SAlexander Shaposhnikov  ret i1 %cmp
631efc0a38SAlexander Shaposhnikov}
641efc0a38SAlexander Shaposhnikov
651efc0a38SAlexander Shaposhnikovdefine i1 @abs_plus_one_unsigned_greater_or_equal_nonnegative_arg(i32 %arg) {
661efc0a38SAlexander Shaposhnikov; CHECK-LABEL: define i1 @abs_plus_one_unsigned_greater_or_equal_nonnegative_arg(
671efc0a38SAlexander Shaposhnikov; CHECK-SAME: i32 [[ARG:%.*]]) {
681efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[CMP_ARG_NONNEGATIVE:%.*]] = icmp sge i32 [[ARG]], 0
691efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP_ARG_NONNEGATIVE]])
701efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
711efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[ABS_PLUS_ONE:%.*]] = add nuw i32 [[ABS]], 1
723af59cfeSAlexander Shaposhnikov; CHECK-NEXT:    ret i1 true
731efc0a38SAlexander Shaposhnikov;
741efc0a38SAlexander Shaposhnikov  %cmp_arg_nonnegative = icmp sge i32 %arg, 0
751efc0a38SAlexander Shaposhnikov  call void @llvm.assume(i1 %cmp_arg_nonnegative)
761efc0a38SAlexander Shaposhnikov  %abs = tail call i32 @llvm.abs.i32(i32 %arg, i1 true)
771efc0a38SAlexander Shaposhnikov  %abs_plus_one = add nuw i32 %abs, 1
781efc0a38SAlexander Shaposhnikov  %cmp = icmp uge i32 %abs_plus_one, %arg
791efc0a38SAlexander Shaposhnikov  ret i1 %cmp
801efc0a38SAlexander Shaposhnikov}
811efc0a38SAlexander Shaposhnikov
821efc0a38SAlexander Shaposhnikovdefine i1 @abs_plus_one_unsigned_greater_or_equal_cannot_be_simplified(i32 %arg) {
831efc0a38SAlexander Shaposhnikov; CHECK-LABEL: define i1 @abs_plus_one_unsigned_greater_or_equal_cannot_be_simplified(
841efc0a38SAlexander Shaposhnikov; CHECK-SAME: i32 [[ARG:%.*]]) {
851efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
861efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[ABS_PLUS_ONE:%.*]] = add nuw i32 [[ABS]], 1
871efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i32 [[ABS_PLUS_ONE]], [[ARG]]
881efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    ret i1 [[CMP]]
891efc0a38SAlexander Shaposhnikov;
901efc0a38SAlexander Shaposhnikov  %abs = tail call i32 @llvm.abs.i32(i32 %arg, i1 true)
911efc0a38SAlexander Shaposhnikov  %abs_plus_one = add nuw i32 %abs, 1
921efc0a38SAlexander Shaposhnikov  %cmp = icmp uge i32 %abs_plus_one, %arg
931efc0a38SAlexander Shaposhnikov  ret i1 %cmp
941efc0a38SAlexander Shaposhnikov}
951efc0a38SAlexander Shaposhnikov
961efc0a38SAlexander Shaposhnikovdefine i1 @abs_constant_negative_arg() {
971efc0a38SAlexander Shaposhnikov; CHECK-LABEL: define i1 @abs_constant_negative_arg() {
981efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 -3, i1 false)
991efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 [[ABS]], 3
1001efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    ret i1 [[CMP]]
1011efc0a38SAlexander Shaposhnikov;
1021efc0a38SAlexander Shaposhnikov  %abs = tail call i32 @llvm.abs.i32(i32 -3, i1 false)
1031efc0a38SAlexander Shaposhnikov  %cmp = icmp sge i32 %abs, 3
1041efc0a38SAlexander Shaposhnikov  ret i1 %cmp
1051efc0a38SAlexander Shaposhnikov}
1061efc0a38SAlexander Shaposhnikov
1071efc0a38SAlexander Shaposhnikovdefine i1 @abs_constant_positive_arg() {
1081efc0a38SAlexander Shaposhnikov; CHECK-LABEL: define i1 @abs_constant_positive_arg() {
1091efc0a38SAlexander Shaposhnikov; CHECK-NEXT:    [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 3, i1 false)
1103af59cfeSAlexander Shaposhnikov; CHECK-NEXT:    ret i1 true
1111efc0a38SAlexander Shaposhnikov;
1121efc0a38SAlexander Shaposhnikov  %abs = tail call i32 @llvm.abs.i32(i32 3, i1 false)
1131efc0a38SAlexander Shaposhnikov  %cmp = icmp sge i32 %abs, 3
1141efc0a38SAlexander Shaposhnikov  ret i1 %cmp
1151efc0a38SAlexander Shaposhnikov}
1161efc0a38SAlexander Shaposhnikov
117eb98b500SAlexander Shaposhnikovdefine i1 @abs_is_nonnegative_except_for_int_min_if_int_min_is_not_poison(i32 %arg) {
118eb98b500SAlexander Shaposhnikov; CHECK-LABEL: define i1 @abs_is_nonnegative_except_for_int_min_if_int_min_is_not_poison(
119eb98b500SAlexander Shaposhnikov; CHECK-SAME: i32 [[ARG:%.*]]) {
120eb98b500SAlexander Shaposhnikov; CHECK-NEXT:    [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false)
121eb98b500SAlexander Shaposhnikov; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 [[ABS]], 0
122eb98b500SAlexander Shaposhnikov; CHECK-NEXT:    ret i1 [[CMP]]
123eb98b500SAlexander Shaposhnikov;
124eb98b500SAlexander Shaposhnikov  %abs = tail call i32 @llvm.abs.i32(i32 %arg, i1 false)
125eb98b500SAlexander Shaposhnikov  %cmp = icmp sge i32 %abs, 0
126eb98b500SAlexander Shaposhnikov  ret i1 %cmp
127eb98b500SAlexander Shaposhnikov}
128eb98b500SAlexander Shaposhnikov
129eb98b500SAlexander Shaposhnikovdefine i1 @abs_is_not_strictly_positive(i32 %arg) {
130eb98b500SAlexander Shaposhnikov; CHECK-LABEL: define i1 @abs_is_not_strictly_positive(
131eb98b500SAlexander Shaposhnikov; CHECK-SAME: i32 [[ARG:%.*]]) {
132eb98b500SAlexander Shaposhnikov; CHECK-NEXT:    [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
133eb98b500SAlexander Shaposhnikov; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[ABS]], 0
134eb98b500SAlexander Shaposhnikov; CHECK-NEXT:    ret i1 [[CMP]]
135eb98b500SAlexander Shaposhnikov;
136eb98b500SAlexander Shaposhnikov  %abs = tail call i32 @llvm.abs.i32(i32 %arg, i1 true)
137eb98b500SAlexander Shaposhnikov  %cmp = icmp sgt i32 %abs, 0
138eb98b500SAlexander Shaposhnikov  ret i1 %cmp
139eb98b500SAlexander Shaposhnikov}
140eb98b500SAlexander Shaposhnikov
141eb98b500SAlexander Shaposhnikovdefine i1 @abs_is_nonnegative_int_min_is_poison(i32 %arg) {
142eb98b500SAlexander Shaposhnikov; CHECK-LABEL: define i1 @abs_is_nonnegative_int_min_is_poison(
143eb98b500SAlexander Shaposhnikov; CHECK-SAME: i32 [[ARG:%.*]]) {
144eb98b500SAlexander Shaposhnikov; CHECK-NEXT:    [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
145*4d8e849dSAlexander Shaposhnikov; CHECK-NEXT:    ret i1 true
146eb98b500SAlexander Shaposhnikov;
147eb98b500SAlexander Shaposhnikov  %abs = tail call i32 @llvm.abs.i32(i32 %arg, i1 true)
148eb98b500SAlexander Shaposhnikov  %cmp = icmp sge i32 %abs, 0
149eb98b500SAlexander Shaposhnikov  ret i1 %cmp
150eb98b500SAlexander Shaposhnikov}
151eb98b500SAlexander Shaposhnikov
152eb98b500SAlexander Shaposhnikovdefine i1 @abs_is_nonnegative_constant_arg() {
153eb98b500SAlexander Shaposhnikov; CHECK-LABEL: define i1 @abs_is_nonnegative_constant_arg() {
154eb98b500SAlexander Shaposhnikov; CHECK-NEXT:    [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 -3, i1 true)
155*4d8e849dSAlexander Shaposhnikov; CHECK-NEXT:    ret i1 true
156eb98b500SAlexander Shaposhnikov;
157eb98b500SAlexander Shaposhnikov  %abs = tail call i32 @llvm.abs.i32(i32 -3, i1 true)
158eb98b500SAlexander Shaposhnikov  %cmp = icmp sge i32 %abs, 0
159eb98b500SAlexander Shaposhnikov  ret i1 %cmp
160eb98b500SAlexander Shaposhnikov}
161eb98b500SAlexander Shaposhnikov
1621efc0a38SAlexander Shaposhnikovdeclare i32 @llvm.abs.i32(i32, i1 immarg)
1631efc0a38SAlexander Shaposhnikovdeclare void @llvm.assume(i1)
164