| ; RUN: opt < %s -functionattrs -S | FileCheck %s |
| ; RUN: opt < %s -passes=function-attrs -S | FileCheck %s |
| |
| target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" |
| target triple = "x86_64-unknown-linux-gnu" |
| |
| ; CHECK: define void @_Z4foo1Pi(i32* nocapture readnone %a) local_unnamed_addr #0 { |
| define void @_Z4foo1Pi(i32* nocapture readnone %a) local_unnamed_addr #0 { |
| entry: |
| tail call void @_Z3extv() |
| ret void |
| } |
| |
| declare void @_Z3extv() local_unnamed_addr |
| |
| ; CHECK: define void @_Z4foo2Pi(i32* nocapture %a) local_unnamed_addr #1 { |
| define void @_Z4foo2Pi(i32* nocapture %a) local_unnamed_addr #1 { |
| entry: |
| %0 = bitcast i32* %a to i8* |
| tail call void @free(i8* %0) #2 |
| ret void |
| } |
| |
| declare void @free(i8* nocapture) local_unnamed_addr #2 |
| |
| ; CHECK: define i32 @_Z4foo3Pi(i32* nocapture readonly %a) local_unnamed_addr #3 { |
| define i32 @_Z4foo3Pi(i32* nocapture readonly %a) local_unnamed_addr #3 { |
| entry: |
| %0 = load i32, i32* %a, align 4 |
| ret i32 %0 |
| } |
| |
| ; CHECK: define double @_Z4foo4Pd(double* nocapture readonly %a) local_unnamed_addr #1 { |
| define double @_Z4foo4Pd(double* nocapture readonly %a) local_unnamed_addr #1 { |
| entry: |
| %0 = load double, double* %a, align 8 |
| %call = tail call double @cos(double %0) #2 |
| ret double %call |
| } |
| |
| declare double @cos(double) local_unnamed_addr #2 |
| |
| ; CHECK: define noalias i32* @_Z4foo5Pm(i64* nocapture readonly %a) local_unnamed_addr #1 { |
| define noalias i32* @_Z4foo5Pm(i64* nocapture readonly %a) local_unnamed_addr #1 { |
| entry: |
| %0 = load i64, i64* %a, align 8 |
| %call = tail call noalias i8* @malloc(i64 %0) #2 |
| %1 = bitcast i8* %call to i32* |
| ret i32* %1 |
| } |
| |
| declare noalias i8* @malloc(i64) local_unnamed_addr #2 |
| |
| ; CHECK: define noalias i64* @_Z4foo6Pm(i64* nocapture %a) local_unnamed_addr #1 { |
| define noalias i64* @_Z4foo6Pm(i64* nocapture %a) local_unnamed_addr #1 { |
| entry: |
| %0 = bitcast i64* %a to i8* |
| %1 = load i64, i64* %a, align 8 |
| %call = tail call i8* @realloc(i8* %0, i64 %1) #2 |
| %2 = bitcast i8* %call to i64* |
| ret i64* %2 |
| } |
| |
| declare noalias i8* @realloc(i8* nocapture, i64) local_unnamed_addr #2 |
| |
| ; CHECK: define void @_Z4foo7Pi(i32* %a) local_unnamed_addr #1 { |
| define void @_Z4foo7Pi(i32* %a) local_unnamed_addr #1 { |
| entry: |
| %isnull = icmp eq i32* %a, null |
| br i1 %isnull, label %delete.end, label %delete.notnull |
| |
| delete.notnull: ; preds = %entry |
| %0 = bitcast i32* %a to i8* |
| tail call void @_ZdlPv(i8* %0) #5 |
| br label %delete.end |
| |
| delete.end: ; preds = %delete.notnull, %entry |
| ret void |
| } |
| |
| declare void @_ZdlPv(i8*) local_unnamed_addr #4 |
| |
| ; CHECK: define void @_Z4foo8Pi(i32* %a) local_unnamed_addr #1 { |
| define void @_Z4foo8Pi(i32* %a) local_unnamed_addr #1 { |
| entry: |
| %isnull = icmp eq i32* %a, null |
| br i1 %isnull, label %delete.end, label %delete.notnull |
| |
| delete.notnull: ; preds = %entry |
| %0 = bitcast i32* %a to i8* |
| tail call void @_ZdaPv(i8* %0) #5 |
| br label %delete.end |
| |
| delete.end: ; preds = %delete.notnull, %entry |
| ret void |
| } |
| |
| declare void @_ZdaPv(i8*) local_unnamed_addr #4 |
| |
| attributes #0 = { uwtable } |
| attributes #1 = { nounwind uwtable } |
| attributes #2 = { nounwind } |
| attributes #3 = { norecurse nounwind readonly uwtable } |
| attributes #4 = { nobuiltin nounwind } |
| attributes #5 = { builtin nounwind } |
| |
| ; CHECK: attributes #0 = { uwtable } |
| ; CHECK: attributes #1 = { nounwind uwtable } |
| ; CHECK: attributes #2 = { nounwind } |
| ; CHECK: attributes #3 = { norecurse nounwind readonly uwtable } |
| ; CHECK: attributes #4 = { nobuiltin nounwind } |
| ; CHECK: attributes #5 = { builtin nounwind } |
| |