From: Sanjay Patel Date: Tue, 12 Feb 2019 16:44:37 +0000 (+0000) Subject: [x86] add negative tests for setcc folds; NFC X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9d61e28a96cd0918a6f5fe7e6fc262bcb939277e;p=llvm [x86] add negative tests for setcc folds; NFC git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353855 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/CodeGen/X86/setcc-logic.ll b/test/CodeGen/X86/setcc-logic.ll index 290a8c38a29..f95ce9bfae2 100644 --- a/test/CodeGen/X86/setcc-logic.ll +++ b/test/CodeGen/X86/setcc-logic.ll @@ -512,3 +512,73 @@ define i1 @and_icmps_const_1bit_diff(i32 %x) { ret i1 %r } +; Negative test - extra use prevents optimization + +define i1 @or_icmps_const_1bit_diff_extra_use(i8 %x, i8* %p) { +; CHECK-LABEL: or_icmps_const_1bit_diff_extra_use: +; CHECK: # %bb.0: +; CHECK-NEXT: cmpb $45, %dil +; CHECK-NEXT: sete %cl +; CHECK-NEXT: cmpb $43, %dil +; CHECK-NEXT: sete %al +; CHECK-NEXT: sete (%rsi) +; CHECK-NEXT: orb %cl, %al +; CHECK-NEXT: retq + %a = icmp eq i8 %x, 43 + %b = icmp eq i8 %x, 45 + %r = or i1 %a, %b + %z = zext i1 %a to i8 + store i8 %z, i8* %p + ret i1 %r +} + +; Negative test - constant diff is >1 bit + +define i1 @and_icmps_const_not1bit_diff(i32 %x) { +; CHECK-LABEL: and_icmps_const_not1bit_diff: +; CHECK: # %bb.0: +; CHECK-NEXT: cmpl $44, %edi +; CHECK-NEXT: setne %cl +; CHECK-NEXT: cmpl $92, %edi +; CHECK-NEXT: setne %al +; CHECK-NEXT: andb %cl, %al +; CHECK-NEXT: retq + %a = icmp ne i32 %x, 44 + %b = icmp ne i32 %x, 92 + %r = and i1 %a, %b + ret i1 %r +} + +; Negative test - wrong comparison + +define i1 @and_icmps_const_1bit_diff_wrong_pred(i32 %x) { +; CHECK-LABEL: and_icmps_const_1bit_diff_wrong_pred: +; CHECK: # %bb.0: +; CHECK-NEXT: cmpl $43, %edi +; CHECK-NEXT: sete %cl +; CHECK-NEXT: cmpl $45, %edi +; CHECK-NEXT: setl %al +; CHECK-NEXT: orb %cl, %al +; CHECK-NEXT: retq + %a = icmp eq i32 %x, 43 + %b = icmp slt i32 %x, 45 + %r = or i1 %a, %b + ret i1 %r +} + +; Negative test - no common operand + +define i1 @and_icmps_const_1bit_diff_common_op(i32 %x, i32 %y) { +; CHECK-LABEL: and_icmps_const_1bit_diff_common_op: +; CHECK: # %bb.0: +; CHECK-NEXT: cmpl $43, %edi +; CHECK-NEXT: sete %cl +; CHECK-NEXT: cmpl $45, %esi +; CHECK-NEXT: sete %al +; CHECK-NEXT: orb %cl, %al +; CHECK-NEXT: retq + %a = icmp eq i32 %x, 43 + %b = icmp eq i32 %y, 45 + %r = or i1 %a, %b + ret i1 %r +}