brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.0 KiB · 249119a Raw
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