Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/Transforms/Attributor/IPConstantProp/pthreads.ll
Show All 27 Lines | |||||
; FIXME: nocapture & noalias for %alloc2 in %call3 | ; FIXME: nocapture & noalias for %alloc2 in %call3 | ||||
define dso_local i32 @main() { | define dso_local i32 @main() { | ||||
; CHECK-LABEL: define {{[^@]+}}@main() | ; CHECK-LABEL: define {{[^@]+}}@main() | ||||
; CHECK-NEXT: entry: | ; CHECK-NEXT: entry: | ||||
; CHECK-NEXT: [[ALLOC1:%.*]] = alloca i8, align 8 | ; CHECK-NEXT: [[ALLOC1:%.*]] = alloca i8, align 8 | ||||
; CHECK-NEXT: [[ALLOC2:%.*]] = alloca i8, align 8 | ; CHECK-NEXT: [[ALLOC2:%.*]] = alloca i8, align 8 | ||||
; CHECK-NEXT: [[THREAD:%.*]] = alloca i64, align 8 | ; CHECK-NEXT: [[THREAD:%.*]] = alloca i64, align 8 | ||||
; CHECK-NEXT: [[CALL:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias null, i8* (i8*)* nonnull @foo, i8* noalias null) | ; CHECK-NEXT: [[CALL:%.*]] = call i32 @pthread_create(i64* noalias nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias null, i8* (i8*)* nonnull @foo, i8* noalias null) | ||||
; CHECK-NEXT: [[CALL1:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias null, i8* (i8*)* nonnull @bar, i8* nonnull align 8 dereferenceable(8) bitcast (i8** @GlobalVPtr to i8*)) | ; CHECK-NEXT: [[CALL1:%.*]] = call i32 @pthread_create(i64* noalias nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias null, i8* (i8*)* nonnull @bar, i8* nonnull align 8 dereferenceable(8) bitcast (i8** @GlobalVPtr to i8*)) | ||||
; CHECK-NEXT: [[CALL2:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias null, i8* (i8*)* nonnull @baz, i8* noalias nocapture nonnull align 8 dereferenceable(1) [[ALLOC1]]) | ; CHECK-NEXT: [[CALL2:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias null, i8* (i8*)* nonnull @baz, i8* noalias nocapture nonnull align 8 dereferenceable(1) [[ALLOC1]]) | ||||
; CHECK-NEXT: [[CALL3:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias null, i8* (i8*)* nonnull @buz, i8* nonnull align 8 dereferenceable(1) [[ALLOC2]]) | ; CHECK-NEXT: [[CALL3:%.*]] = call i32 @pthread_create(i64* noalias nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias null, i8* (i8*)* nonnull @buz, i8* noalias nonnull align 8 dereferenceable(1) [[ALLOC2]]) | ||||
; CHECK-NEXT: ret i32 0 | ; CHECK-NEXT: ret i32 0 | ||||
jdoerfert: I think only the first `noalias` is correct. Hopefully with the changes I suggested above this… | |||||
; | ; | ||||
entry: | entry: | ||||
%alloc1 = alloca i8, align 8 | %alloc1 = alloca i8, align 8 | ||||
%alloc2 = alloca i8, align 8 | %alloc2 = alloca i8, align 8 | ||||
%thread = alloca i64, align 8 | %thread = alloca i64, align 8 | ||||
%call = call i32 @pthread_create(i64* nonnull %thread, %union.pthread_attr_t* null, i8* (i8*)* nonnull @foo, i8* null) | %call = call i32 @pthread_create(i64* nonnull %thread, %union.pthread_attr_t* null, i8* (i8*)* nonnull @foo, i8* null) | ||||
%call1 = call i32 @pthread_create(i64* nonnull %thread, %union.pthread_attr_t* null, i8* (i8*)* nonnull @bar, i8* bitcast (i8** @GlobalVPtr to i8*)) | %call1 = call i32 @pthread_create(i64* nonnull %thread, %union.pthread_attr_t* null, i8* (i8*)* nonnull @bar, i8* bitcast (i8** @GlobalVPtr to i8*)) | ||||
%call2 = call i32 @pthread_create(i64* nonnull %thread, %union.pthread_attr_t* null, i8* (i8*)* nonnull @baz, i8* nocapture %alloc1) | %call2 = call i32 @pthread_create(i64* nonnull %thread, %union.pthread_attr_t* null, i8* (i8*)* nonnull @baz, i8* nocapture %alloc1) | ||||
Show All 30 Lines | |||||
; CHECK-NEXT: ret i8* [[ARG:%.*]] | ; CHECK-NEXT: ret i8* [[ARG:%.*]] | ||||
; | ; | ||||
entry: | entry: | ||||
ret i8* %arg | ret i8* %arg | ||||
} | } | ||||
define internal i8* @buz(i8* %arg) { | define internal i8* @buz(i8* %arg) { | ||||
; CHECK-LABEL: define {{[^@]+}}@buz | ; CHECK-LABEL: define {{[^@]+}}@buz | ||||
; CHECK-SAME: (i8* nofree nonnull readnone returned align 8 dereferenceable(1) [[ARG:%.*]]) | ; CHECK-SAME: (i8* noalias nofree nonnull readnone returned align 8 dereferenceable(1) [[ARG:%.*]]) | ||||
; CHECK-NEXT: entry: | ; CHECK-NEXT: entry: | ||||
; CHECK-NEXT: ret i8* [[ARG:%.*]] | ; CHECK-NEXT: ret i8* [[ARG:%.*]] | ||||
; | ; | ||||
entry: | entry: | ||||
ret i8* %arg | ret i8* %arg | ||||
} | } | ||||
!1 = !{i64 2, i64 3, i1 false} | !1 = !{i64 2, i64 3, i1 false} | ||||
!0 = !{!1} | !0 = !{!1} |
I think only the first noalias is correct. Hopefully with the changes I suggested above this should be fixed.