summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp
diff options
context:
space:
mode:
authorczhengsz <czhengsz@cn.ibm.com>2019-12-25 21:52:56 -0500
committerczhengsz <czhengsz@cn.ibm.com>2019-12-25 21:56:18 -0500
commit1b57749a5334ae3d854c6f8732e741ef9f977219 (patch)
tree7f8ab9391842b30845996d5880f5ab515be638e5 /llvm/lib/Target/PowerPC/PPCMIPeephole.cpp
parent6599d004679e04f0d9e9c5b6c8503e463db79a1f (diff)
downloadbcm5719-llvm-1b57749a5334ae3d854c6f8732e741ef9f977219.tar.gz
bcm5719-llvm-1b57749a5334ae3d854c6f8732e741ef9f977219.zip
[PowerPC] stop folding if result rlwinm mask is wrap while original rlwinm is not.
%1:g8rc = RLWINM8 %0:g8rc, 0, 16, 9 %2:g8rc = RLWINM8 killed %1:g8rc, 0, 0, 31 -> %2:g8rc = RLWINM8 %0:g8rc, 0, 16, 9 The above folding is wrong. Before transformation, %2:g8rc is 32 bit value. After transformation, %2:g8rc becomes a 64 bit value. This patch fixes above issue. Reviewed by: steven.zhang Differential Revision: https://reviews.llvm.org/D71833
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCMIPeephole.cpp')
-rw-r--r--llvm/lib/Target/PowerPC/PPCMIPeephole.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp b/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp
index 0d45b0ae793..02a5cdcbcae 100644
--- a/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp
+++ b/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp
@@ -919,8 +919,12 @@ bool PPCMIPeephole::simplifyCode(void) {
LLVM_DEBUG(dbgs() << "With: ");
LLVM_DEBUG(MI.dump());
- } else if (isRunOfOnes((unsigned)(FinalMask.getZExtValue()), NewMB,
- NewME) || SrcMaskFull) {
+ } else if ((isRunOfOnes((unsigned)(FinalMask.getZExtValue()), NewMB,
+ NewME) && NewMB <= NewME)|| SrcMaskFull) {
+ // Here we only handle MBMI <= MEMI case, so NewMB must be no bigger
+ // than NewME. Otherwise we get a 64 bit value after folding, but MI
+ // return a 32 bit value.
+
// If FoldingReg has only one use and it it not RLWINMo and
// RLWINM8o, safe to delete its def SrcMI. Otherwise keep it.
if (MRI->hasOneNonDBGUse(FoldingReg) &&
OpenPOWER on IntegriCloud