Revision f92a55a06a1018ec83cc1bda24cf1d0d34af613e authored by Alex Arslan on 07 August 2018, 16:29:47 UTC, committed by GitHub on 07 August 2018, 16:29:47 UTC
1 parent b815ac5
llvm-loadcse-addrspace_4.0.patch
From 01ae2614aa184fcf88b0880f5944a23da6f215db Mon Sep 17 00:00:00 2001
From: Yichao Yu <yyc1992@gmail.com>
Date: Sun, 18 Jun 2017 16:45:38 -0400
Subject: [PATCH] Disable LoadCSE and Store forwarding between different
address space or between non-integral pointer and integers.
---
lib/Analysis/Loads.cpp | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/lib/Analysis/Loads.cpp b/lib/Analysis/Loads.cpp
index e46541e6538..971ce37a4a5 100644
--- a/lib/Analysis/Loads.cpp
+++ b/lib/Analysis/Loads.cpp
@@ -362,6 +362,21 @@ Value *llvm::FindAvailableLoadedValue(LoadInst *Load,
if (LI->isAtomic() < Load->isAtomic())
return nullptr;
+ if (Load->getType()->isPointerTy()) {
+ PointerType *Ty1 = cast<PointerType>(Load->getType());
+ if (PointerType *Ty2 = dyn_cast<PointerType>(LI->getType())) {
+ if (Ty1->getAddressSpace() != Ty2->getAddressSpace()) {
+ return nullptr;
+ }
+ }
+ else if (DL.isNonIntegralPointerType(Ty1)) {
+ return nullptr;
+ }
+ }
+ else if (DL.isNonIntegralPointerType(LI->getType())) {
+ return nullptr;
+ }
+
if (IsLoadCSE)
*IsLoadCSE = true;
return LI;
@@ -381,6 +396,21 @@ Value *llvm::FindAvailableLoadedValue(LoadInst *Load,
if (SI->isAtomic() < Load->isAtomic())
return nullptr;
+ if (Load->getType()->isPointerTy()) {
+ PointerType *Ty1 = cast<PointerType>(Load->getType());
+ if (PointerType *Ty2 = dyn_cast<PointerType>(SI->getValueOperand()->getType())) {
+ if (Ty1->getAddressSpace() != Ty2->getAddressSpace()) {
+ return nullptr;
+ }
+ }
+ else if (DL.isNonIntegralPointerType(Ty1)) {
+ return nullptr;
+ }
+ }
+ else if (DL.isNonIntegralPointerType(SI->getValueOperand()->getType())) {
+ return nullptr;
+ }
+
if (IsLoadCSE)
*IsLoadCSE = false;
return SI->getOperand(0);
--
2.13.1
Computing file changes ...