diff options
| author | Vincent Lejeune <vljn@ovi.com> | 2014-05-10 19:18:39 +0000 | 
|---|---|---|
| committer | Vincent Lejeune <vljn@ovi.com> | 2014-05-10 19:18:39 +0000 | 
| commit | 29c0c210fc7ec3490bf2de3d4225f620543bced8 (patch) | |
| tree | 9fda36365d8ffb9c68454e130d42dc609f4d7a37 /llvm/lib/Target | |
| parent | 94af31fbe8b3f1fc156bd036af6973581e589e76 (diff) | |
| download | bcm5719-llvm-29c0c210fc7ec3490bf2de3d4225f620543bced8.tar.gz bcm5719-llvm-29c0c210fc7ec3490bf2de3d4225f620543bced8.zip | |
R600/SI: Fold fabs/fneg into src input modifier
llvm-svn: 208480
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/R600/SIISelLowering.cpp | 33 | 
1 files changed, 31 insertions, 2 deletions
| diff --git a/llvm/lib/Target/R600/SIISelLowering.cpp b/llvm/lib/Target/R600/SIISelLowering.cpp index 466d24771ce..da8aa5b7a98 100644 --- a/llvm/lib/Target/R600/SIISelLowering.cpp +++ b/llvm/lib/Target/R600/SIISelLowering.cpp @@ -1323,6 +1323,7 @@ SDNode *SITargetLowering::foldOperands(MachineSDNode *Node,    // e64 version if available, -1 otherwise    int OpcodeE64 = AMDGPU::getVOPe64(Opcode);    const MCInstrDesc *DescE64 = OpcodeE64 == -1 ? nullptr : &TII->get(OpcodeE64); +  int InputModifiers[3] = {0};    assert(!DescE64 || DescE64->getNumDefs() == NumDefs); @@ -1399,7 +1400,10 @@ SDNode *SITargetLowering::foldOperands(MachineSDNode *Node,        }      } -    if (DescE64 && !Immediate) { +    if (Immediate) +      continue; + +    if (DescE64) {        // Test if it makes sense to switch to e64 encoding        unsigned OtherRegClass = DescE64->OpInfo[Op].RegClass; @@ -1418,6 +1422,31 @@ SDNode *SITargetLowering::foldOperands(MachineSDNode *Node,          DescE64 = nullptr;        }      } + +    if (!DescE64 && !Promote2e64) +      continue; +    if (!Operand.isMachineOpcode()) +      continue; +    if (Operand.getMachineOpcode() == AMDGPU::FNEG_SI) { +      Ops.pop_back(); +      Ops.push_back(Operand.getOperand(0)); +      InputModifiers[i] = 1; +      Promote2e64 = true; +      if (!DescE64) +        continue; +      Desc = DescE64; +      DescE64 = 0; +    } +    else if (Operand.getMachineOpcode() == AMDGPU::FABS_SI) { +      Ops.pop_back(); +      Ops.push_back(Operand.getOperand(0)); +      InputModifiers[i] = 2; +      Promote2e64 = true; +      if (!DescE64) +        continue; +      Desc = DescE64; +      DescE64 = 0; +    }    }    if (Promote2e64) { @@ -1425,7 +1454,7 @@ SDNode *SITargetLowering::foldOperands(MachineSDNode *Node,      Ops.clear();      for (unsigned i = 0; i < OldOps.size(); ++i) {        // src_modifier -      Ops.push_back(DAG.getTargetConstant(0, MVT::i32)); +      Ops.push_back(DAG.getTargetConstant(InputModifiers[i], MVT::i32));        Ops.push_back(OldOps[i]);      }      // Add the modifier flags while promoting | 

