summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/CodeGenPrepare.cpp
diff options
context:
space:
mode:
authorSerguei Katkov <serguei.katkov@azul.com>2017-11-29 05:51:26 +0000
committerSerguei Katkov <serguei.katkov@azul.com>2017-11-29 05:51:26 +0000
commit5036459ae30920a4c5d34baa9d246f8a61ccbfe6 (patch)
tree9002c0a90f9faf1b915c1beeb3a68d326c0bf621 /llvm/lib/CodeGen/CodeGenPrepare.cpp
parent0010707e1c0181dccbea5e8f352a4e5fc126ed12 (diff)
downloadbcm5719-llvm-5036459ae30920a4c5d34baa9d246f8a61ccbfe6.tar.gz
bcm5719-llvm-5036459ae30920a4c5d34baa9d246f8a61ccbfe6.zip
[CGP] Fix common type handling in optimizeMemoryInst
If common type is different we should bail out due to we will not be able to create a select or Phi of these values. Basically it is done in ExtAddrMode::compare however it does not work if we handle the null first and then two values of different types. so add a check in initializeMap as well. The check in ExtAddrMode::compare is used as earlier bail out. Reviewers: reames, john.brawn Reviewed By: john.brawn Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D40479 llvm-svn: 319292
Diffstat (limited to 'llvm/lib/CodeGen/CodeGenPrepare.cpp')
-rw-r--r--llvm/lib/CodeGen/CodeGenPrepare.cpp16
1 files changed, 10 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index 75f9f81c112..97fe56ec587 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -2909,8 +2909,10 @@ public:
// Build a map between <original value, basic block where we saw it> to
// value of base register.
+ // Bail out if there is no common type.
FoldAddrToValueMapping Map;
- initializeMap(Map);
+ if (!initializeMap(Map))
+ return false;
Value *CommonValue = findCommon(Map);
if (CommonValue)
@@ -2924,7 +2926,8 @@ private:
/// If address is not an instruction than basic block is set to null.
/// At the same time we find a common type for different field we will
/// use to create new Phi/Select nodes. Keep it in CommonType field.
- void initializeMap(FoldAddrToValueMapping &Map) {
+ /// Return false if there is no common type found.
+ bool initializeMap(FoldAddrToValueMapping &Map) {
// Keep track of keys where the value is null. We will need to replace it
// with constant null when we know the common type.
SmallVector<ValueInBB, 2> NullValue;
@@ -2936,10 +2939,10 @@ private:
Value *DV = AM.GetFieldAsValue(DifferentField, IntPtrTy);
if (DV) {
- if (CommonType)
- assert(CommonType == DV->getType() && "Different types detected!");
- else
- CommonType = DV->getType();
+ auto *Type = DV->getType();
+ if (CommonType && CommonType != Type)
+ return false;
+ CommonType = Type;
Map[{ AM.OriginalValue, BB }] = DV;
} else {
NullValue.push_back({ AM.OriginalValue, BB });
@@ -2948,6 +2951,7 @@ private:
assert(CommonType && "At least one non-null value must be!");
for (auto VIBB : NullValue)
Map[VIBB] = Constant::getNullValue(CommonType);
+ return true;
}
/// \brief We have mapping between value A and basic block where value A
OpenPOWER on IntegriCloud