diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-05-09 16:29:50 +0000 | 
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-05-09 16:29:50 +0000 | 
| commit | a949dc619c8c63b139dd0d5ef32b7bd3884a7882 (patch) | |
| tree | 41957085e9988007521cf68483259d8e91d4ce02 /llvm/lib | |
| parent | 0fb9880bf56f9fc24ad8a9a28a5be94a85d5147e (diff) | |
| download | bcm5719-llvm-a949dc619c8c63b139dd0d5ef32b7bd3884a7882.tar.gz bcm5719-llvm-a949dc619c8c63b139dd0d5ef32b7bd3884a7882.zip | |
AMDGPU: Fold shift into cvt_f32_ubyteN
llvm-svn: 268930
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/SIISelLowering.cpp | 16 | 
1 files changed, 15 insertions, 1 deletions
| diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp index 87d42f1552d..7436f95705a 100644 --- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp +++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp @@ -2818,8 +2818,22 @@ SDValue SITargetLowering::PerformDAGCombine(SDNode *N,    case AMDGPUISD::CVT_F32_UBYTE2:    case AMDGPUISD::CVT_F32_UBYTE3: {      unsigned Offset = N->getOpcode() - AMDGPUISD::CVT_F32_UBYTE0; -      SDValue Src = N->getOperand(0); + +    if (Src.getOpcode() == ISD::SRL) { +      // cvt_f32_ubyte0 (srl x, 16) -> cvt_f32_ubyte2 x +      // cvt_f32_ubyte1 (srl x, 16) -> cvt_f32_ubyte3 x +      // cvt_f32_ubyte0 (srl x, 8) -> cvt_f32_ubyte1 x + +      if (const ConstantSDNode *C = dyn_cast<ConstantSDNode>(Src.getOperand(1))) { +        unsigned SrcOffset = C->getZExtValue() + 8 * Offset; +        if (SrcOffset < 32 && SrcOffset % 8 == 0) { +          return DAG.getNode(AMDGPUISD::CVT_F32_UBYTE0 + SrcOffset / 8, DL, +                             MVT::f32, Src.getOperand(0)); +        } +      } +    } +      APInt Demanded = APInt::getBitsSet(32, 8 * Offset, 8 * Offset + 8);      APInt KnownZero, KnownOne; | 

