@@ -1061,27 +1061,27 @@ define i64 @cttz_i64_zero_test_knownneverzero(i64 %n) {
1061
1061
}
1062
1062
1063
1063
; 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 :
1066
1066
; X86: # %bb.0:
1067
1067
; X86-NEXT: bsrl {{[0-9]+}}(%esp), %eax
1068
1068
; X86-NEXT: # kill: def $al killed $al killed $eax
1069
1069
; X86-NEXT: retl
1070
1070
;
1071
- ; X64-LABEL: PR47603 :
1071
+ ; X64-LABEL: PR47603_trunc :
1072
1072
; X64: # %bb.0:
1073
1073
; X64-NEXT: bsrl %edi, %eax
1074
1074
; X64-NEXT: # kill: def $al killed $al killed $eax
1075
1075
; X64-NEXT: retq
1076
1076
;
1077
- ; X86-CLZ-LABEL: PR47603 :
1077
+ ; X86-CLZ-LABEL: PR47603_trunc :
1078
1078
; X86-CLZ: # %bb.0:
1079
1079
; X86-CLZ-NEXT: lzcntl {{[0-9]+}}(%esp), %eax
1080
1080
; X86-CLZ-NEXT: xorb $31, %al
1081
1081
; X86-CLZ-NEXT: # kill: def $al killed $al killed $eax
1082
1082
; X86-CLZ-NEXT: retl
1083
1083
;
1084
- ; X64-CLZ-LABEL: PR47603 :
1084
+ ; X64-CLZ-LABEL: PR47603_trunc :
1085
1085
; X64-CLZ: # %bb.0:
1086
1086
; X64-CLZ-NEXT: lzcntl %edi, %eax
1087
1087
; X64-CLZ-NEXT: xorb $31, %al
@@ -1092,3 +1092,43 @@ define i8 @PR47603(i32 %0) {
1092
1092
%4 = trunc i32 %3 to i8
1093
1093
ret i8 %4
1094
1094
}
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