llvm-project/llvm/test/CodeGen/X86/combine-andintoload.ll
David Green 100763a88f [DAG] Extend SearchForAndLoads with any_extend handling
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
2022-01-18 21:03:08 +00:00

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
}