[llvm] d9194b6 - [Attributor] Introduce a helper do deal with constant type mismatches
Johannes Doerfert via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 17 23:10:51 PDT 2021
Author: Johannes Doerfert
Date: 2021-06-18T01:07:52-05:00
New Revision: d9194b6efb4d287d2a9f2ad216a6fb5b7b260353
URL: https://github.com/llvm/llvm-project/commit/d9194b6efb4d287d2a9f2ad216a6fb5b7b260353
DIFF: https://github.com/llvm/llvm-project/commit/d9194b6efb4d287d2a9f2ad216a6fb5b7b260353.diff
LOG: [Attributor] Introduce a helper do deal with constant type mismatches
If we simplify values we sometimes end up with type mismatches. If the
value is a constant we can often cast it though to still allow
propagation. The logic is now put into a helper and it replaces some
ad hoc things we did before.
This also introduces the AA namespace for abstract attribute related
functions and types.
Differential Revision: https://reviews.llvm.org/D103856
Added:
Modified:
llvm/lib/Transforms/IPO/Attributor.cpp
llvm/lib/Transforms/IPO/AttributorAttributes.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp
index 414bd2e3db8a..e8d79fd15f7e 100644
--- a/llvm/lib/Transforms/IPO/Attributor.cpp
+++ b/llvm/lib/Transforms/IPO/Attributor.cpp
@@ -26,6 +26,7 @@
#include "llvm/Analysis/MustExecute.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/Attributes.h"
+#include "llvm/IR/Constants.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instruction.h"
@@ -167,6 +168,8 @@ ChangeStatus llvm::operator&(ChangeStatus L, ChangeStatus R) {
Value *AA::getWithType(Value &V, Type &Ty) {
if (V.getType() == &Ty)
return &V;
+ if (isa<PoisonValue>(V))
+ return PoisonValue::get(&Ty);
if (isa<UndefValue>(V))
return UndefValue::get(&Ty);
if (auto *C = dyn_cast<Constant>(&V)) {
diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
index bb2cc3f7659d..fe5e5369a4bd 100644
--- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
+++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
@@ -4631,10 +4631,10 @@ struct AAValueSimplifyImpl : AAValueSimplify {
auto *C = SimplifiedAssociatedValue.hasValue()
? dyn_cast<Constant>(SimplifiedAssociatedValue.getValue())
: UndefValue::get(V.getType());
- if (C && C != &V) {
+ if (C && C != &V && !V.user_empty()) {
Value *NewV = AA::getWithType(*C, *V.getType());
// We can replace the AssociatedValue with the constant.
- if (!V.user_empty() && &V != C && NewV) {
+ if (NewV && NewV != &V) {
LLVM_DEBUG(dbgs() << "[ValueSimplify] " << V << " -> " << *NewV
<< " :: " << *this << "\n");
if (A.changeValueAfterManifest(V, *NewV))
@@ -4773,35 +4773,34 @@ struct AAValueSimplifyReturned : AAValueSimplifyImpl {
if (SimplifiedAssociatedValue.hasValue() &&
!SimplifiedAssociatedValue.getValue())
- return Changed;
+ return Changed | AAValueSimplify::manifest(A);
- Value &V = getAssociatedValue();
auto *C = SimplifiedAssociatedValue.hasValue()
? dyn_cast<Constant>(SimplifiedAssociatedValue.getValue())
- : UndefValue::get(V.getType());
- if (C && C != &V) {
- auto PredForReturned =
- [&](Value &V, const SmallSetVector<ReturnInst *, 4> &RetInsts) {
- // We can replace the AssociatedValue with the constant.
- if (&V == C || isa<UndefValue>(V))
- return true;
-
- for (ReturnInst *RI : RetInsts) {
- if (RI->getFunction() != getAnchorScope())
- continue;
- Value *NewV =
- AA::getWithType(*C, *RI->getReturnValue()->getType());
- if (!NewV)
- continue;
- LLVM_DEBUG(dbgs() << "[ValueSimplify] " << V << " -> " << *NewV
- << " in " << *RI << " :: " << *this << "\n");
- if (A.changeUseAfterManifest(RI->getOperandUse(0), *NewV))
- Changed = ChangeStatus::CHANGED;
- }
+ : UndefValue::get(getAssociatedType());
+ if (!C || C == &getAssociatedValue())
+ return Changed | AAValueSimplify::manifest(A);
+
+ auto PredForReturned =
+ [&](Value &V, const SmallSetVector<ReturnInst *, 4> &RetInsts) {
+ // We can replace the AssociatedValue with the constant.
+ if (&V == C || isa<UndefValue>(V))
return true;
- };
- A.checkForAllReturnedValuesAndReturnInsts(PredForReturned, *this);
- }
+
+ for (ReturnInst *RI : RetInsts) {
+ if (RI->getFunction() != getAnchorScope())
+ continue;
+ Value *NewV = AA::getWithType(*C, *RI->getReturnValue()->getType());
+ if (!NewV)
+ continue;
+ LLVM_DEBUG(dbgs() << "[ValueSimplify] " << V << " -> " << *NewV
+ << " in " << *RI << " :: " << *this << "\n");
+ if (A.changeUseAfterManifest(RI->getOperandUse(0), *NewV))
+ Changed = ChangeStatus::CHANGED;
+ }
+ return true;
+ };
+ A.checkForAllReturnedValuesAndReturnInsts(PredForReturned, *this);
return Changed | AAValueSimplify::manifest(A);
}
More information about the llvm-commits
mailing list