diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrFragmentsSIMD.td | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td b/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td index 8b5bbf24f6f..e7b2e6bf64c 100644 --- a/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td +++ b/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td @@ -698,17 +698,20 @@ def alignedstore512 : PatFrag<(ops node:$val, node:$ptr), // Like 'load', but always requires 128-bit vector alignment. def alignedload : PatFrag<(ops node:$ptr), (load node:$ptr), [{ - return cast<LoadSDNode>(N)->getAlignment() >= 16; + return cast<LoadSDNode>(N)->getAlignment() >= 16 && + (!Subtarget->hasSSE41() || !cast<LoadSDNode>(N)->isNonTemporal()); }]>; // Like 'load', but always requires 256-bit vector alignment. def alignedload256 : PatFrag<(ops node:$ptr), (load node:$ptr), [{ - return cast<LoadSDNode>(N)->getAlignment() >= 32; + return cast<LoadSDNode>(N)->getAlignment() >= 32 && + (!Subtarget->hasAVX2() || !cast<LoadSDNode>(N)->isNonTemporal()); }]>; // Like 'load', but always requires 512-bit vector alignment. def alignedload512 : PatFrag<(ops node:$ptr), (load node:$ptr), [{ - return cast<LoadSDNode>(N)->getAlignment() >= 64; + return cast<LoadSDNode>(N)->getAlignment() >= 64 && + (!Subtarget->hasAVX512() || !cast<LoadSDNode>(N)->isNonTemporal()); }]>; // 128-bit aligned load pattern fragments |

