[LowerConstantIntrinsics] reuse isManifestLogic from ConstantFolding
authorNick Desaulniers <ndesaulniers@google.com>
Fri, 14 May 2021 19:36:41 +0000 (12:36 -0700)
committerNick Desaulniers <ndesaulniers@google.com>
Fri, 14 May 2021 22:35:21 +0000 (15:35 -0700)
commit8c72749bd92d35397e93908bc5a504d4cbcef1cb
treeb742f0e1c31b83aef753c72781f06a03b487767b
parentbede7523b1b4b31e2eeb89ff5efa3ce873b3f250
[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
llvm/include/llvm/IR/Constant.h
llvm/lib/Analysis/ConstantFolding.cpp
llvm/lib/IR/Constants.cpp
llvm/lib/Transforms/Scalar/LowerConstantIntrinsics.cpp
llvm/test/Transforms/LowerConstantIntrinsics/constant-intrinsics.ll