[llvm] [ThinLTO] Don't mark calloc function dead (PR #72673)

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 29 07:41:56 PST 2023


================
@@ -0,0 +1,39 @@
+; REQUIRES: x86-registered-target
+; Checks that calloc function is not stripped by LTO DCE, otherwise
+; we may get into trouble during final link in case DSEPass folds
+; subsequent calls to malloc/memset into a single call to calloc.
+; Also see builtin-notstrip.ll which is similar to this test.
+
+; RUN: opt -module-summary %s -o %t1.bc
+; RUN: opt -module-summary %p/Inputs/calloc.ll -o %t2.bc
+; RUN: llvm-lto2 run -save-temps -o %t.out \
+; RUN:   %t1.bc -r=%t1.bc,_Z7DoStuffv,px \
+; RUN:          -r=%t1.bc,malloc,l -r=%t1.bc,__p,px \
+; RUN:   %t2.bc -r=%t2.bc,malloc,pl -r=%t2.bc,calloc,pl
+; RUN: llvm-dis %t.out.2.5.precodegen.bc -o - | FileCheck %s --check-prefix=CALLOC-DEF
+; RUN: llvm-dis %t.out.1.5.precodegen.bc -o - | FileCheck %s --check-prefix=CALLOC-USE
+
+; CALLOC-DEF: define {{.*}} @malloc
+; CALLOC-DEF: define {{.*}} @calloc
+
+; CALLOC-USE:      define void @_Z7DoStuffv()
+; CALLOC-USE-NEXT: entry:
+; CALLOC-USE-NEXT:   tail call {{.*}} ptr @calloc
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+declare ptr @malloc(i64)
+
+ at __p = dso_local local_unnamed_addr global ptr null, align 8
+
+define void @_Z7DoStuffv() {
+entry:
+  %call = tail call noalias ptr @malloc(i64 400)
+  tail call void @llvm.memset.p0.i64(ptr %call, i8 0, i64 400, i1 false)
+  store ptr %call, ptr @__p, align 8
+  ret void
+}
+
+declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg)
+
----------------
MaskRay wrote:

delete trailing blank line

https://github.com/llvm/llvm-project/pull/72673


More information about the llvm-commits mailing list