Skip to content
This repository has been archived by the owner on Apr 23, 2020. It is now read-only.

Commit

Permalink
Merging r331990:
Browse files Browse the repository at this point in the history
------------------------------------------------------------------------
r331990 | whitequark | 2018-05-10 08:05:47 -0700 (Thu, 10 May 2018) | 15 lines

[PR37339] Fix assertion in FunctionComparator::cmpInlineAsm

Fixes bug https://bugs.llvm.org/show_bug.cgi?id=37339.

InlineAsm is only uniqued if the FunctionTypes are exactly the
same, while cmpTypes() for example considers all pointer types
in the default address space to be the same. For this reason
the end of cmpInlineAsm() can be reached.

This patch replaces the unreachable assertion with a check that
the function types are not identical.

Differential Revision: https://reviews.llvm.org/D46495

Reviewers: jfb
------------------------------------------------------------------------

git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_60@332678 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
tstellar committed May 17, 2018
1 parent be07815 commit 63bcfe3
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/Transforms/Utils/FunctionComparator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -710,7 +710,7 @@ int FunctionComparator::cmpInlineAsm(const InlineAsm *L,
return Res;
if (int Res = cmpNumbers(L->getDialect(), R->getDialect()))
return Res;
llvm_unreachable("InlineAsm blocks were not uniqued.");
assert(L->getFunctionType() != R->getFunctionType());
return 0;
}

Expand Down
53 changes: 53 additions & 0 deletions test/Transforms/MergeFunc/inline-asm.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
; RUN: opt -mergefunc -S < %s | FileCheck %s

; CHECK-LABEL: @int_ptr_arg_different
; CHECK-NEXT: call void asm

; CHECK-LABEL: @int_ptr_arg_same
; CHECK-NEXT: %2 = bitcast i32* %0 to float*
; CHECK-NEXT: tail call void @float_ptr_arg_same(float* %2)

; CHECK-LABEL: @int_ptr_null
; CHECK-NEXT: tail call void @float_ptr_null()

; Used to satisfy minimum size limit
declare void @stuff()

; Can be merged
define void @float_ptr_null() {
call void asm "nop", "r"(float* null)
call void @stuff()
ret void
}

define void @int_ptr_null() {
call void asm "nop", "r"(i32* null)
call void @stuff()
ret void
}

; Can be merged (uses same argument differing by pointer type)
define void @float_ptr_arg_same(float*) {
call void asm "nop", "r"(float* %0)
call void @stuff()
ret void
}

define void @int_ptr_arg_same(i32*) {
call void asm "nop", "r"(i32* %0)
call void @stuff()
ret void
}

; Can not be merged (uses different arguments)
define void @float_ptr_arg_different(float*, float*) {
call void asm "nop", "r"(float* %0)
call void @stuff()
ret void
}

define void @int_ptr_arg_different(i32*, i32*) {
call void asm "nop", "r"(i32* %1)
call void @stuff()
ret void
}

0 comments on commit 63bcfe3

Please sign in to comment.