This extends the code in SearchForAndLoads to be able to look through ANY_EXTEND nodes, which can be created from mismatching IR types where the AND node we begin from only demands the low parts of the register. That turns zext and sext into any_extends as only the low bits are demanded. To be able to look through ANY_EXTEND nodes we need to handle mismatching types in a few places, potentially truncating the mask to the size of the final load. Recommitted with a more conservative check for the type of the extend. Differential Revision: https://reviews.llvm.org/D117457
37 lines
1.2 KiB
LLVM
37 lines
1.2 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mtriple=x86_64-none-eabi -o - | FileCheck %s
|
|
|
|
define zeroext i1 @bigger(i8* nocapture readonly %c, i8* nocapture readonly %e, i64 %d, i64 %p1) {
|
|
; CHECK-LABEL: bigger:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andb $7, %cl
|
|
; CHECK-NEXT: movb $8, %al
|
|
; CHECK-NEXT: subb %cl, %al
|
|
; CHECK-NEXT: movl $5, %r8d
|
|
; CHECK-NEXT: movl %eax, %ecx
|
|
; CHECK-NEXT: shll %cl, %r8d
|
|
; CHECK-NEXT: movb (%rsi,%rdx), %al
|
|
; CHECK-NEXT: xorb (%rdi,%rdx), %al
|
|
; CHECK-NEXT: movzbl %al, %eax
|
|
; CHECK-NEXT: andl %r8d, %eax
|
|
; CHECK-NEXT: testb $-1, %al
|
|
; CHECK-NEXT: sete %al
|
|
; CHECK-NEXT: retq
|
|
entry:
|
|
%0 = trunc i64 %p1 to i16
|
|
%1 = and i16 %0, 7
|
|
%sh_prom = sub nuw nsw i16 8, %1
|
|
%shl = shl nuw nsw i16 5, %sh_prom
|
|
%arrayidx = getelementptr inbounds i8, i8* %c, i64 %d
|
|
%2 = load i8, i8* %arrayidx, align 1
|
|
%3 = and i16 %shl, 255
|
|
%conv2 = zext i16 %3 to i32
|
|
%arrayidx3 = getelementptr inbounds i8, i8* %e, i64 %d
|
|
%4 = load i8, i8* %arrayidx3, align 1
|
|
%5 = xor i8 %4, %2
|
|
%6 = zext i8 %5 to i32
|
|
%7 = and i32 %6, %conv2
|
|
%cmp.not = icmp eq i32 %7, 0
|
|
ret i1 %cmp.not
|
|
}
|