Merge r168147 from trunk:

Constant::IsThreadDependent(): Use dyn_cast<Constant> instead of cast

  It turns out that the operands of a Constant are not always themselves
  Constant. For example, one of the operands of BlockAddress is
  BasicBlock, which is not a Constant.

  This should fix the dragonegg-x86_64-linux-gcc-4.6-test build which
  broke in r168037.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_32@168193 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Hans Wennborg committed 2012-11-16 20:21:42 +00:00
1 parent 21863332ca
commit 1f7de172b4
2 files changed
+23 -1

No files matched your search

+3 -1
View File
@@ -261,7 +261,9 @@ bool Constant::isThreadDependent() const {
}
for (unsigned I = 0, E = C->getNumOperands(); I != E; ++I) {
const Constant *D = cast<Constant>(C->getOperand(I));
const Constant *D = dyn_cast<Constant>(C->getOperand(I));
if (!D)
continue;
if (Visited.insert(D))
WorkList.push_back(D);
}
+20
View File
@@ -0,0 +1,20 @@
; RUN: opt < %s -globalopt -S | FileCheck %s
@x = internal global i8* zeroinitializer
define void @f() {
; CHECK: @f
; Check that we don't hit an assert in Constant::IsThreadDependent()
; when storing this blockaddress into a global.
store i8* blockaddress(@g, %here), i8** @x, align 8
ret void
}
define void @g() {
; CHECK: @g
here:
ret void
}