brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.1 KiB · 6f7b5c2 Raw
171 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; https://bugs.llvm.org/show_bug.cgi?id=381235 6; Pattern:7;   x & (-1 >> y) != x8; Should be transformed into:9;   x u> (-1 >> y)10 11; ============================================================================ ;12; Basic positive tests13; ============================================================================ ;14 15define i1 @p0(i8 %x, i8 %y) {16; CHECK-LABEL: @p0(17; CHECK-NEXT:    [[TMP0:%.*]] = lshr i8 -1, [[Y:%.*]]18; CHECK-NEXT:    [[RET:%.*]] = icmp ugt i8 [[X:%.*]], [[TMP0]]19; CHECK-NEXT:    ret i1 [[RET]]20;21  %tmp0 = lshr i8 -1, %y22  %tmp1 = and i8 %tmp0, %x23  %ret = icmp ne i8 %tmp1, %x24  ret i1 %ret25}26 27; ============================================================================ ;28; Vector tests29; ============================================================================ ;30 31define <2 x i1> @p1_vec(<2 x i8> %x, <2 x i8> %y) {32; CHECK-LABEL: @p1_vec(33; CHECK-NEXT:    [[TMP0:%.*]] = lshr <2 x i8> splat (i8 -1), [[Y:%.*]]34; CHECK-NEXT:    [[RET:%.*]] = icmp ugt <2 x i8> [[X:%.*]], [[TMP0]]35; CHECK-NEXT:    ret <2 x i1> [[RET]]36;37  %tmp0 = lshr <2 x i8> <i8 -1, i8 -1>, %y38  %tmp1 = and <2 x i8> %tmp0, %x39  %ret = icmp ne <2 x i8> %tmp1, %x40  ret <2 x i1> %ret41}42 43define <3 x i1> @p2_vec_poison(<3 x i8> %x, <3 x i8> %y) {44; CHECK-LABEL: @p2_vec_poison(45; CHECK-NEXT:    [[TMP0:%.*]] = lshr <3 x i8> <i8 -1, i8 poison, i8 -1>, [[Y:%.*]]46; CHECK-NEXT:    [[RET:%.*]] = icmp ugt <3 x i8> [[X:%.*]], [[TMP0]]47; CHECK-NEXT:    ret <3 x i1> [[RET]]48;49  %tmp0 = lshr <3 x i8> <i8 -1, i8 poison, i8 -1>, %y50  %tmp1 = and <3 x i8> %tmp0, %x51  %ret = icmp ne <3 x i8> %tmp1, %x52  ret <3 x i1> %ret53}54 55; ============================================================================ ;56; Commutativity tests.57; ============================================================================ ;58 59declare i8 @gen8()60 61define i1 @c0(i8 %y) {62; CHECK-LABEL: @c0(63; CHECK-NEXT:    [[TMP0:%.*]] = lshr i8 -1, [[Y:%.*]]64; CHECK-NEXT:    [[X:%.*]] = call i8 @gen8()65; CHECK-NEXT:    [[RET:%.*]] = icmp ugt i8 [[X]], [[TMP0]]66; CHECK-NEXT:    ret i1 [[RET]]67;68  %tmp0 = lshr i8 -1, %y69  %x = call i8 @gen8()70  %tmp1 = and i8 %x, %tmp0 ; swapped order71  %ret = icmp ne i8 %tmp1, %x72  ret i1 %ret73}74 75define i1 @c1(i8 %y) {76; CHECK-LABEL: @c1(77; CHECK-NEXT:    [[TMP0:%.*]] = lshr i8 -1, [[Y:%.*]]78; CHECK-NEXT:    [[X:%.*]] = call i8 @gen8()79; CHECK-NEXT:    [[RET:%.*]] = icmp ugt i8 [[X]], [[TMP0]]80; CHECK-NEXT:    ret i1 [[RET]]81;82  %tmp0 = lshr i8 -1, %y83  %x = call i8 @gen8()84  %tmp1 = and i8 %tmp0, %x85  %ret = icmp ne i8 %x, %tmp1 ; swapped order86  ret i1 %ret87}88 89define i1 @c2(i8 %y) {90; CHECK-LABEL: @c2(91; CHECK-NEXT:    [[TMP0:%.*]] = lshr i8 -1, [[Y:%.*]]92; CHECK-NEXT:    [[X:%.*]] = call i8 @gen8()93; CHECK-NEXT:    [[RET:%.*]] = icmp ugt i8 [[X]], [[TMP0]]94; CHECK-NEXT:    ret i1 [[RET]]95;96  %tmp0 = lshr i8 -1, %y97  %x = call i8 @gen8()98  %tmp1 = and i8 %x, %tmp0 ; swapped order99  %ret = icmp ne i8 %x, %tmp1 ; swapped order100  ret i1 %ret101}102 103; ============================================================================ ;104; One-use tests. We don't care about multi-uses here.105; ============================================================================ ;106 107declare void @use8(i8)108 109define i1 @oneuse0(i8 %x, i8 %y) {110; CHECK-LABEL: @oneuse0(111; CHECK-NEXT:    [[TMP0:%.*]] = lshr i8 -1, [[Y:%.*]]112; CHECK-NEXT:    call void @use8(i8 [[TMP0]])113; CHECK-NEXT:    [[RET:%.*]] = icmp ugt i8 [[X:%.*]], [[TMP0]]114; CHECK-NEXT:    ret i1 [[RET]]115;116  %tmp0 = lshr i8 -1, %y117  call void @use8(i8 %tmp0)118  %tmp1 = and i8 %tmp0, %x119  %ret = icmp ne i8 %tmp1, %x120  ret i1 %ret121}122 123define i1 @oneuse1(i8 %x, i8 %y) {124; CHECK-LABEL: @oneuse1(125; CHECK-NEXT:    [[TMP0:%.*]] = lshr i8 -1, [[Y:%.*]]126; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[TMP0]], [[X:%.*]]127; CHECK-NEXT:    call void @use8(i8 [[TMP1]])128; CHECK-NEXT:    [[RET:%.*]] = icmp ugt i8 [[X]], [[TMP0]]129; CHECK-NEXT:    ret i1 [[RET]]130;131  %tmp0 = lshr i8 -1, %y132  %tmp1 = and i8 %tmp0, %x133  call void @use8(i8 %tmp1)134  %ret = icmp ne i8 %tmp1, %x135  ret i1 %ret136}137 138define i1 @oneuse2(i8 %x, i8 %y) {139; CHECK-LABEL: @oneuse2(140; CHECK-NEXT:    [[TMP0:%.*]] = lshr i8 -1, [[Y:%.*]]141; CHECK-NEXT:    call void @use8(i8 [[TMP0]])142; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[TMP0]], [[X:%.*]]143; CHECK-NEXT:    call void @use8(i8 [[TMP1]])144; CHECK-NEXT:    [[RET:%.*]] = icmp ugt i8 [[X]], [[TMP0]]145; CHECK-NEXT:    ret i1 [[RET]]146;147  %tmp0 = lshr i8 -1, %y148  call void @use8(i8 %tmp0)149  %tmp1 = and i8 %tmp0, %x150  call void @use8(i8 %tmp1)151  %ret = icmp ne i8 %tmp1, %x152  ret i1 %ret153}154 155; ============================================================================ ;156; Negative tests157; ============================================================================ ;158 159define i1 @n0(i8 %x, i8 %y, i8 %notx) {160; CHECK-LABEL: @n0(161; CHECK-NEXT:    [[TMP0:%.*]] = lshr i8 -1, [[Y:%.*]]162; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[TMP0]], [[X:%.*]]163; CHECK-NEXT:    [[RET:%.*]] = icmp ne i8 [[TMP1]], [[NOTX:%.*]]164; CHECK-NEXT:    ret i1 [[RET]]165;166  %tmp0 = lshr i8 -1, %y167  %tmp1 = and i8 %tmp0, %x168  %ret = icmp ne i8 %tmp1, %notx ; not %x169  ret i1 %ret170}171