1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +01:00

[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.
This commit is contained in:
Tim Northover 2020-11-09 09:19:11 +00:00
parent 56b649d72d
commit 5d0b348cd7
2 changed files with 29 additions and 3 deletions

View File

@ -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;

View File

@ -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
}