[PATCH] Fix a mergefunc crash caused by bitcasting intrinsics
Björn Steinbrink
bsteinbr at gmail.com
Tue Apr 22 02:07:39 PDT 2014
Generally skip the bitcast when dealing with function constants
Bitcasting function constants is rather pointless here, as bitcasting one will
not result in the other. So we can return early whenever one of the constants
is a function, instead of having a special case for intrinsics.
http://reviews.llvm.org/D3437
CHANGE SINCE LAST DIFF
http://reviews.llvm.org/D3437?vs=8691&id=8715#toc
Files:
lib/Transforms/IPO/MergeFunctions.cpp
test/Transforms/MergeFunc/intrinsics.ll
Index: lib/Transforms/IPO/MergeFunctions.cpp
===================================================================
--- lib/Transforms/IPO/MergeFunctions.cpp
+++ lib/Transforms/IPO/MergeFunctions.cpp
@@ -465,6 +465,8 @@
if (C1->isNullValue() && C2->isNullValue() &&
isEquivalentType(C1->getType(), C2->getType()))
return true;
+ if (isa<Function>(V1) || isa<Function>(V2))
+ return false;
// Try bitcasting C2 to C1's type. If the bitcast is legal and returns C1
// then they must have equal bit patterns.
return C1->getType()->canLosslesslyBitCastTo(C2->getType()) &&
Index: test/Transforms/MergeFunc/intrinsics.ll
===================================================================
--- /dev/null
+++ test/Transforms/MergeFunc/intrinsics.ll
@@ -0,0 +1,22 @@
+; RUN: opt -mergefunc -disable-output < %s
+; This used to crash because mergefunc created a bitcast of an intrinsic.
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+declare i64 @llvm.bswap.i64(i64) unnamed_addr nounwind readnone
+declare i8* @breaker(i8*) unnamed_addr
+
+; Function Attrs: inlinehint uwtable
+define void @bswap_caller(i64) unnamed_addr {
+entry-block:
+ call i64 @llvm.bswap.i64(i64 %0)
+ ret void
+}
+
+; Function Attrs: inlinehint uwtable
+define internal void @collider(i8*) unnamed_addr {
+entry-block:
+ call i8* @breaker(i8* %0)
+ ret void
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D3437.2.patch
Type: text/x-patch
Size: 1543 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140422/83723f15/attachment.bin>
More information about the llvm-commits
mailing list