Author: tstellar
Date: Thu May 17 16:32:54 2018
New Revision: 332678

URL: http://llvm.org/viewvc/llvm-project?rev=332678&view=rev
Log:
Merging r331990:

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

Added:
    llvm/branches/release_60/test/Transforms/MergeFunc/inline-asm.ll
Modified:
    llvm/branches/release_60/lib/Transforms/Utils/FunctionComparator.cpp

Modified: llvm/branches/release_60/lib/Transforms/Utils/FunctionComparator.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/branches/release_60/lib/Transforms/Utils/FunctionComparator.cpp?rev=332678&r1=332677&r2=332678&view=diff
==============================================================================
--- llvm/branches/release_60/lib/Transforms/Utils/FunctionComparator.cpp 
(original)
+++ llvm/branches/release_60/lib/Transforms/Utils/FunctionComparator.cpp Thu 
May 17 16:32:54 2018
@@ -710,7 +710,7 @@ int FunctionComparator::cmpInlineAsm(con
     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;
 }
 

Added: llvm/branches/release_60/test/Transforms/MergeFunc/inline-asm.ll
URL: 
http://llvm.org/viewvc/llvm-project/llvm/branches/release_60/test/Transforms/MergeFunc/inline-asm.ll?rev=332678&view=auto
==============================================================================
--- llvm/branches/release_60/test/Transforms/MergeFunc/inline-asm.ll (added)
+++ llvm/branches/release_60/test/Transforms/MergeFunc/inline-asm.ll Thu May 17 
16:32:54 2018
@@ -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
+}


_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to