diff options
author | Nick Desaulniers <ndesaulniers@google.com> | 2021-05-14 12:36:41 -0700 |
---|---|---|
committer | Nick Desaulniers <ndesaulniers@google.com> | 2021-05-14 15:35:21 -0700 |
commit | 8c72749bd92d35397e93908bc5a504d4cbcef1cb (patch) | |
tree | b742f0e1c31b83aef753c72781f06a03b487767b /llvm/lib/IR/Constants.cpp | |
parent | bede7523b1b4b31e2eeb89ff5efa3ce873b3f250 (diff) | |
download | llvm-8c72749bd92d35397e93908bc5a504d4cbcef1cb.zip llvm-8c72749bd92d35397e93908bc5a504d4cbcef1cb.tar.gz llvm-8c72749bd92d35397e93908bc5a504d4cbcef1cb.tar.bz2 |
[LowerConstantIntrinsics] reuse isManifestLogic from ConstantFolding
GlobalVariables are Constants, yet should not unconditionally be
considered true for __builtin_constant_p.
Via the LangRef
https://llvm.org/docs/LangRef.html#llvm-is-constant-intrinsic:
This intrinsic generates no code. If its argument is known to be a
manifest compile-time constant value, then the intrinsic will be
converted to a constant true value. Otherwise, it will be converted
to a constant false value.
In particular, note that if the argument is a constant expression
which refers to a global (the address of which _is_ a constant, but
not manifest during the compile), then the intrinsic evaluates to
false.
Move isManifestConstant from ConstantFolding to be a method of
Constant so that we can reuse the same logic in
LowerConstantIntrinsics.
pr/41459
Reviewed By: rsmith, george.burgess.iv
Differential Revision: https://reviews.llvm.org/D102367
Diffstat (limited to 'llvm/lib/IR/Constants.cpp')
-rw-r--r-- | llvm/lib/IR/Constants.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/llvm/lib/IR/Constants.cpp b/llvm/lib/IR/Constants.cpp index 7d93d41..54b0a7d 100644 --- a/llvm/lib/IR/Constants.cpp +++ b/llvm/lib/IR/Constants.cpp @@ -823,6 +823,18 @@ Constant *Constant::mergeUndefsWith(Constant *C, Constant *Other) { return C; } +bool Constant::isManifestConstant() const { + if (isa<ConstantData>(this)) + return true; + if (isa<ConstantAggregate>(this) || isa<ConstantExpr>(this)) { + for (const Value *Op : operand_values()) + if (!cast<Constant>(Op)->isManifestConstant()) + return false; + return true; + } + return false; +} + //===----------------------------------------------------------------------===// // ConstantInt //===----------------------------------------------------------------------===// |