Author: Nikita Popov Date: 2023-11-03T13:12:39+01:00 New Revision: 05a47706476f3cd467aa1c4347fdfb71bcbc1252
URL: https://github.com/llvm/llvm-project/commit/05a47706476f3cd467aa1c4347fdfb71bcbc1252 DIFF: https://github.com/llvm/llvm-project/commit/05a47706476f3cd467aa1c4347fdfb71bcbc1252.diff LOG: [ConstantFold] Fix incorrect type assumptions If a pointer isn't a constant expression, global or block address, it's not guaranteed to be a null pointer. It can also be a no_cfi or dso_local_equivalent constant. Added: Modified: llvm/lib/IR/ConstantFold.cpp llvm/test/Transforms/InstSimplify/ConstProp/icmp-global.ll Removed: ################################################################################ diff --git a/llvm/lib/IR/ConstantFold.cpp b/llvm/lib/IR/ConstantFold.cpp index d4bc74e00f19bb9..3f5da236af211f6 100644 --- a/llvm/lib/IR/ConstantFold.cpp +++ b/llvm/lib/IR/ConstantFold.cpp @@ -1172,30 +1172,24 @@ static ICmpInst::Predicate evaluateICmpRelation(Constant *V1, Constant *V2) { } if (const BlockAddress *BA = dyn_cast<BlockAddress>(V1)) { - // Now we know that the RHS is a BlockAddress or simple - // constant (which, since the types must match, means that it is a - // ConstantPointerNull). + // Now we know that the RHS is a BlockAddress or simple constant. if (const BlockAddress *BA2 = dyn_cast<BlockAddress>(V2)) { // Block address in another function can't equal this one, but block // addresses in the current function might be the same if blocks are // empty. if (BA2->getFunction() != BA->getFunction()) return ICmpInst::ICMP_NE; - } else { - // Block addresses aren't null. - assert(isa<ConstantPointerNull>(V2) && "Canonicalization guarantee!"); + } else if (isa<ConstantPointerNull>(V2)) { return ICmpInst::ICMP_NE; } } else if (const GlobalValue *GV = dyn_cast<GlobalValue>(V1)) { // Now we know that the RHS is a GlobalValue, BlockAddress or simple - // constant (which, since the types must match, means that it's a - // ConstantPointerNull). + // constant. if (const GlobalValue *GV2 = dyn_cast<GlobalValue>(V2)) { return areGlobalsPotentiallyEqual(GV, GV2); } else if (isa<BlockAddress>(V2)) { return ICmpInst::ICMP_NE; // Globals never equal labels. - } else { - assert(isa<ConstantPointerNull>(V2) && "Canonicalization guarantee!"); + } else if (isa<ConstantPointerNull>(V2)) { // GlobalVals can never be null unless they have external weak linkage. // We don't try to evaluate aliases here. // NOTE: We should not be doing this constant folding if null pointer diff --git a/llvm/test/Transforms/InstSimplify/ConstProp/icmp-global.ll b/llvm/test/Transforms/InstSimplify/ConstProp/icmp-global.ll index 701d911ea892ac4..3851bd090aef9f4 100644 --- a/llvm/test/Transforms/InstSimplify/ConstProp/icmp-global.ll +++ b/llvm/test/Transforms/InstSimplify/ConstProp/icmp-global.ll @@ -275,3 +275,26 @@ define i1 @global_gep_ugt_global_gep_complex() { %cmp = icmp ugt ptr %gep3, @g ret i1 %cmp } + +declare void @func() + +define i1 @global_no_cfi() { +; CHECK-LABEL: @global_no_cfi( +; CHECK-NEXT: ret i1 icmp eq (ptr @func, ptr no_cfi @func) +; + %cmp = icmp eq ptr @func, no_cfi @func + ret i1 %cmp +} + +define i1 @blockaddr_no_cfi() { +; CHECK-LABEL: @blockaddr_no_cfi( +; CHECK-NEXT: br label [[BB:%.*]] +; CHECK: bb: +; CHECK-NEXT: ret i1 icmp eq (ptr blockaddress(@blockaddr_no_cfi, [[BB]]), ptr no_cfi @func) +; + br label %bb + +bb: + %cmp = icmp eq ptr blockaddress(@blockaddr_no_cfi, %bb), no_cfi @func + ret i1 %cmp +} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits