llvm-project/llvm/test/Transforms/GVN/malloc-load-removal.ll
Nikita Popov 92d55e7336 [MemoryBuiltins] Remove isNoAliasFn() in favor of isNoAliasCall()
We currently have two similar implementations of this concept:
isNoAliasCall() only checks for the noalias return attribute.
isNoAliasFn() also checks for allocation functions.

We should switch to only checking the attribute. SLC is responsible
for inferring the noalias return attribute for non-new allocation
functions (with a missing case fixed in
348bc76e35).
For new, clang is responsible for setting the attribute,
if -fno-assume-sane-operator-new is not passed.

Differential Revision: https://reviews.llvm.org/D116800
2022-01-10 09:18:15 +01:00

82 lines
2.2 KiB
LLVM

; RUN: opt -S -basic-aa -gvn < %s | FileCheck %s
; RUN: opt -S -basic-aa -gvn -disable-simplify-libcalls < %s | FileCheck %s -check-prefix=CHECK_NO_LIBCALLS
; PR13694
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.8.0"
declare noalias i8* @malloc(i64) nounwind
define noalias i8* @test1() nounwind uwtable ssp {
entry:
%call = tail call i8* @malloc(i64 100) nounwind
%0 = load i8, i8* %call, align 1
%tobool = icmp eq i8 %0, 0
br i1 %tobool, label %if.end, label %if.then
if.then: ; preds = %entry
store i8 0, i8* %call, align 1
br label %if.end
if.end: ; preds = %if.then, %entry
ret i8* %call
; CHECK-LABEL: @test1(
; CHECK-NOT: load
; CHECK-NOT: icmp
; CHECK_NO_LIBCALLS-LABEL: @test1(
; CHECK_NO_LIBCALLS: load
; CHECK_NO_LIBCALLS: icmp
}
declare noalias i8* @_Znwm(i64) nounwind
define noalias i8* @test2() nounwind uwtable ssp {
entry:
%call = tail call i8* @_Znwm(i64 100) nounwind
%0 = load i8, i8* %call, align 1
%tobool = icmp eq i8 %0, 0
br i1 %tobool, label %if.end, label %if.then
if.then: ; preds = %entry
store i8 0, i8* %call, align 1
br label %if.end
if.end: ; preds = %if.then, %entry
ret i8* %call
; CHECK-LABEL: @test2(
; CHECK-NOT: load
; CHECK-NOT: icmp
; CHECK_NO_LIBCALLS-LABEL: @test2(
; CHECK_NO_LIBCALLS: load
; CHECK_NO_LIBCALLS: icmp
}
declare noalias i8* @aligned_alloc(i64, i64) nounwind
define noalias i8* @test3() nounwind uwtable ssp {
entry:
%call = tail call i8* @aligned_alloc(i64 256, i64 32) nounwind
%0 = load i8, i8* %call, align 32
%tobool = icmp eq i8 %0, 0
br i1 %tobool, label %if.end, label %if.then
if.then: ; preds = %entry
store i8 0, i8* %call, align 1
br label %if.end
if.end: ; preds = %if.then, %entry
ret i8* %call
; CHECK-LABEL: @test3(
; CHECK-NOT: load
; CHECK-NOT: icmp
; CHECK_NO_LIBCALLS-LABEL: @test3(
; CHECK_NO_LIBCALLS: load
; CHECK_NO_LIBCALLS: icmp
}