mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[InstCombine] exclude bitcast of ppc_fp128 in icmp signbit fold
Based on the post-commit comments for rG0f56bbc, there might be a problem with this transform: (bitcast (fpext/fptrunc X)) to iX) < 0 --> (bitcast X to iY) < 0 ...and the ppc_fp128 data type, so conservatively bypass if we are bitcasting a ppc_fp128. We might be able to account for endian or other differences to enable this for PowerPC again if that is useful. Differential Revision: https://reviews.llvm.org/D77642
This commit is contained in:
parent
1cb40bb793
commit
288b81996c
@ -2763,11 +2763,13 @@ static Instruction *foldICmpBitCast(ICmpInst &Cmp,
|
||||
return new ICmpInst(Pred, X, ConstantInt::getNullValue(X->getType()));
|
||||
|
||||
// If this is a sign-bit test of a bitcast of a casted FP value, eliminate
|
||||
// the FP cast because the FP cast does not change the sign-bit.
|
||||
// the FP extend/truncate because that cast does not change the sign-bit.
|
||||
// This is true for all standard IEEE-754 types and the X86 80-bit type.
|
||||
// The sign-bit is always the most significant bit in those types.
|
||||
const APInt *C;
|
||||
bool TrueIfSigned;
|
||||
if (match(Op1, m_APInt(C)) && Bitcast->hasOneUse() &&
|
||||
isSignBitCheck(Pred, *C, TrueIfSigned)) {
|
||||
if (!BCSrcOp->getType()->isPPC_FP128Ty() && match(Op1, m_APInt(C)) &&
|
||||
Bitcast->hasOneUse() && isSignBitCheck(Pred, *C, TrueIfSigned)) {
|
||||
if (match(BCSrcOp, m_FPExt(m_Value(X))) ||
|
||||
match(BCSrcOp, m_FPTrunc(m_Value(X)))) {
|
||||
// (bitcast (fpext/fptrunc X)) to iX) < 0 --> (bitcast X to iY) < 0
|
||||
|
@ -3700,8 +3700,9 @@ define i1 @signbit_bitcast_fpext_extra_use(float %x, i64* %p) {
|
||||
|
||||
define i1 @signbit_bitcast_fpext_ppc_fp128(float %x) {
|
||||
; CHECK-LABEL: @signbit_bitcast_fpext_ppc_fp128(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[X:%.*]] to i32
|
||||
; CHECK-NEXT: [[S4:%.*]] = icmp slt i32 [[TMP1]], 0
|
||||
; CHECK-NEXT: [[S2:%.*]] = fpext float [[X:%.*]] to ppc_fp128
|
||||
; CHECK-NEXT: [[S3:%.*]] = bitcast ppc_fp128 [[S2]] to i128
|
||||
; CHECK-NEXT: [[S4:%.*]] = icmp slt i128 [[S3]], 0
|
||||
; CHECK-NEXT: ret i1 [[S4]]
|
||||
;
|
||||
%s2 = fpext float %x to ppc_fp128
|
||||
|
Loading…
Reference in New Issue
Block a user