[X86] Add a test case showing blcic matching being broken by an and mask applied...
authorCraig Topper <craig.topper@intel.com>
Tue, 13 Feb 2018 07:28:28 +0000 (07:28 +0000)
committerCraig Topper <craig.topper@intel.com>
Tue, 13 Feb 2018 07:28:28 +0000 (07:28 +0000)
Playing around with other BMI/TBM instructions after PR35792 and saw this.

llvm-svn: 324987

llvm/test/CodeGen/X86/tbm_patterns.ll

index c429de9..14f8a8f 100644 (file)
@@ -906,3 +906,22 @@ entry:
   %and = and i64 %x1, 4611686018427387903
   ret i64 %and
 }
+
+; This should select blcic
+; TODO: the xor is being combined with the mask and creating an or that's breaking this. Looks like a missing one use check.
+define  i64 @masked_blcic(i64) {
+; CHECK-LABEL: masked_blcic:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    movzwl %di, %eax
+; CHECK-NEXT:    # kill: def $edi killed $edi killed $rdi def $rdi
+; CHECK-NEXT:    notl %edi
+; CHECK-NEXT:    orq $-65536, %rdi # imm = 0xFFFF0000
+; CHECK-NEXT:    incq %rax
+; CHECK-NEXT:    andq %rdi, %rax
+; CHECK-NEXT:    retq
+  %2 = and i64 %0, 65535
+  %3 = xor i64 %2, -1
+  %4 = add nuw nsw i64 %2, 1
+  %5 = and i64 %4, %3
+  ret i64 %5
+}