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