Skip to content

Commit 2523fe8

Browse files
committed
[X86] Add second PR47603 test case
We had coverage for the xor(trunc(xor(x,31)),31) case but not xor(zext(xor(x,31)),31)
1 parent 4dd3e0f commit 2523fe8

File tree

1 file changed

+45
-5
lines changed

1 file changed

+45
-5
lines changed

llvm/test/CodeGen/X86/clz.ll

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,27 +1061,27 @@ define i64 @cttz_i64_zero_test_knownneverzero(i64 %n) {
10611061
}
10621062

10631063
; Ensure we fold away the XOR(TRUNC(XOR(BSR(X),31)),31).
1064-
define i8 @PR47603(i32 %0) {
1065-
; X86-LABEL: PR47603:
1064+
define i8 @PR47603_trunc(i32 %0) {
1065+
; X86-LABEL: PR47603_trunc:
10661066
; X86: # %bb.0:
10671067
; X86-NEXT: bsrl {{[0-9]+}}(%esp), %eax
10681068
; X86-NEXT: # kill: def $al killed $al killed $eax
10691069
; X86-NEXT: retl
10701070
;
1071-
; X64-LABEL: PR47603:
1071+
; X64-LABEL: PR47603_trunc:
10721072
; X64: # %bb.0:
10731073
; X64-NEXT: bsrl %edi, %eax
10741074
; X64-NEXT: # kill: def $al killed $al killed $eax
10751075
; X64-NEXT: retq
10761076
;
1077-
; X86-CLZ-LABEL: PR47603:
1077+
; X86-CLZ-LABEL: PR47603_trunc:
10781078
; X86-CLZ: # %bb.0:
10791079
; X86-CLZ-NEXT: lzcntl {{[0-9]+}}(%esp), %eax
10801080
; X86-CLZ-NEXT: xorb $31, %al
10811081
; X86-CLZ-NEXT: # kill: def $al killed $al killed $eax
10821082
; X86-CLZ-NEXT: retl
10831083
;
1084-
; X64-CLZ-LABEL: PR47603:
1084+
; X64-CLZ-LABEL: PR47603_trunc:
10851085
; X64-CLZ: # %bb.0:
10861086
; X64-CLZ-NEXT: lzcntl %edi, %eax
10871087
; X64-CLZ-NEXT: xorb $31, %al
@@ -1092,3 +1092,43 @@ define i8 @PR47603(i32 %0) {
10921092
%4 = trunc i32 %3 to i8
10931093
ret i8 %4
10941094
}
1095+
1096+
; Ensure we fold away the XOR(ZEXT(XOR(BSR(X),31)),31).
1097+
define i32 @PR47603_zext(i32 %a0, [32 x i8]* %a1) {
1098+
; X86-LABEL: PR47603_zext:
1099+
; X86: # %bb.0:
1100+
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
1101+
; X86-NEXT: bsrl {{[0-9]+}}(%esp), %ecx
1102+
; X86-NEXT: movsbl (%eax,%ecx), %eax
1103+
; X86-NEXT: retl
1104+
;
1105+
; X64-LABEL: PR47603_zext:
1106+
; X64: # %bb.0:
1107+
; X64-NEXT: bsrl %edi, %eax
1108+
; X64-NEXT: xorl $31, %eax
1109+
; X64-NEXT: xorq $31, %rax
1110+
; X64-NEXT: movsbl (%rsi,%rax), %eax
1111+
; X64-NEXT: retq
1112+
;
1113+
; X86-CLZ-LABEL: PR47603_zext:
1114+
; X86-CLZ: # %bb.0:
1115+
; X86-CLZ-NEXT: movl {{[0-9]+}}(%esp), %eax
1116+
; X86-CLZ-NEXT: lzcntl {{[0-9]+}}(%esp), %ecx
1117+
; X86-CLZ-NEXT: xorl $31, %ecx
1118+
; X86-CLZ-NEXT: movsbl (%eax,%ecx), %eax
1119+
; X86-CLZ-NEXT: retl
1120+
;
1121+
; X64-CLZ-LABEL: PR47603_zext:
1122+
; X64-CLZ: # %bb.0:
1123+
; X64-CLZ-NEXT: lzcntl %edi, %eax
1124+
; X64-CLZ-NEXT: xorq $31, %rax
1125+
; X64-CLZ-NEXT: movsbl (%rsi,%rax), %eax
1126+
; X64-CLZ-NEXT: retq
1127+
%ctlz = tail call i32 @llvm.ctlz.i32(i32 %a0, i1 true)
1128+
%xor = xor i32 %ctlz, 31
1129+
%zext = zext i32 %xor to i64
1130+
%gep = getelementptr inbounds [32 x i8], [32 x i8]* %a1, i64 0, i64 %zext
1131+
%load = load i8, i8* %gep, align 1
1132+
%sext = sext i8 %load to i32
1133+
ret i32 %sext
1134+
}

0 commit comments

Comments
 (0)