[X86] Add second PR47603 test case
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Mon, 5 Apr 2021 10:16:03 +0000 (11:16 +0100)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Mon, 5 Apr 2021 10:40:36 +0000 (11:40 +0100)
We had coverage for the xor(trunc(xor(x,31)),31) case but not xor(zext(xor(x,31)),31)

llvm/test/CodeGen/X86/clz.ll

index 8fa5adb..e11ab38 100644 (file)
@@ -1061,27 +1061,27 @@ define i64 @cttz_i64_zero_test_knownneverzero(i64 %n) {
 }
 
 ; Ensure we fold away the XOR(TRUNC(XOR(BSR(X),31)),31).
-define i8 @PR47603(i32 %0) {
-; X86-LABEL: PR47603:
+define i8 @PR47603_trunc(i32 %0) {
+; X86-LABEL: PR47603_trunc:
 ; X86:       # %bb.0:
 ; X86-NEXT:    bsrl {{[0-9]+}}(%esp), %eax
 ; X86-NEXT:    # kill: def $al killed $al killed $eax
 ; X86-NEXT:    retl
 ;
-; X64-LABEL: PR47603:
+; X64-LABEL: PR47603_trunc:
 ; X64:       # %bb.0:
 ; X64-NEXT:    bsrl %edi, %eax
 ; X64-NEXT:    # kill: def $al killed $al killed $eax
 ; X64-NEXT:    retq
 ;
-; X86-CLZ-LABEL: PR47603:
+; X86-CLZ-LABEL: PR47603_trunc:
 ; X86-CLZ:       # %bb.0:
 ; X86-CLZ-NEXT:    lzcntl {{[0-9]+}}(%esp), %eax
 ; X86-CLZ-NEXT:    xorb $31, %al
 ; X86-CLZ-NEXT:    # kill: def $al killed $al killed $eax
 ; X86-CLZ-NEXT:    retl
 ;
-; X64-CLZ-LABEL: PR47603:
+; X64-CLZ-LABEL: PR47603_trunc:
 ; X64-CLZ:       # %bb.0:
 ; X64-CLZ-NEXT:    lzcntl %edi, %eax
 ; X64-CLZ-NEXT:    xorb $31, %al
@@ -1092,3 +1092,43 @@ define i8 @PR47603(i32 %0) {
   %4 = trunc i32 %3 to i8
   ret i8 %4
 }
+
+; Ensure we fold away the XOR(ZEXT(XOR(BSR(X),31)),31).
+define i32 @PR47603_zext(i32 %a0, [32 x i8]* %a1) {
+; X86-LABEL: PR47603_zext:
+; X86:       # %bb.0:
+; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT:    bsrl {{[0-9]+}}(%esp), %ecx
+; X86-NEXT:    movsbl (%eax,%ecx), %eax
+; X86-NEXT:    retl
+;
+; X64-LABEL: PR47603_zext:
+; X64:       # %bb.0:
+; X64-NEXT:    bsrl %edi, %eax
+; X64-NEXT:    xorl $31, %eax
+; X64-NEXT:    xorq $31, %rax
+; X64-NEXT:    movsbl (%rsi,%rax), %eax
+; X64-NEXT:    retq
+;
+; X86-CLZ-LABEL: PR47603_zext:
+; X86-CLZ:       # %bb.0:
+; X86-CLZ-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-CLZ-NEXT:    lzcntl {{[0-9]+}}(%esp), %ecx
+; X86-CLZ-NEXT:    xorl $31, %ecx
+; X86-CLZ-NEXT:    movsbl (%eax,%ecx), %eax
+; X86-CLZ-NEXT:    retl
+;
+; X64-CLZ-LABEL: PR47603_zext:
+; X64-CLZ:       # %bb.0:
+; X64-CLZ-NEXT:    lzcntl %edi, %eax
+; X64-CLZ-NEXT:    xorq $31, %rax
+; X64-CLZ-NEXT:    movsbl (%rsi,%rax), %eax
+; X64-CLZ-NEXT:    retq
+  %ctlz = tail call i32 @llvm.ctlz.i32(i32 %a0, i1 true)
+  %xor = xor i32 %ctlz, 31
+  %zext = zext i32 %xor to i64
+  %gep = getelementptr inbounds [32 x i8], [32 x i8]* %a1, i64 0, i64 %zext
+  %load = load i8, i8* %gep, align 1
+  %sext = sext i8 %load to i32
+  ret i32 %sext
+}