From 0d1f96063b980fefd513b4997171b3ed82c1fdee Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Sat, 6 Dec 2014 11:58:33 +0000 Subject: [PATCH] ConstantFold: Don't optimize comparisons with weak linkage objects Consider: void f() {} void __attribute__((weak)) g() {} bool b = &f != &g; It's possble for g to resolve to f if --defsym=g=f is passed on to the linker. llvm-svn: 223585 --- lib/IR/ConstantFold.cpp | 5 ++++- test/Assembler/ConstantExprNoFold.ll | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/IR/ConstantFold.cpp b/lib/IR/ConstantFold.cpp index cdfb41f7dcc..719a3a4b4c8 100644 --- a/lib/IR/ConstantFold.cpp +++ b/lib/IR/ConstantFold.cpp @@ -1348,9 +1348,12 @@ static FCmpInst::Predicate evaluateFCmpRelation(Constant *V1, Constant *V2) { static ICmpInst::Predicate areGlobalsPotentiallyEqual(const GlobalValue *GV1, const GlobalValue *GV2) { + auto isLinkageUnsafeForEquality = [](const GlobalValue *GV) { + return GV->hasExternalWeakLinkage() || GV->hasWeakAnyLinkage(); + }; // Don't try to decide equality of aliases. if (!isa(GV1) && !isa(GV2)) - if (!GV1->hasExternalWeakLinkage() || !GV2->hasExternalWeakLinkage()) + if (!isLinkageUnsafeForEquality(GV1) && !isLinkageUnsafeForEquality(GV2)) return ICmpInst::ICMP_NE; return ICmpInst::BAD_ICMP_PREDICATE; } diff --git a/test/Assembler/ConstantExprNoFold.ll b/test/Assembler/ConstantExprNoFold.ll index 8d03e7a320b..bed58c52ad9 100644 --- a/test/Assembler/ConstantExprNoFold.ll +++ b/test/Assembler/ConstantExprNoFold.ll @@ -31,6 +31,11 @@ target datalayout = "p:32:32" @weak.gep = global i32* getelementptr (i32* @weak, i32 1) @weak = extern_weak global i32 +; An object with weak linkage cannot have it's identity determined at compile time. +; CHECK: @F = global i1 icmp eq (i32* @weakany, i32* @glob) +@F = global i1 icmp eq (i32* @weakany, i32* @glob) +@weakany = weak global i32 0 + ; Don't add an inbounds on @glob.a3, since it's not inbounds. ; CHECK: @glob.a3 = alias getelementptr (i32* @glob.a2, i32 1) @glob = global i32 0