Created
May 22, 2014 00:03
-
-
Save eliben/036a046bbcb8ab761115 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lib/CodeGen/CodeGenPrepare.cpp b/lib/CodeGen/CodeGenPrepare.cpp | |
index dc5f67b..6aa60c6 100644 | |
--- a/lib/CodeGen/CodeGenPrepare.cpp | |
+++ b/lib/CodeGen/CodeGenPrepare.cpp | |
@@ -1640,6 +1640,7 @@ bool AddressingModeMatcher::MatchScaledValue(Value *ScaleReg, int64_t Scale, | |
static bool MightBeFoldableInst(Instruction *I) { | |
switch (I->getOpcode()) { | |
case Instruction::BitCast: | |
+ case Instruction::AddrSpaceCast: | |
// Don't touch identity bitcasts. | |
if (I->getType() == I->getOperand(0)->getType()) | |
return false; | |
@@ -1994,6 +1995,7 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode, | |
return MatchAddr(AddrInst->getOperand(0), Depth); | |
return false; | |
case Instruction::BitCast: | |
+ case Instruction::AddrSpaceCast: | |
// BitCast is always a noop, and we can handle it as long as it is | |
// int->int or pointer->pointer (we don't want int<->fp or something). | |
if ((AddrInst->getOperand(0)->getType()->isPointerTy() || | |
diff --git a/test/Transforms/CodeGenPrepare/X86/sink-addrspacecast.ll b/test/Transforms/CodeGenPrepare/X86/sink-addrspacecast.ll | |
new file mode 100644 | |
index 0000000..a985c36 | |
--- /dev/null | |
+++ b/test/Transforms/CodeGenPrepare/X86/sink-addrspacecast.ll | |
@@ -0,0 +1,37 @@ | |
+; RUN: opt -S -codegenprepare < %s | FileCheck %s | |
+ | |
+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" | |
+target triple = "x86_64-unknown-linux-gnu" | |
+ | |
+; CHECK-LABEL: @load_cast_gep | |
+; CHECK: add i64 %sunkaddr, 40 | |
+define void @load_cast_gep(i1 %cond, i64* %base) { | |
+entry: | |
+ %addr = getelementptr inbounds i64* %base, i64 5 | |
+ %casted = addrspacecast i64* %addr to i32 addrspace(1)* | |
+ br i1 %cond, label %if.then, label %fallthrough | |
+ | |
+if.then: | |
+ %v = load i32 addrspace(1)* %casted, align 4 | |
+ br label %fallthrough | |
+ | |
+fallthrough: | |
+ ret void | |
+} | |
+ | |
+; CHECK-LABEL: @store_gep_cast | |
+; CHECK: add i64 %sunkaddr, 20 | |
+define void @store_gep_cast(i1 %cond, i64* %base) { | |
+entry: | |
+ %casted = addrspacecast i64* %base to i32 addrspace(1)* | |
+ %addr = getelementptr inbounds i32 addrspace(1)* %casted, i64 5 | |
+ br i1 %cond, label %if.then, label %fallthrough | |
+ | |
+if.then: | |
+ store i32 0, i32 addrspace(1)* %addr, align 4 | |
+ br label %fallthrough | |
+ | |
+fallthrough: | |
+ ret void | |
+} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment