xbolva00 created this revision. xbolva00 added reviewers: aaron.ballman, rjmccall. xbolva00 requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
LLVM should be smarter about *known* malloc's alignment and this knowledge may enable other optimizations. Originally started as LLVM patch - https://reviews.llvm.org/D100862 but this logic should be really in Clang. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D100879 Files: clang/lib/CodeGen/CGCall.cpp clang/lib/Sema/SemaDecl.cpp Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -45,6 +45,7 @@ #include "clang/Sema/Template.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/Triple.h" + #include "llvm/IR/Attributes.h" #include <algorithm> #include <cstring> #include <functional> Index: clang/lib/CodeGen/CGCall.cpp =================================================================== --- clang/lib/CodeGen/CGCall.cpp +++ clang/lib/CodeGen/CGCall.cpp @@ -2048,6 +2048,22 @@ // allows it to work on indirect virtual function calls. if (AttrOnCallSite && TargetDecl->hasAttr<NoMergeAttr>()) FuncAttrs.addAttribute(llvm::Attribute::NoMerge); + + // Add known guaranteed alignment for allocation functions + if (unsigned BuiltinID = Fn->getBuiltinID()) { + switch (BuiltinID) { + case Builtin::BImalloc: + case Builtin::BIcalloc: + case Builtin::BIrealloc: + case Builtin::BIstrdup: + case Builtin::BIstrndup: + RetAttrs.addAlignmentAttr(Context.getTargetInfo().getNewAlign() / + Context.getTargetInfo().getCharWidth()); + break; + default: + break; + } + } } // 'const', 'pure' and 'noalias' attributed functions are also nounwind.
Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -45,6 +45,7 @@ #include "clang/Sema/Template.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/Triple.h" + #include "llvm/IR/Attributes.h" #include <algorithm> #include <cstring> #include <functional> Index: clang/lib/CodeGen/CGCall.cpp =================================================================== --- clang/lib/CodeGen/CGCall.cpp +++ clang/lib/CodeGen/CGCall.cpp @@ -2048,6 +2048,22 @@ // allows it to work on indirect virtual function calls. if (AttrOnCallSite && TargetDecl->hasAttr<NoMergeAttr>()) FuncAttrs.addAttribute(llvm::Attribute::NoMerge); + + // Add known guaranteed alignment for allocation functions + if (unsigned BuiltinID = Fn->getBuiltinID()) { + switch (BuiltinID) { + case Builtin::BImalloc: + case Builtin::BIcalloc: + case Builtin::BIrealloc: + case Builtin::BIstrdup: + case Builtin::BIstrndup: + RetAttrs.addAlignmentAttr(Context.getTargetInfo().getNewAlign() / + Context.getTargetInfo().getCharWidth()); + break; + default: + break; + } + } } // 'const', 'pure' and 'noalias' attributed functions are also nounwind.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits