mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
da55d61e8f
This code tries to form a TEST from CMP+AND with an optional truncate in between. If we looked through the truncate, we may have extra bits in the AND mask that shouldn't participate in the checks. Normally SimplifyDemendedBits takes care of this, but the AND may have another user. So manually mask out any extra bits. Fixes PR51175. Differential Revision: https://reviews.llvm.org/D106634
30 lines
1008 B
LLVM
30 lines
1008 B
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
|
|
|
|
; The and with -9 has multiple users which prevents
|
|
; SimplifyDemandedBits from touching it. The truncate only
|
|
; demands the lower 8 bits. X86ISelDAGToDAG.cpp wants form
|
|
; a test instruction from the icmp+trunc+and, but needs to
|
|
; mask the -9 to 8 bits since SimplifyDemandedBits didn't.
|
|
|
|
define i32 @foo(i16 signext %0, i32 %1, i32* nocapture %2) {
|
|
; CHECK-LABEL: foo:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: incl %edi
|
|
; CHECK-NEXT: movl %edi, %eax
|
|
; CHECK-NEXT: andl $65527, %eax # imm = 0xFFF7
|
|
; CHECK-NEXT: movl %eax, (%rdx)
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: testb $-9, %dil
|
|
; CHECK-NEXT: cmovel %esi, %eax
|
|
; CHECK-NEXT: retq
|
|
%4 = add i16 %0, 1
|
|
%5 = and i16 %4, -9
|
|
%6 = zext i16 %5 to i32
|
|
store i32 %6, i32* %2, align 4
|
|
%7 = trunc i16 %5 to i8
|
|
%8 = icmp eq i8 %7, 0
|
|
%9 = select i1 %8, i32 %1, i32 0
|
|
ret i32 %9
|
|
}
|