mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
75ce6b1096
The current BitPermutationSelector generates a code to build a value by tracking two types of bits: ConstZero and Variable. ConstZero means a bit we need to mask off and Variable is a bit we copy from an input value. This patch add third type of bits VariableKnownToBeZero caused by AssertZext node or zero-extending load node. VariableKnownToBeZero means a bit comes from an input value, but it is known to be already zero. So we do not need to mask them. VariableKnownToBeZero enhances flexibility to group bits, since we can avoid redundant masking for these bits. This patch also renames "HasZero" to "NeedMask" since now we may skip masking even when we have zeros (of type VariableKnownToBeZero). Differential Revision: https://reviews.llvm.org/D48025 llvm-svn: 344347
49 lines
1.2 KiB
LLVM
49 lines
1.2 KiB
LLVM
; RUN: llc -verify-machineinstrs -mcpu=pwr7 < %s | FileCheck %s
|
|
target datalayout = "E-m:e-i64:64-n32:64"
|
|
target triple = "powerpc64-unknown-linux-gnu"
|
|
|
|
define i32 @test1() #0 {
|
|
entry:
|
|
%conv67.reload = load i32, i32* undef
|
|
%const = bitcast i32 65535 to i32
|
|
br label %next
|
|
|
|
next:
|
|
%shl161 = shl nuw nsw i32 %conv67.reload, 15
|
|
%0 = load i8, i8* undef, align 1
|
|
%conv169 = zext i8 %0 to i32
|
|
%shl170 = shl nuw nsw i32 %conv169, 7
|
|
%const_mat = add i32 %const, -32767
|
|
%shl161.masked = and i32 %shl161, %const_mat
|
|
%conv174 = or i32 %shl170, %shl161.masked
|
|
ret i32 %conv174
|
|
|
|
; CHECK-LABEL: @test1
|
|
; CHECK-NOT: rlwimi 3, {{[0-9]+}}, 15, 0, 16
|
|
; CHECK: blr
|
|
}
|
|
|
|
define i32 @test2() #0 {
|
|
entry:
|
|
%conv67.reload = load i32, i32* undef
|
|
%const = bitcast i32 65535 to i32
|
|
br label %next
|
|
|
|
next:
|
|
%shl161 = shl nuw nsw i32 %conv67.reload, 15
|
|
%0 = load i8, i8* undef, align 1
|
|
%conv169 = zext i8 %0 to i32
|
|
%shl170 = shl nuw nsw i32 %conv169, 7
|
|
%shl161.masked = and i32 %shl161, 32768
|
|
%conv174 = or i32 %shl170, %shl161.masked
|
|
ret i32 %conv174
|
|
|
|
; CHECK-LABEL: @test2
|
|
; CHECK: rlwinm 3, {{[0-9]+}}, 7, 17, 24
|
|
; CHECK: rlwimi 3, {{[0-9]+}}, 15, 16, 16
|
|
; CHECK: blr
|
|
}
|
|
|
|
attributes #0 = { nounwind }
|
|
|