Skip to content

Commit 9302194

Browse files
committed
[Attributor] Treat byval arguments as objects
1 parent cbef629 commit 9302194

File tree

8 files changed

+22
-54
lines changed

8 files changed

+22
-54
lines changed

llvm/lib/Transforms/IPO/Attributor.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,8 @@ static bool getPotentialCopiesOfMemoryValue(
398398
}
399399
// TODO: Use assumed noalias return.
400400
if (!isa<AllocaInst>(&Obj) && !isa<GlobalVariable>(&Obj) &&
401-
!(IsLoad ? isAllocationFn(&Obj, TLI) : isNoAliasCall(&Obj))) {
401+
!(IsLoad ? isAllocationFn(&Obj, TLI) : isNoAliasCall(&Obj)) &&
402+
!(isa<Argument>(Obj) && cast<Argument>(Obj).hasByValAttr())) {
402403
LLVM_DEBUG(dbgs() << "Underlying object is not supported yet: " << Obj
403404
<< "\n";);
404405
return false;

llvm/test/Transforms/Attributor/ArgumentPromotion/attrs.ll

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,7 @@ define internal i32 @f(ptr byval(%struct.ss) %b, ptr byval(i32) %X, i32 %i) noun
2020
; CHECK-NEXT: [[VAL1:%.*]] = load i32, ptr [[B_PRIV]], align 8
2121
; CHECK-NEXT: [[VAL2:%.*]] = add i32 [[VAL1]], 1
2222
; CHECK-NEXT: store i32 [[VAL2]], ptr [[B_PRIV]], align 8
23-
; CHECK-NEXT: store i32 0, ptr [[X_PRIV]], align 4
24-
; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[X_PRIV]], align 4
25-
; CHECK-NEXT: [[A:%.*]] = add i32 [[L]], [[VAL2]]
26-
; CHECK-NEXT: ret i32 [[A]]
23+
; CHECK-NEXT: ret i32 [[VAL2]]
2724
;
2825
entry:
2926

llvm/test/Transforms/Attributor/ArgumentPromotion/byval-2.ll

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,6 @@ define internal void @f(ptr byval(%struct.ss) %b, ptr byval(i32) %X) nounwind
1515
; CHECK-NEXT: store i32 [[TMP0]], ptr [[B_PRIV]], align 4
1616
; CHECK-NEXT: [[B_PRIV_B4:%.*]] = getelementptr i8, ptr [[B_PRIV]], i64 4
1717
; CHECK-NEXT: store i64 [[TMP1]], ptr [[B_PRIV_B4]], align 4
18-
; CHECK-NEXT: [[VAL1:%.*]] = load i32, ptr [[B_PRIV]], align 8
19-
; CHECK-NEXT: [[VAL2:%.*]] = add i32 [[VAL1]], 1
20-
; CHECK-NEXT: store i32 [[VAL2]], ptr [[B_PRIV]], align 8
21-
; CHECK-NEXT: store i32 0, ptr [[X_PRIV]], align 4
2218
; CHECK-NEXT: ret void
2319
;
2420
entry:
@@ -32,12 +28,11 @@ entry:
3228

3329
define i32 @test(ptr %X) {
3430
;
35-
; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)
31+
; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
3632
; TUNIT-LABEL: define {{[^@]+}}@test
3733
; TUNIT-SAME: (ptr nofree nonnull readonly captures(none) [[X:%.*]]) #[[ATTR1:[0-9]+]] {
3834
; TUNIT-NEXT: entry:
3935
; TUNIT-NEXT: [[S:%.*]] = alloca [[STRUCT_SS:%.*]], align 8
40-
; TUNIT-NEXT: store i32 1, ptr [[S]], align 8
4136
; TUNIT-NEXT: [[VAL4:%.*]] = getelementptr [[STRUCT_SS]], ptr [[S]], i32 0, i32 1
4237
; TUNIT-NEXT: [[TMP0:%.*]] = load i32, ptr [[S]], align 8
4338
; TUNIT-NEXT: [[S_B4:%.*]] = getelementptr i8, ptr [[S]], i64 4
@@ -64,8 +59,8 @@ entry:
6459
}
6560
;.
6661
; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
67-
; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) }
68-
; TUNIT: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn }
62+
; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) }
63+
; TUNIT: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn memory(write) }
6964
;.
7065
; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
7166
; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) }

llvm/test/Transforms/Attributor/IPConstantProp/2009-09-24-byval-ptr.ll

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@ define internal void @vfu1(ptr byval(%struct.MYstr) align 4 %u) nounwind {
2121
; CHECK-NEXT: [[U_PRIV_B4:%.*]] = getelementptr i8, ptr [[U_PRIV]], i64 4
2222
; CHECK-NEXT: store i32 [[TMP1]], ptr [[U_PRIV_B4]], align 4
2323
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr [[STRUCT_MYSTR]], ptr [[U_PRIV]], i32 0, i32 1
24-
; CHECK-NEXT: store i32 99, ptr [[TMP2]], align 4
25-
; CHECK-NEXT: store i8 97, ptr [[U_PRIV]], align 8
26-
; CHECK-NEXT: [[L:%.*]] = load i8, ptr [[U_PRIV]], align 8
27-
; CHECK-NEXT: call void @use(i8 [[L]])
24+
; CHECK-NEXT: call void @use(i8 noundef 97)
2825
; CHECK-NEXT: br label [[RETURN:%.*]]
2926
; CHECK: return:
3027
; CHECK-NEXT: ret void
@@ -74,12 +71,12 @@ define i32 @unions() nounwind {
7471
; TUNIT-SAME: () #[[ATTR2:[0-9]+]] {
7572
; TUNIT-NEXT: entry:
7673
; TUNIT-NEXT: [[TMP0:%.*]] = load i8, ptr @mystr, align 8
77-
; TUNIT-NEXT: [[MYSTR_B41:%.*]] = getelementptr i8, ptr @mystr, i64 4
78-
; TUNIT-NEXT: [[TMP1:%.*]] = load i32, ptr [[MYSTR_B41]], align 8
74+
; TUNIT-NEXT: [[MYSTR_B4:%.*]] = getelementptr i8, ptr @mystr, i64 4
75+
; TUNIT-NEXT: [[TMP1:%.*]] = load i32, ptr [[MYSTR_B4]], align 8
7976
; TUNIT-NEXT: call void @vfu1(i8 [[TMP0]], i32 [[TMP1]]) #[[ATTR2]]
8077
; TUNIT-NEXT: [[TMP2:%.*]] = load i8, ptr @mystr, align 8
81-
; TUNIT-NEXT: [[MYSTR_B4:%.*]] = getelementptr i8, ptr @mystr, i64 4
82-
; TUNIT-NEXT: [[TMP3:%.*]] = load i32, ptr [[MYSTR_B4]], align 8
78+
; TUNIT-NEXT: [[MYSTR_B41:%.*]] = getelementptr i8, ptr @mystr, i64 4
79+
; TUNIT-NEXT: [[TMP3:%.*]] = load i32, ptr [[MYSTR_B41]], align 8
8380
; TUNIT-NEXT: [[RESULT:%.*]] = call i32 @vfu2(i8 [[TMP2]], i32 [[TMP3]]) #[[ATTR3:[0-9]+]]
8481
; TUNIT-NEXT: ret i32 [[RESULT]]
8582
;
@@ -113,13 +110,10 @@ define internal i32 @vfu2_v2(ptr byval(%struct.MYstr) align 4 %u) nounwind reado
113110
; CHECK-NEXT: [[U_PRIV_B4:%.*]] = getelementptr i8, ptr [[U_PRIV]], i64 4
114111
; CHECK-NEXT: store i32 [[TMP1]], ptr [[U_PRIV_B4]], align 4
115112
; CHECK-NEXT: [[Z:%.*]] = getelementptr [[STRUCT_MYSTR]], ptr [[U_PRIV]], i32 0, i32 1
116-
; CHECK-NEXT: store i32 99, ptr [[Z]], align 4
117-
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr [[STRUCT_MYSTR]], ptr [[U_PRIV]], i32 0, i32 1
118-
; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4
119-
; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[U_PRIV]], align 8
120-
; CHECK-NEXT: [[TMP5:%.*]] = zext i8 [[TMP4]] to i32
121-
; CHECK-NEXT: [[TMP6:%.*]] = add i32 [[TMP5]], [[TMP3]]
122-
; CHECK-NEXT: ret i32 [[TMP6]]
113+
; CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[U_PRIV]], align 8
114+
; CHECK-NEXT: [[TMP3:%.*]] = zext i8 [[TMP2]] to i32
115+
; CHECK-NEXT: [[TMP4:%.*]] = add i32 [[TMP3]], 99
116+
; CHECK-NEXT: ret i32 [[TMP4]]
123117
;
124118
entry:
125119
%z = getelementptr %struct.MYstr, ptr %u, i32 0, i32 1
@@ -139,12 +133,12 @@ define i32 @unions_v2() nounwind {
139133
; TUNIT-SAME: () #[[ATTR2]] {
140134
; TUNIT-NEXT: entry:
141135
; TUNIT-NEXT: [[TMP0:%.*]] = load i8, ptr @mystr, align 8
142-
; TUNIT-NEXT: [[MYSTR_B41:%.*]] = getelementptr i8, ptr @mystr, i64 4
143-
; TUNIT-NEXT: [[TMP1:%.*]] = load i32, ptr [[MYSTR_B41]], align 8
136+
; TUNIT-NEXT: [[MYSTR_B4:%.*]] = getelementptr i8, ptr @mystr, i64 4
137+
; TUNIT-NEXT: [[TMP1:%.*]] = load i32, ptr [[MYSTR_B4]], align 8
144138
; TUNIT-NEXT: call void @vfu1(i8 [[TMP0]], i32 [[TMP1]]) #[[ATTR2]]
145139
; TUNIT-NEXT: [[TMP2:%.*]] = load i8, ptr @mystr, align 8
146-
; TUNIT-NEXT: [[MYSTR_B4:%.*]] = getelementptr i8, ptr @mystr, i64 4
147-
; TUNIT-NEXT: [[TMP3:%.*]] = load i32, ptr [[MYSTR_B4]], align 8
140+
; TUNIT-NEXT: [[MYSTR_B41:%.*]] = getelementptr i8, ptr @mystr, i64 4
141+
; TUNIT-NEXT: [[TMP3:%.*]] = load i32, ptr [[MYSTR_B41]], align 8
148142
; TUNIT-NEXT: [[RESULT:%.*]] = call i32 @vfu2_v2(i8 [[TMP2]], i32 [[TMP3]]) #[[ATTR3]]
149143
; TUNIT-NEXT: ret i32 [[RESULT]]
150144
;

llvm/test/Transforms/Attributor/pointer-info.ll

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ define void @bar(ptr noundef byval(%struct.test.a) align 8 %dev) {
4545
; CHECK-LABEL: define {{[^@]+}}@bar
4646
; CHECK-SAME: (ptr noalias nofree noundef nonnull writeonly byval([[STRUCT_TEST_A:%.*]]) align 8 captures(none) dereferenceable(24) [[DEV:%.*]]) #[[ATTR1:[0-9]+]] {
4747
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_TEST_B:%.*]], ptr [[DEV]], i64 0, i32 1
48-
; CHECK-NEXT: store i32 1, ptr [[TMP1]], align 4
4948
; CHECK-NEXT: ret void
5049
;
5150
%1 = getelementptr inbounds %struct.test.b, ptr %dev, i64 0, i32 1

llvm/test/Transforms/Attributor/readattrs.ll

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,6 @@ define void @byval_not_readonly_2(ptr byval(i8) %written) readonly {
282282
; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
283283
; CHECK-LABEL: define {{[^@]+}}@byval_not_readonly_2
284284
; CHECK-SAME: (ptr noalias nofree noundef nonnull writeonly byval(i8) captures(none) dereferenceable(1) [[WRITTEN:%.*]]) #[[ATTR1]] {
285-
; CHECK-NEXT: store i8 0, ptr [[WRITTEN]], align 1
286285
; CHECK-NEXT: ret void
287286
;
288287
store i8 0, ptr %written
@@ -310,7 +309,6 @@ define void @byval_not_readnone_2(ptr byval(i8) %written) readnone {
310309
; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
311310
; CHECK-LABEL: define {{[^@]+}}@byval_not_readnone_2
312311
; CHECK-SAME: (ptr noalias nofree noundef nonnull writeonly byval(i8) captures(none) dereferenceable(1) [[WRITTEN:%.*]]) #[[ATTR1]] {
313-
; CHECK-NEXT: store i8 0, ptr [[WRITTEN]], align 1
314312
; CHECK-NEXT: ret void
315313
;
316314
store i8 0, ptr %written
@@ -321,7 +319,6 @@ define void @byval_no_fnarg(ptr byval(i8) %written) {
321319
; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
322320
; CHECK-LABEL: define {{[^@]+}}@byval_no_fnarg
323321
; CHECK-SAME: (ptr noalias nofree noundef nonnull writeonly byval(i8) captures(none) dereferenceable(1) [[WRITTEN:%.*]]) #[[ATTR4]] {
324-
; CHECK-NEXT: store i8 0, ptr [[WRITTEN]], align 1
325322
; CHECK-NEXT: ret void
326323
;
327324
store i8 0, ptr %written

llvm/test/Transforms/Attributor/value-simplify-pointer-info.ll

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,32 +1119,19 @@ define void @noalias_arg_simplifiable_1(ptr noalias sret(%struct.S) align 4 %agg
11191119
; TUNIT-SAME: (ptr noalias nofree writeonly sret([[STRUCT_S:%.*]]) align 4 captures(none) dereferenceable_or_null(24) [[AGG_RESULT:%.*]], ptr noalias nofree nonnull byval([[STRUCT_S]]) align 8 captures(none) dereferenceable(24) [[S:%.*]]) #[[ATTR1]] {
11201120
; TUNIT-NEXT: entry:
11211121
; TUNIT-NEXT: [[F1:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S]], i64 0, i32 3
1122-
; TUNIT-NEXT: store float 0x3FF19999A0000000, ptr [[F1]], align 4, !tbaa [[TBAA7]]
11231122
; TUNIT-NEXT: [[F2:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S]], i64 0, i32 4
1124-
; TUNIT-NEXT: store float 0x40019999A0000000, ptr [[F2]], align 8, !tbaa [[TBAA10]]
11251123
; TUNIT-NEXT: [[F3:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S]], i64 0, i32 5
1126-
; TUNIT-NEXT: store float 0x400A666660000000, ptr [[F3]], align 4, !tbaa [[TBAA11]]
11271124
; TUNIT-NEXT: call void @write_arg(ptr noalias nofree noundef nonnull writeonly align 8 captures(none) dereferenceable(24) [[S]], i32 noundef 1) #[[ATTR18]]
11281125
; TUNIT-NEXT: [[I2:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S]], i64 0, i32 1
11291126
; TUNIT-NEXT: call void @write_arg(ptr nofree noundef nonnull writeonly align 4 captures(none) dereferenceable(20) [[I2]], i32 noundef 2) #[[ATTR18]]
11301127
; TUNIT-NEXT: [[I3:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S]], i64 0, i32 2
11311128
; TUNIT-NEXT: call void @write_arg(ptr nofree noundef nonnull writeonly align 8 captures(none) dereferenceable(16) [[I3]], i32 noundef 3) #[[ATTR18]]
1132-
; TUNIT-NEXT: [[F11:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S]], i64 0, i32 3
1133-
; TUNIT-NEXT: [[I:%.*]] = load float, ptr [[F11]], align 4, !tbaa [[TBAA7]]
11341129
; TUNIT-NEXT: [[F12:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[AGG_RESULT]], i64 0, i32 3
1135-
; TUNIT-NEXT: store float [[I]], ptr [[F12]], align 4, !tbaa [[TBAA7]]
1136-
; TUNIT-NEXT: [[F23:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S]], i64 0, i32 4
1137-
; TUNIT-NEXT: [[I4:%.*]] = load float, ptr [[F23]], align 8, !tbaa [[TBAA10]]
1138-
; TUNIT-NEXT: [[MUL:%.*]] = fmul float [[I4]], 2.000000e+00
1130+
; TUNIT-NEXT: store float 0x3FF19999A0000000, ptr [[F12]], align 4, !tbaa [[TBAA7]]
11391131
; TUNIT-NEXT: [[F24:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[AGG_RESULT]], i64 0, i32 4
1140-
; TUNIT-NEXT: store float [[MUL]], ptr [[F24]], align 4, !tbaa [[TBAA10]]
1141-
; TUNIT-NEXT: [[F35:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S]], i64 0, i32 5
1142-
; TUNIT-NEXT: [[I5:%.*]] = load float, ptr [[F35]], align 4, !tbaa [[TBAA11]]
1143-
; TUNIT-NEXT: [[F16:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S]], i64 0, i32 3
1144-
; TUNIT-NEXT: [[I6:%.*]] = load float, ptr [[F16]], align 4, !tbaa [[TBAA7]]
1145-
; TUNIT-NEXT: [[ADD:%.*]] = fadd float [[I5]], [[I6]]
1132+
; TUNIT-NEXT: store float 0x40119999A0000000, ptr [[F24]], align 4, !tbaa [[TBAA10]]
11461133
; TUNIT-NEXT: [[F37:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[AGG_RESULT]], i64 0, i32 5
1147-
; TUNIT-NEXT: store float [[ADD]], ptr [[F37]], align 4, !tbaa [[TBAA11]]
1134+
; TUNIT-NEXT: store float 0x40119999A0000000, ptr [[F37]], align 4, !tbaa [[TBAA11]]
11481135
; TUNIT-NEXT: [[I7:%.*]] = load i32, ptr [[S]], align 8, !tbaa [[TBAA12]]
11491136
; TUNIT-NEXT: store i32 [[I7]], ptr [[AGG_RESULT]], align 4, !tbaa [[TBAA12]]
11501137
; TUNIT-NEXT: [[I210:%.*]] = getelementptr inbounds [[STRUCT_S]], ptr [[S]], i64 0, i32 1

llvm/test/Transforms/Attributor/value-simplify.ll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -583,15 +583,13 @@ define internal void @test_byval(ptr byval(%struct.X) %a) {
583583
; TUNIT-SAME: (ptr [[TMP0:%.*]]) #[[ATTR4]] {
584584
; TUNIT-NEXT: [[A_PRIV:%.*]] = alloca [[STRUCT_X:%.*]], align 8
585585
; TUNIT-NEXT: store ptr [[TMP0]], ptr [[A_PRIV]], align 8
586-
; TUNIT-NEXT: store ptr null, ptr [[A_PRIV]], align 8
587586
; TUNIT-NEXT: ret void
588587
;
589588
; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
590589
; CGSCC-LABEL: define {{[^@]+}}@test_byval
591590
; CGSCC-SAME: (ptr nofree [[TMP0:%.*]]) #[[ATTR5]] {
592591
; CGSCC-NEXT: [[A_PRIV:%.*]] = alloca [[STRUCT_X:%.*]], align 8
593592
; CGSCC-NEXT: store ptr [[TMP0]], ptr [[A_PRIV]], align 8
594-
; CGSCC-NEXT: store ptr null, ptr [[A_PRIV]], align 8
595593
; CGSCC-NEXT: ret void
596594
;
597595
store ptr null, ptr %a

0 commit comments

Comments
 (0)