1; RUN: opt < %s -function-attrs -S | FileCheck %s 2; RUN: opt < %s -passes=function-attrs -S | FileCheck %s 3 4target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 5target triple = "x86_64-unknown-linux-gnu" 6 7; CHECK: define void @_Z4foo1Pi(i32* nocapture readnone %a) local_unnamed_addr #0 { 8define void @_Z4foo1Pi(i32* nocapture readnone %a) local_unnamed_addr #0 { 9entry: 10 tail call void @_Z3extv() 11 ret void 12} 13 14declare void @_Z3extv() local_unnamed_addr 15 16; CHECK: define void @_Z4foo2Pi(i32* nocapture %a) local_unnamed_addr #1 { 17define void @_Z4foo2Pi(i32* nocapture %a) local_unnamed_addr #1 { 18entry: 19 %0 = bitcast i32* %a to i8* 20 tail call void @free(i8* %0) #2 21 ret void 22} 23 24declare void @free(i8* nocapture) local_unnamed_addr #2 25 26; CHECK: define i32 @_Z4foo3Pi(i32* nocapture readonly %a) local_unnamed_addr #3 { 27define i32 @_Z4foo3Pi(i32* nocapture readonly %a) local_unnamed_addr #3 { 28entry: 29 %0 = load i32, i32* %a, align 4 30 ret i32 %0 31} 32 33; CHECK: define double @_Z4foo4Pd(double* nocapture readonly %a) local_unnamed_addr #1 { 34define double @_Z4foo4Pd(double* nocapture readonly %a) local_unnamed_addr #1 { 35entry: 36 %0 = load double, double* %a, align 8 37 %call = tail call double @cos(double %0) #2 38 ret double %call 39} 40 41declare double @cos(double) local_unnamed_addr #2 42 43; CHECK: define noalias i32* @_Z4foo5Pm(i64* nocapture readonly %a) local_unnamed_addr #1 { 44define noalias i32* @_Z4foo5Pm(i64* nocapture readonly %a) local_unnamed_addr #1 { 45entry: 46 %0 = load i64, i64* %a, align 8 47 %call = tail call noalias i8* @malloc(i64 %0) #2 48 %1 = bitcast i8* %call to i32* 49 ret i32* %1 50} 51 52declare noalias i8* @malloc(i64) local_unnamed_addr #2 53 54; CHECK: define noalias i64* @_Z4foo6Pm(i64* nocapture %a) local_unnamed_addr #1 { 55define noalias i64* @_Z4foo6Pm(i64* nocapture %a) local_unnamed_addr #1 { 56entry: 57 %0 = bitcast i64* %a to i8* 58 %1 = load i64, i64* %a, align 8 59 %call = tail call i8* @realloc(i8* %0, i64 %1) #2 60 %2 = bitcast i8* %call to i64* 61 ret i64* %2 62} 63 64declare noalias i8* @realloc(i8* nocapture, i64) local_unnamed_addr #2 65 66; CHECK: define void @_Z4foo7Pi(i32* %a) local_unnamed_addr #1 { 67define void @_Z4foo7Pi(i32* %a) local_unnamed_addr #1 { 68entry: 69 %isnull = icmp eq i32* %a, null 70 br i1 %isnull, label %delete.end, label %delete.notnull 71 72delete.notnull: ; preds = %entry 73 %0 = bitcast i32* %a to i8* 74 tail call void @_ZdlPv(i8* %0) #5 75 br label %delete.end 76 77delete.end: ; preds = %delete.notnull, %entry 78 ret void 79} 80 81declare void @_ZdlPv(i8*) local_unnamed_addr #4 82 83; CHECK: define void @_Z4foo8Pi(i32* %a) local_unnamed_addr #1 { 84define void @_Z4foo8Pi(i32* %a) local_unnamed_addr #1 { 85entry: 86 %isnull = icmp eq i32* %a, null 87 br i1 %isnull, label %delete.end, label %delete.notnull 88 89delete.notnull: ; preds = %entry 90 %0 = bitcast i32* %a to i8* 91 tail call void @_ZdaPv(i8* %0) #5 92 br label %delete.end 93 94delete.end: ; preds = %delete.notnull, %entry 95 ret void 96} 97 98declare void @_ZdaPv(i8*) local_unnamed_addr #4 99 100attributes #0 = { uwtable } 101attributes #1 = { nounwind uwtable } 102attributes #2 = { nounwind } 103attributes #3 = { norecurse nounwind readonly uwtable } 104attributes #4 = { nobuiltin nounwind } 105attributes #5 = { builtin nounwind } 106 107; CHECK: attributes #0 = { uwtable } 108; CHECK: attributes #1 = { nounwind uwtable } 109; CHECK: attributes #2 = { nounwind } 110; CHECK: attributes #3 = { norecurse nounwind readonly uwtable } 111; CHECK: attributes #4 = { nobuiltin nounwind } 112; CHECK: attributes #5 = { builtin nounwind } 113 114