1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-22 20:43:44 +02:00
llvm-mirror/test/CodeGen/X86/pr33844.ll
Sanjay Patel e68c91d039 [x86] shrink 'and' immediate values by setting the high bits (PR35907)
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
2018-01-19 16:37:25 +00:00

39 lines
1.2 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -o - %s | FileCheck %s
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@global = external global i32
@global.1 = external global i64
define void @patatino() {
; CHECK-LABEL: patatino:
; CHECK: # %bb.0: # %bb
; CHECK-NEXT: movl {{.*}}(%rip), %eax
; CHECK-NEXT: movl %eax, %ecx
; CHECK-NEXT: shrl $31, %ecx
; CHECK-NEXT: addl $2147483647, %ecx # imm = 0x7FFFFFFF
; CHECK-NEXT: shrl $31, %ecx
; CHECK-NEXT: andl $-2, %ecx
; CHECK-NEXT: andl $-536870912, %eax # imm = 0xE0000000
; CHECK-NEXT: orl %ecx, %eax
; CHECK-NEXT: movl %eax, {{.*}}(%rip)
; CHECK-NEXT: retq
bb:
%tmp = load i32, i32* @global
%tmp1 = lshr i32 %tmp, 31
%tmp2 = add nuw nsw i32 %tmp1, 2147483647
%tmp3 = load i64, i64* @global.1
%tmp4 = shl i64 %tmp3, 23
%tmp5 = add nsw i64 %tmp4, 8388639
%tmp6 = trunc i64 %tmp5 to i32
%tmp7 = lshr i32 %tmp2, %tmp6
%tmp8 = load i32, i32* @global
%tmp9 = and i32 %tmp7, 62
%tmp10 = and i32 %tmp8, -536870912
%tmp11 = or i32 %tmp9, %tmp10
store i32 %tmp11, i32* @global
ret void
}