[llvm] f7fe7ea - [MergeFunctions] fix function attribute comparison in FunctionComparator
Tim Northover via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 9 01:46:17 PST 2020
Author: Tim Northover
Date: 2020-11-09T09:19:11Z
New Revision: f7fe7ea24d368f45deee1aed5e4c582ac69edd0b
URL: https://github.com/llvm/llvm-project/commit/f7fe7ea24d368f45deee1aed5e4c582ac69edd0b
DIFF: https://github.com/llvm/llvm-project/commit/f7fe7ea24d368f45deee1aed5e4c582ac69edd0b.diff
LOG: [MergeFunctions] fix function attribute comparison in FunctionComparator
The comparison of AttributeSets stopped after seeing a matching type attribute.
Subsequent mismatching attributes were not detected causing a crash.
Added:
llvm/test/Transforms/MergeFunc/mismatching-attr-crash.ll
Modified:
llvm/lib/Transforms/Utils/FunctionComparator.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Utils/FunctionComparator.cpp b/llvm/lib/Transforms/Utils/FunctionComparator.cpp
index dfab9369c7b7..f25c4e5d6e99 100644
--- a/llvm/lib/Transforms/Utils/FunctionComparator.cpp
+++ b/llvm/lib/Transforms/Utils/FunctionComparator.cpp
@@ -124,12 +124,17 @@ int FunctionComparator::cmpAttrs(const AttributeList L,
Type *TyL = LA.getValueAsType();
Type *TyR = RA.getValueAsType();
- if (TyL && TyR)
- return cmpTypes(TyL, TyR);
+ if (TyL && TyR) {
+ if (int Res = cmpTypes(TyL, TyR))
+ return Res;
+ continue;
+ }
// Two pointers, at least one null, so the comparison result is
// independent of the value of a real pointer.
- return cmpNumbers((uint64_t)TyL, (uint64_t)TyR);
+ if (int Res = cmpNumbers((uint64_t)TyL, (uint64_t)TyR))
+ return Res;
+ continue;
}
if (LA < RA)
return -1;
diff --git a/llvm/test/Transforms/MergeFunc/mismatching-attr-crash.ll b/llvm/test/Transforms/MergeFunc/mismatching-attr-crash.ll
new file mode 100644
index 000000000000..e3f81c5776fc
--- /dev/null
+++ b/llvm/test/Transforms/MergeFunc/mismatching-attr-crash.ll
@@ -0,0 +1,21 @@
+; RUN: opt -S -mergefunc %s | FileCheck %s
+
+; CHECK-LABEL: define void @foo
+; CHECK: call void %bc
+define void @foo(i8* byval %a0, i8* swiftself %a4) {
+entry:
+ %bc = bitcast i8* %a0 to void (i8*, i8*)*
+ call void %bc(i8* byval %a0, i8* swiftself %a4)
+ ret void
+}
+
+; CHECK-LABEL: define void @bar
+; CHECK: call void %bc
+define void @bar(i8* byval(i8) %a0, i8** swifterror %a4) {
+entry:
+ %bc = bitcast i8* %a0 to void (i8*, i8**)*
+ call void %bc(i8* byval(i8) %a0, i8** swifterror %a4)
+ ret void
+}
+
+
More information about the llvm-commits
mailing list