Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Fix assertion in FunctionComparator::cmpInlineAsm #111

Merged
merged 1 commit into from
May 10, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
}