mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[PowerPC32] Fix the setcc
inconsistent result type problem
Summary: On 32-bit PPC target[AIX and BE], when we convert an `i64` to `f32`, a `setcc` operand expansion is needed. The expansion will set the result type of expanded `setcc` operation based on if the subtarget use CRBits or not. If the subtarget does use the CRBits, like AIX and BE, then it will set the result type to `i1`, leading to an inconsistency with original `setcc` result type[i32]. And the reason why it crashed underneath is because we don't set result type of setcc consistent in those two places. This patch fixes this problem by setting original setcc opnode result type also with `getSetCCResultType` interface. Reviewers: sfertile, cebowleratibm, hubert.reinterpretcast, Xiangling_L Reviewed By: sfertile Subscribers: wuzish, nemanjai, hiraditya, kbarton, jsji, shchenz, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D75702
This commit is contained in:
parent
48bf9cf2dc
commit
108e0aed3c
@ -8151,8 +8151,10 @@ SDValue PPCTargetLowering::LowerINT_TO_FP(SDValue Op,
|
||||
SINT, DAG.getConstant(53, dl, MVT::i32));
|
||||
Cond = DAG.getNode(ISD::ADD, dl, MVT::i64,
|
||||
Cond, DAG.getConstant(1, dl, MVT::i64));
|
||||
Cond = DAG.getSetCC(dl, MVT::i32,
|
||||
Cond, DAG.getConstant(1, dl, MVT::i64), ISD::SETUGT);
|
||||
Cond = DAG.getSetCC(
|
||||
dl,
|
||||
getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), MVT::i64),
|
||||
Cond, DAG.getConstant(1, dl, MVT::i64), ISD::SETUGT);
|
||||
|
||||
SINT = DAG.getNode(ISD::SELECT, dl, MVT::i64, Cond, Round, SINT);
|
||||
}
|
||||
|
24
test/CodeGen/PowerPC/ppc32-i64-to-float-conv.ll
Normal file
24
test/CodeGen/PowerPC/ppc32-i64-to-float-conv.ll
Normal file
@ -0,0 +1,24 @@
|
||||
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 \
|
||||
; RUN: -mtriple=powerpc-ibm-aix-xcoff 2>&1 | FileCheck %s
|
||||
|
||||
; RUN: llc -verify-machineinstrs < %s -mcpu=pwr4 \
|
||||
; RUN: -mtriple=powerpc-unknown-linux-gnu 2>&1 | FileCheck %s
|
||||
|
||||
; When we convert an `i64` to `f32` on 32-bit PPC target, a `setcc` will be
|
||||
; generated. And this testcase verifies that the operand expansion of `setcc`
|
||||
; will not crash.
|
||||
|
||||
%struct.A = type { float }
|
||||
|
||||
@ll = external local_unnamed_addr global i64
|
||||
@a = external local_unnamed_addr global %struct.A
|
||||
|
||||
define void @foo() local_unnamed_addr {
|
||||
entry:
|
||||
%0 = load i64, i64* @ll
|
||||
%conv = sitofp i64 %0 to float
|
||||
store float %conv, float* getelementptr inbounds (%struct.A, %struct.A* @a, i32 0, i32 0)
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-NOT: Unexpected setcc expansion!
|
Loading…
x
Reference in New Issue
Block a user