1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=instsimplify -S < %s | FileCheck %s 3declare i8 @llvm.abs.i8(i8, i1) 4 5define i1 @abs_low_bit_set(i8 %x) { 6; CHECK-LABEL: @abs_low_bit_set( 7; CHECK-NEXT: ret i1 false 8; 9 %xx = and i8 %x, 240 10 %v = or i8 %xx, 4 11 %abs = call i8 @llvm.abs.i8(i8 %v, i1 true) 12 %and = and i8 %abs, 4 13 %r = icmp eq i8 %and, 0 14 ret i1 %r 15} 16 17define i1 @abs_unknown_low_bit_set_fail(i8 %x) { 18; CHECK-LABEL: @abs_unknown_low_bit_set_fail( 19; CHECK-NEXT: [[V:%.*]] = or i8 [[X:%.*]], 2 20; CHECK-NEXT: [[ABS:%.*]] = call i8 @llvm.abs.i8(i8 [[V]], i1 true) 21; CHECK-NEXT: [[AND:%.*]] = and i8 [[ABS]], 2 22; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], 0 23; CHECK-NEXT: ret i1 [[R]] 24; 25 %v = or i8 %x, 2 26 %abs = call i8 @llvm.abs.i8(i8 %v, i1 true) 27 %and = and i8 %abs, 2 28 %r = icmp eq i8 %and, 0 29 ret i1 %r 30} 31 32define i1 @abs_negative(i8 %x) { 33; CHECK-LABEL: @abs_negative( 34; CHECK-NEXT: ret i1 false 35; 36 %xx = and i8 %x, 240 37 %v = or i8 %xx, 132 38 %abs = call i8 @llvm.abs.i8(i8 %v, i1 true) 39 %and = and i8 %abs, 8 40 %r = icmp eq i8 %and, 0 41 ret i1 %r 42} 43 44define i1 @abs_negative2(i8 %x) { 45; CHECK-LABEL: @abs_negative2( 46; CHECK-NEXT: ret i1 false 47; 48 %v = or i8 %x, 131 49 %abs = call i8 @llvm.abs.i8(i8 %v, i1 true) 50 %and = and i8 %abs, 2 51 %r = icmp eq i8 %and, 2 52 ret i1 %r 53} 54 55define i1 @abs_negative_no_carry_info_fail(i8 %x) { 56; CHECK-LABEL: @abs_negative_no_carry_info_fail( 57; CHECK-NEXT: [[V:%.*]] = or i8 [[X:%.*]], -126 58; CHECK-NEXT: [[ABS:%.*]] = call i8 @llvm.abs.i8(i8 [[V]], i1 true) 59; CHECK-NEXT: [[AND:%.*]] = and i8 [[ABS]], 2 60; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], 0 61; CHECK-NEXT: ret i1 [[R]] 62; 63 %v = or i8 %x, 130 64 %abs = call i8 @llvm.abs.i8(i8 %v, i1 true) 65 %and = and i8 %abs, 2 66 %r = icmp eq i8 %and, 0 67 ret i1 %r 68} 69