174 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals2; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT3; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC4 5; Don't constant-propagate byval pointers, since they are not pointers!6; PR50387%struct.MYstr = type { i8, i32 }8@mystr = internal global %struct.MYstr zeroinitializer ; <ptr> [#uses=3]9 10declare void @use(i8)11;.12; CHECK: @mystr = internal global %struct.MYstr zeroinitializer13;.14define internal void @vfu1(ptr byval(%struct.MYstr) align 4 %u) nounwind {15; CHECK: Function Attrs: nounwind memory(readwrite, argmem: none)16; CHECK-LABEL: define {{[^@]+}}@vfu117; CHECK-SAME: (i8 [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR0:[0-9]+]] {18; CHECK-NEXT: entry:19; CHECK-NEXT: [[U_PRIV:%.*]] = alloca [[STRUCT_MYSTR:%.*]], align 820; CHECK-NEXT: store i8 [[TMP0]], ptr [[U_PRIV]], align 121; CHECK-NEXT: [[U_PRIV_B4:%.*]] = getelementptr i8, ptr [[U_PRIV]], i64 422; CHECK-NEXT: store i32 [[TMP1]], ptr [[U_PRIV_B4]], align 423; CHECK-NEXT: [[TMP2:%.*]] = getelementptr [[STRUCT_MYSTR]], ptr [[U_PRIV]], i32 0, i32 124; CHECK-NEXT: store i32 99, ptr [[TMP2]], align 425; CHECK-NEXT: store i8 97, ptr [[U_PRIV]], align 826; CHECK-NEXT: [[L:%.*]] = load i8, ptr [[U_PRIV]], align 827; CHECK-NEXT: call void @use(i8 [[L]])28; CHECK-NEXT: br label [[RETURN:%.*]]29; CHECK: return:30; CHECK-NEXT: ret void31;32entry:33 %0 = getelementptr %struct.MYstr, ptr %u, i32 0, i32 1 ; <ptr> [#uses=1]34 store i32 99, ptr %0, align 435 %1 = getelementptr %struct.MYstr, ptr %u, i32 0, i32 0 ; <ptr> [#uses=1]36 store i8 97, ptr %1, align 437 %l = load i8, ptr %138 call void @use(i8 %l)39 br label %return40 41return: ; preds = %entry42 ret void43}44 45define internal i32 @vfu2(ptr byval(%struct.MYstr) align 4 %u) nounwind readonly {46; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)47; CHECK-LABEL: define {{[^@]+}}@vfu248; CHECK-SAME: (i8 [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR1:[0-9]+]] {49; CHECK-NEXT: entry:50; CHECK-NEXT: [[U_PRIV:%.*]] = alloca [[STRUCT_MYSTR:%.*]], align 851; CHECK-NEXT: store i8 [[TMP0]], ptr [[U_PRIV]], align 152; CHECK-NEXT: [[U_PRIV_B4:%.*]] = getelementptr i8, ptr [[U_PRIV]], i64 453; CHECK-NEXT: store i32 [[TMP1]], ptr [[U_PRIV_B4]], align 454; CHECK-NEXT: [[TMP2:%.*]] = getelementptr [[STRUCT_MYSTR]], ptr [[U_PRIV]], i32 0, i32 155; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 456; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[U_PRIV]], align 857; CHECK-NEXT: [[TMP5:%.*]] = zext i8 [[TMP4]] to i3258; CHECK-NEXT: [[TMP6:%.*]] = add i32 [[TMP5]], [[TMP3]]59; CHECK-NEXT: ret i32 [[TMP6]]60;61entry:62 %0 = getelementptr %struct.MYstr, ptr %u, i32 0, i32 1 ; <ptr> [#uses=1]63 %1 = load i32, ptr %064 %2 = getelementptr %struct.MYstr, ptr %u, i32 0, i32 0 ; <ptr> [#uses=1]65 %3 = load i8, ptr %266 %4 = zext i8 %3 to i3267 %5 = add i32 %4, %168 ret i32 %569}70 71define i32 @unions() nounwind {72; TUNIT: Function Attrs: nounwind73; TUNIT-LABEL: define {{[^@]+}}@unions74; TUNIT-SAME: () #[[ATTR2:[0-9]+]] {75; TUNIT-NEXT: entry:76; TUNIT-NEXT: [[TMP0:%.*]] = load i8, ptr @mystr, align 877; TUNIT-NEXT: [[MYSTR_B41:%.*]] = getelementptr i8, ptr @mystr, i64 478; TUNIT-NEXT: [[TMP1:%.*]] = load i32, ptr [[MYSTR_B41]], align 879; TUNIT-NEXT: call void @vfu1(i8 [[TMP0]], i32 [[TMP1]]) #[[ATTR2]]80; TUNIT-NEXT: [[TMP2:%.*]] = load i8, ptr @mystr, align 881; TUNIT-NEXT: [[MYSTR_B4:%.*]] = getelementptr i8, ptr @mystr, i64 482; TUNIT-NEXT: [[TMP3:%.*]] = load i32, ptr [[MYSTR_B4]], align 883; TUNIT-NEXT: [[RESULT:%.*]] = call i32 @vfu2(i8 [[TMP2]], i32 [[TMP3]]) #[[ATTR3:[0-9]+]]84; TUNIT-NEXT: ret i32 [[RESULT]]85;86; CGSCC: Function Attrs: nounwind87; CGSCC-LABEL: define {{[^@]+}}@unions88; CGSCC-SAME: () #[[ATTR2:[0-9]+]] {89; CGSCC-NEXT: entry:90; CGSCC-NEXT: [[TMP0:%.*]] = load i8, ptr @mystr, align 891; CGSCC-NEXT: [[MYSTR_B4:%.*]] = getelementptr i8, ptr @mystr, i64 492; CGSCC-NEXT: [[TMP1:%.*]] = load i32, ptr [[MYSTR_B4]], align 893; CGSCC-NEXT: call void @vfu1(i8 [[TMP0]], i32 [[TMP1]]) #[[ATTR2]]94; CGSCC-NEXT: [[TMP2:%.*]] = load i8, ptr @mystr, align 895; CGSCC-NEXT: [[MYSTR_B41:%.*]] = getelementptr i8, ptr @mystr, i64 496; CGSCC-NEXT: [[TMP3:%.*]] = load i32, ptr [[MYSTR_B41]], align 897; CGSCC-NEXT: [[RESULT:%.*]] = call i32 @vfu2(i8 [[TMP2]], i32 [[TMP3]]) #[[ATTR2]]98; CGSCC-NEXT: ret i32 [[RESULT]]99;100entry:101 call void @vfu1(ptr byval(%struct.MYstr) align 4 @mystr) nounwind102 %result = call i32 @vfu2(ptr byval(%struct.MYstr) align 4 @mystr) nounwind103 ret i32 %result104}105 106define internal i32 @vfu2_v2(ptr byval(%struct.MYstr) align 4 %u) nounwind readonly {107; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)108; CHECK-LABEL: define {{[^@]+}}@vfu2_v2109; CHECK-SAME: (i8 [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR1]] {110; CHECK-NEXT: entry:111; CHECK-NEXT: [[U_PRIV:%.*]] = alloca [[STRUCT_MYSTR:%.*]], align 8112; CHECK-NEXT: store i8 [[TMP0]], ptr [[U_PRIV]], align 1113; CHECK-NEXT: [[U_PRIV_B4:%.*]] = getelementptr i8, ptr [[U_PRIV]], i64 4114; CHECK-NEXT: store i32 [[TMP1]], ptr [[U_PRIV_B4]], align 4115; CHECK-NEXT: [[Z:%.*]] = getelementptr [[STRUCT_MYSTR]], ptr [[U_PRIV]], i32 0, i32 1116; CHECK-NEXT: store i32 99, ptr [[Z]], align 4117; CHECK-NEXT: [[TMP2:%.*]] = getelementptr [[STRUCT_MYSTR]], ptr [[U_PRIV]], i32 0, i32 1118; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4119; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[U_PRIV]], align 8120; CHECK-NEXT: [[TMP5:%.*]] = zext i8 [[TMP4]] to i32121; CHECK-NEXT: [[TMP6:%.*]] = add i32 [[TMP5]], [[TMP3]]122; CHECK-NEXT: ret i32 [[TMP6]]123;124entry:125 %z = getelementptr %struct.MYstr, ptr %u, i32 0, i32 1126 store i32 99, ptr %z, align 4127 %0 = getelementptr %struct.MYstr, ptr %u, i32 0, i32 1 ; <ptr> [#uses=1]128 %1 = load i32, ptr %0129 %2 = getelementptr %struct.MYstr, ptr %u, i32 0, i32 0 ; <ptr> [#uses=1]130 %3 = load i8, ptr %2131 %4 = zext i8 %3 to i32132 %5 = add i32 %4, %1133 ret i32 %5134}135 136define i32 @unions_v2() nounwind {137; TUNIT: Function Attrs: nounwind138; TUNIT-LABEL: define {{[^@]+}}@unions_v2139; TUNIT-SAME: () #[[ATTR2]] {140; TUNIT-NEXT: entry:141; TUNIT-NEXT: [[TMP0:%.*]] = load i8, ptr @mystr, align 8142; TUNIT-NEXT: [[MYSTR_B41:%.*]] = getelementptr i8, ptr @mystr, i64 4143; TUNIT-NEXT: [[TMP1:%.*]] = load i32, ptr [[MYSTR_B41]], align 8144; TUNIT-NEXT: call void @vfu1(i8 [[TMP0]], i32 [[TMP1]]) #[[ATTR2]]145; TUNIT-NEXT: [[TMP2:%.*]] = load i8, ptr @mystr, align 8146; TUNIT-NEXT: [[MYSTR_B4:%.*]] = getelementptr i8, ptr @mystr, i64 4147; TUNIT-NEXT: [[TMP3:%.*]] = load i32, ptr [[MYSTR_B4]], align 8148; TUNIT-NEXT: [[RESULT:%.*]] = call i32 @vfu2_v2(i8 [[TMP2]], i32 [[TMP3]]) #[[ATTR3]]149; TUNIT-NEXT: ret i32 [[RESULT]]150;151; CGSCC: Function Attrs: nounwind152; CGSCC-LABEL: define {{[^@]+}}@unions_v2153; CGSCC-SAME: () #[[ATTR2]] {154; CGSCC-NEXT: entry:155; CGSCC-NEXT: call void @vfu1(i8 noundef 0, i32 noundef 0) #[[ATTR2]]156; CGSCC-NEXT: [[RESULT:%.*]] = call i32 @vfu2_v2(i8 noundef 0, i32 noundef 0) #[[ATTR2]]157; CGSCC-NEXT: ret i32 [[RESULT]]158;159entry:160 call void @vfu1(ptr byval(%struct.MYstr) align 4 @mystr) nounwind161 %result = call i32 @vfu2_v2(ptr byval(%struct.MYstr) align 4 @mystr) nounwind162 ret i32 %result163}164;.165; TUNIT: attributes #[[ATTR0]] = { nounwind memory(readwrite, argmem: none) }166; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }167; TUNIT: attributes #[[ATTR2]] = { nounwind }168; TUNIT: attributes #[[ATTR3]] = { nounwind memory(read) }169;.170; CGSCC: attributes #[[ATTR0]] = { nounwind memory(readwrite, argmem: none) }171; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }172; CGSCC: attributes #[[ATTR2]] = { nounwind }173;.174