mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 02:52:53 +02:00
[FPEnv] Last BinaryOperator::isFNeg(...) to m_FNeg(...) changes
Replacing BinaryOperator::isFNeg(...) to avoid regressions when we separate FNeg from the FSub IR instruction. Differential Revision: https://reviews.llvm.org/D53650 llvm-svn: 345295
This commit is contained in:
parent
848fa81a6e
commit
90a586c915
@ -89,6 +89,7 @@
|
||||
#include "llvm/IR/Mangler.h"
|
||||
#include "llvm/IR/Metadata.h"
|
||||
#include "llvm/IR/Operator.h"
|
||||
#include "llvm/IR/PatternMatch.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
#include "llvm/IR/User.h"
|
||||
#include "llvm/IR/Value.h"
|
||||
@ -110,6 +111,7 @@
|
||||
#include <utility>
|
||||
|
||||
using namespace llvm;
|
||||
using namespace PatternMatch;
|
||||
|
||||
#define DEBUG_TYPE "isel"
|
||||
|
||||
@ -1692,7 +1694,10 @@ void FastISel::finishCondBranch(const BasicBlock *BranchBB,
|
||||
|
||||
/// Emit an FNeg operation.
|
||||
bool FastISel::selectFNeg(const User *I) {
|
||||
unsigned OpReg = getRegForValue(BinaryOperator::getFNegArgument(I));
|
||||
Value *X;
|
||||
if (!match(I, m_FNeg(m_Value(X))))
|
||||
return false;
|
||||
unsigned OpReg = getRegForValue(X);
|
||||
if (!OpReg)
|
||||
return false;
|
||||
bool OpRegIsKill = hasTrivialKill(I);
|
||||
@ -1782,11 +1787,9 @@ bool FastISel::selectOperator(const User *I, unsigned Opcode) {
|
||||
return selectBinaryOp(I, ISD::FADD);
|
||||
case Instruction::Sub:
|
||||
return selectBinaryOp(I, ISD::SUB);
|
||||
case Instruction::FSub:
|
||||
case Instruction::FSub:
|
||||
// FNeg is currently represented in LLVM IR as a special case of FSub.
|
||||
if (BinaryOperator::isFNeg(I))
|
||||
return selectFNeg(I);
|
||||
return selectBinaryOp(I, ISD::FSUB);
|
||||
return selectFNeg(I) || selectBinaryOp(I, ISD::FSUB);
|
||||
case Instruction::Mul:
|
||||
return selectBinaryOp(I, ISD::MUL);
|
||||
case Instruction::FMul:
|
||||
|
@ -1612,8 +1612,9 @@ Instruction *InstCombiner::visitFPTrunc(FPTruncInst &FPT) {
|
||||
}
|
||||
|
||||
// (fptrunc (fneg x)) -> (fneg (fptrunc x))
|
||||
if (BinaryOperator::isFNeg(OpI)) {
|
||||
Value *InnerTrunc = Builder.CreateFPTrunc(OpI->getOperand(1), Ty);
|
||||
Value *X;
|
||||
if (match(OpI, m_FNeg(m_Value(X)))) {
|
||||
Value *InnerTrunc = Builder.CreateFPTrunc(X, Ty);
|
||||
return BinaryOperator::CreateFNegFMF(InnerTrunc, OpI);
|
||||
}
|
||||
}
|
||||
|
@ -42,8 +42,8 @@ define half @fneg_fptrunc(float %a) {
|
||||
|
||||
define <2 x half> @fneg_fptrunc_vec_undef(<2 x float> %a) {
|
||||
; CHECK-LABEL: @fneg_fptrunc_vec_undef(
|
||||
; CHECK-NEXT: [[B:%.*]] = fsub <2 x float> <float -0.000000e+00, float undef>, [[A:%.*]]
|
||||
; CHECK-NEXT: [[C:%.*]] = fptrunc <2 x float> [[B]] to <2 x half>
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = fptrunc <2 x float> [[A:%.*]] to <2 x half>
|
||||
; CHECK-NEXT: [[C:%.*]] = fsub <2 x half> <half 0xH8000, half 0xH8000>, [[TMP1]]
|
||||
; CHECK-NEXT: ret <2 x half> [[C]]
|
||||
;
|
||||
%b = fsub <2 x float> <float -0.0, float undef>, %a
|
||||
|
Loading…
Reference in New Issue
Block a user