summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/IR/Globals.cpp3
-rw-r--r--lib/IR/Verifier.cpp4
-rw-r--r--test/Assembler/addrspacecast-alias.ll6
3 files changed, 11 insertions, 2 deletions
diff --git a/lib/IR/Globals.cpp b/lib/IR/Globals.cpp
index da3b02a0fa..cc42351f10 100644
--- a/lib/IR/Globals.cpp
+++ b/lib/IR/Globals.cpp
@@ -237,7 +237,8 @@ GlobalValue *GlobalAlias::getAliasedGlobal() {
return GV;
ConstantExpr *CE = cast<ConstantExpr>(C);
- assert((CE->getOpcode() == Instruction::BitCast ||
+ assert((CE->getOpcode() == Instruction::BitCast ||
+ CE->getOpcode() == Instruction::AddrSpaceCast ||
CE->getOpcode() == Instruction::GetElementPtr) &&
"Unsupported aliasee");
diff --git a/lib/IR/Verifier.cpp b/lib/IR/Verifier.cpp
index 35b786ecf2..44c66c9062 100644
--- a/lib/IR/Verifier.cpp
+++ b/lib/IR/Verifier.cpp
@@ -550,9 +550,11 @@ void Verifier::visitGlobalAlias(GlobalAlias &GA) {
ConstantExpr *CE = dyn_cast<ConstantExpr>(Aliasee);
Assert1(CE &&
(CE->getOpcode() == Instruction::BitCast ||
+ CE->getOpcode() == Instruction::AddrSpaceCast ||
CE->getOpcode() == Instruction::GetElementPtr) &&
isa<GlobalValue>(CE->getOperand(0)),
- "Aliasee should be either GlobalValue or bitcast of GlobalValue",
+ "Aliasee should be either GlobalValue, bitcast or "
+ "addrspacecast of GlobalValue",
&GA);
if (CE->getOpcode() == Instruction::BitCast) {
diff --git a/test/Assembler/addrspacecast-alias.ll b/test/Assembler/addrspacecast-alias.ll
new file mode 100644
index 0000000000..6623a25d18
--- /dev/null
+++ b/test/Assembler/addrspacecast-alias.ll
@@ -0,0 +1,6 @@
+; RUN: llvm-as -disable-output %s
+
+; Test that global aliases are allowed to be constant addrspacecast
+
+@i = internal addrspace(1) global i8 42
+@ia = alias internal i8 addrspace(2)* addrspacecast (i8 addrspace(1)* @i to i8 addrspace(2)*)