mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
e68c91d039
Try to reverse the constant-shrinking that happens in SimplifyDemandedBits() for 'and' masks when it results in a smaller sign-extended immediate. We are also able to detect dead 'and' ops here (the mask is all ones). In that case, we replace and return without selecting the 'and'. Other targets might want to share some of this logic by enabling this under a target hook, but I didn't see diffs for simple cases with PowerPC or AArch64, so they may already have some specialized logic for this kind of thing or have different needs. This should solve PR35907: https://bugs.llvm.org/show_bug.cgi?id=35907 Differential Revision: https://reviews.llvm.org/D42088 llvm-svn: 322957
55 lines
1.4 KiB
LLVM
55 lines
1.4 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mtriple=i686-unknown-linux -enable-misched=false | FileCheck %s
|
|
|
|
;; Simple case
|
|
define i32 @test1(i8 %x) nounwind readnone {
|
|
; CHECK-LABEL: test1:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: movzbl {{[0-9]+}}(%esp), %eax
|
|
; CHECK-NEXT: andl $-32, %eax
|
|
; CHECK-NEXT: retl
|
|
%A = and i8 %x, -32
|
|
%B = zext i8 %A to i32
|
|
ret i32 %B
|
|
}
|
|
|
|
;; Multiple uses of %x but easily extensible.
|
|
define i32 @test2(i8 %x) nounwind readnone {
|
|
; CHECK-LABEL: test2:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: movzbl {{[0-9]+}}(%esp), %eax
|
|
; CHECK-NEXT: movl %eax, %ecx
|
|
; CHECK-NEXT: andl $-32, %ecx
|
|
; CHECK-NEXT: orl $63, %eax
|
|
; CHECK-NEXT: addl %ecx, %eax
|
|
; CHECK-NEXT: retl
|
|
%A = and i8 %x, -32
|
|
%B = zext i8 %A to i32
|
|
%C = or i8 %x, 63
|
|
%D = zext i8 %C to i32
|
|
%E = add i32 %B, %D
|
|
ret i32 %E
|
|
}
|
|
|
|
declare void @use(i32, i8)
|
|
|
|
;; Multiple uses of %x where we shouldn't extend the load.
|
|
define void @test3(i8 %x) nounwind readnone {
|
|
; CHECK-LABEL: test3:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: subl $12, %esp
|
|
; CHECK-NEXT: movzbl {{[0-9]+}}(%esp), %eax
|
|
; CHECK-NEXT: subl $8, %esp
|
|
; CHECK-NEXT: pushl %eax
|
|
; CHECK-NEXT: andl $-32, %eax
|
|
; CHECK-NEXT: pushl %eax
|
|
; CHECK-NEXT: calll use
|
|
; CHECK-NEXT: addl $28, %esp
|
|
; CHECK-NEXT: retl
|
|
%A = and i8 %x, -32
|
|
%B = zext i8 %A to i32
|
|
call void @use(i32 %B, i8 %x)
|
|
ret void
|
|
}
|
|
|