diff options
author | Dávid Bolvanský <david.bolvansky@gmail.com> | 2021-04-20 12:38:55 +0200 |
---|---|---|
committer | Dávid Bolvanský <david.bolvansky@gmail.com> | 2021-04-20 12:39:54 +0200 |
commit | 319c9f6e5884c69903b4140098a4d378b97abc7c (patch) | |
tree | 73e017624ecf6253c96b30db369ba4f1b39f8261 | |
parent | [Support] APInt.h - remove <algorithm> include. NFCI. (diff) | |
download | llvm-project-319c9f6e5884c69903b4140098a4d378b97abc7c.tar.gz llvm-project-319c9f6e5884c69903b4140098a4d378b97abc7c.tar.bz2 llvm-project-319c9f6e5884c69903b4140098a4d378b97abc7c.zip |
[MemoryBuiltins] Added support for memalign
memalign is older aligned_alloc.
-rw-r--r-- | llvm/lib/Analysis/MemoryBuiltins.cpp | 1 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/deref-alloc-fns.ll | 52 |
2 files changed, 53 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/MemoryBuiltins.cpp b/llvm/lib/Analysis/MemoryBuiltins.cpp index 51a59efb94f3..7adadb762b84 100644 --- a/llvm/lib/Analysis/MemoryBuiltins.cpp +++ b/llvm/lib/Analysis/MemoryBuiltins.cpp @@ -103,6 +103,7 @@ static const std::pair<LibFunc, AllocFnsTy> AllocationFnData[] = { {LibFunc_msvc_new_array_longlong, {OpNewLike, 1, 0, -1}}, // new[](unsigned long long) {LibFunc_msvc_new_array_longlong_nothrow, {MallocLike, 2, 0, -1}}, // new[](unsigned long long, nothrow) {LibFunc_aligned_alloc, {AlignedAllocLike, 2, 1, -1}}, + {LibFunc_memalign, {AlignedAllocLike, 2, 1, -1}}, {LibFunc_calloc, {CallocLike, 2, 0, 1}}, {LibFunc_vec_calloc, {CallocLike, 2, 0, 1}}, {LibFunc_realloc, {ReallocLike, 2, 1, -1}}, diff --git a/llvm/test/Transforms/InstCombine/deref-alloc-fns.ll b/llvm/test/Transforms/InstCombine/deref-alloc-fns.ll index b660e6b4c0d9..b1901a1783df 100644 --- a/llvm/test/Transforms/InstCombine/deref-alloc-fns.ll +++ b/llvm/test/Transforms/InstCombine/deref-alloc-fns.ll @@ -1,5 +1,7 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -instcombine -S < %s | FileCheck %s +; RUN: opt -mtriple=x86_64-unknown-linux-gnu < %s -instcombine -S | FileCheck %s --check-prefixes=CHECK,GNU + declare noalias i8* @malloc(i64) declare noalias i8* @calloc(i64, i64) @@ -8,6 +10,7 @@ declare noalias nonnull i8* @_Znam(i64) ; throwing version of 'new' declare noalias nonnull i8* @_Znwm(i64) ; throwing version of 'new' declare noalias i8* @strdup(i8*) declare noalias i8* @aligned_alloc(i64, i64) +declare noalias i8* @memalign(i64, i64) @.str = private unnamed_addr constant [6 x i8] c"hello\00", align 1 @@ -60,6 +63,15 @@ define noalias i8* @aligned_alloc_unknown_size_possibly_zero(i1 %c) { ret i8* %call } +define noalias i8* @aligned_alloc_unknown_align(i64 %align) { +; CHECK-LABEL: @aligned_alloc_unknown_align( +; CHECK-NEXT: [[CALL:%.*]] = tail call noalias dereferenceable_or_null(128) i8* @aligned_alloc(i64 [[ALIGN:%.*]], i64 128) +; CHECK-NEXT: ret i8* [[CALL]] +; + %call = tail call noalias i8* @aligned_alloc(i64 %align, i64 128) + ret i8* %call +} + declare noalias i8* @foo(i8*, i8*, i8*) define noalias i8* @aligned_alloc_dynamic_args(i64 %align, i64 %size) { @@ -78,6 +90,46 @@ define noalias i8* @aligned_alloc_dynamic_args(i64 %align, i64 %size) { ret i8* %call } +define noalias i8* @memalign_constant_size() { +; GNU-LABEL: @memalign_constant_size( +; GNU-NEXT: [[CALL:%.*]] = tail call noalias align 32 dereferenceable_or_null(512) i8* @memalign(i64 32, i64 512) +; GNU-NEXT: ret i8* [[CALL]] +; + %call = tail call noalias i8* @memalign(i64 32, i64 512) + ret i8* %call +} + +define noalias i8* @memalign_unknown_size_nonzero(i1 %c) { +; GNU-LABEL: @memalign_unknown_size_nonzero( +; GNU-NEXT: [[SIZE:%.*]] = select i1 [[C:%.*]], i64 64, i64 128 +; GNU-NEXT: [[CALL:%.*]] = tail call noalias align 32 i8* @memalign(i64 32, i64 [[SIZE]]) +; GNU-NEXT: ret i8* [[CALL]] +; + %size = select i1 %c, i64 64, i64 128 + %call = tail call noalias i8* @memalign(i64 32, i64 %size) + ret i8* %call +} + +define noalias i8* @memalign_unknown_size_possibly_zero(i1 %c) { +; CHECK-LABEL: @memalign_unknown_size_possibly_zero( +; CHECK-NEXT: [[SIZE:%.*]] = select i1 [[C:%.*]], i64 64, i64 0 +; CHECK-NEXT: [[CALL:%.*]] = tail call noalias i8* @memalign(i64 32, i64 [[SIZE]]) +; CHECK-NEXT: ret i8* [[CALL]] +; + %size = select i1 %c, i64 64, i64 0 + %call = tail call noalias i8* @memalign(i64 32, i64 %size) + ret i8* %call +} + +define noalias i8* @memalign_unknown_align(i64 %align) { +; GNU-LABEL: @memalign_unknown_align( +; GNU-NEXT: [[CALL:%.*]] = tail call noalias dereferenceable_or_null(128) i8* @memalign(i64 [[ALIGN:%.*]], i64 128) +; GNU-NEXT: ret i8* [[CALL]] +; + %call = tail call noalias i8* @memalign(i64 %align, i64 128) + ret i8* %call +} + define noalias i8* @malloc_constant_size2() { ; CHECK-LABEL: @malloc_constant_size2( ; CHECK-NEXT: [[CALL:%.*]] = tail call noalias dereferenceable_or_null(80) i8* @malloc(i64 40) |