[polly] 19db33c - [Polly] Remove support for code generated by gfortran+DragonEgg.

Michael Kruse via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 14 12:13:10 PDT 2021


Author: Michael Kruse
Date: 2021-10-14T14:12:06-05:00
New Revision: 19db33c06e7e7b5991f8f4b22d3bd7651b1f854d

URL: https://github.com/llvm/llvm-project/commit/19db33c06e7e7b5991f8f4b22d3bd7651b1f854d
DIFF: https://github.com/llvm/llvm-project/commit/19db33c06e7e7b5991f8f4b22d3bd7651b1f854d.diff

LOG: [Polly] Remove support for code generated by gfortran+DragonEgg.

DragonEgg is not maintained anymore, hence there is no need for this
functionality.

Fixes llvm.org/PR52173

Added: 
    

Modified: 
    polly/docs/ReleaseNotes.rst
    polly/include/polly/CodeGen/IslNodeBuilder.h
    polly/include/polly/LinkAllPasses.h
    polly/include/polly/ScopBuilder.h
    polly/include/polly/ScopInfo.h
    polly/lib/Analysis/ScopBuilder.cpp
    polly/lib/Analysis/ScopInfo.cpp
    polly/lib/CMakeLists.txt
    polly/lib/CodeGen/IslNodeBuilder.cpp
    polly/lib/Support/RegisterPasses.cpp
    polly/lib/Transform/Canonicalization.cpp

Removed: 
    polly/include/polly/RewriteByReferenceParameters.h
    polly/lib/Transform/RewriteByReferenceParameters.cpp
    polly/test/CodeGen/fortran_array_runtime_size_generation.ll
    polly/test/GPGPU/check-unused-fortran-array-size-param-offloaded-to-kernel.ll
    polly/test/RewriteByReferenceParameters/fortran_io.ll
    polly/test/ScopInfo/fortran_array_global_malloc_nonvectored.ll
    polly/test/ScopInfo/fortran_array_global_nonmalloc_nonvectored.ll
    polly/test/ScopInfo/fortran_array_param_nonmalloc_nonvectored.ll
    polly/test/ScopInfo/fortran_array_param_nonmalloc_nonvectored_read_and_write.ll


################################################################################
diff  --git a/polly/docs/ReleaseNotes.rst b/polly/docs/ReleaseNotes.rst
index 15b108c51594f..5c3d37b80e272 100644
--- a/polly/docs/ReleaseNotes.rst
+++ b/polly/docs/ReleaseNotes.rst
@@ -21,3 +21,7 @@ In Polly 14 the following important changes have been incorporated.
   This will agressively try to fuse any loop regardless of
   profitability. The is what users might have expected what
   -polly-opt-fusion=max would do.
+
+- Support for gfortran-generated code has been removed. This includes
+  Fortran Array Descriptors (-polly-detect-fortran-arrays) and the
+  -polly-rewrite-byref-params pass.

diff  --git a/polly/include/polly/CodeGen/IslNodeBuilder.h b/polly/include/polly/CodeGen/IslNodeBuilder.h
index 450d63c286e90..2dc7f019e84cf 100644
--- a/polly/include/polly/CodeGen/IslNodeBuilder.h
+++ b/polly/include/polly/CodeGen/IslNodeBuilder.h
@@ -78,13 +78,6 @@ class IslNodeBuilder {
 
   void addParameters(__isl_take isl_set *Context);
 
-  /// Create Values which hold the sizes of the outermost dimension of all
-  /// Fortran arrays in the current scop.
-  ///
-  /// @returns False, if a problem occurred and a Fortran array was not
-  /// materialized. True otherwise.
-  bool materializeFortranArrayOutermostDimension();
-
   /// Generate code that evaluates @p Condition at run-time.
   ///
   /// This function is typically called to generate the LLVM-IR for the

diff  --git a/polly/include/polly/LinkAllPasses.h b/polly/include/polly/LinkAllPasses.h
index ccda4ef650f21..4f57e60d7ca0b 100644
--- a/polly/include/polly/LinkAllPasses.h
+++ b/polly/include/polly/LinkAllPasses.h
@@ -43,7 +43,6 @@ llvm::Pass *createPolyhedralInfoPass();
 llvm::Pass *createScopDetectionWrapperPassPass();
 llvm::Pass *createScopInfoRegionPassPass();
 llvm::Pass *createScopInfoWrapperPassPass();
-llvm::Pass *createRewriteByrefParamsWrapperPass();
 llvm::Pass *createIslAstInfoWrapperPassPass();
 llvm::Pass *createCodeGenerationPass();
 #ifdef GPU_CODEGEN
@@ -88,7 +87,6 @@ struct PollyForcePassLinking {
     polly::createScopInfoRegionPassPass();
     polly::createPollyCanonicalizePass();
     polly::createPolyhedralInfoPass();
-    polly::createRewriteByrefParamsWrapperPass();
     polly::createIslAstInfoWrapperPassPass();
     polly::createCodeGenerationPass();
 #ifdef GPU_CODEGEN
@@ -117,7 +115,6 @@ void initializeJSONExporterPass(llvm::PassRegistry &);
 void initializeJSONImporterPass(llvm::PassRegistry &);
 void initializeIslAstInfoWrapperPassPass(llvm::PassRegistry &);
 void initializeCodeGenerationPass(llvm::PassRegistry &);
-void initializeRewriteByrefParamsWrapperPassPass(llvm::PassRegistry &);
 #ifdef GPU_CODEGEN
 void initializePPCGCodeGenerationPass(llvm::PassRegistry &);
 void initializeManagedMemoryRewritePassPass(llvm::PassRegistry &);

diff  --git a/polly/include/polly/RewriteByReferenceParameters.h b/polly/include/polly/RewriteByReferenceParameters.h
deleted file mode 100644
index 10e5e20787b87..0000000000000
--- a/polly/include/polly/RewriteByReferenceParameters.h
+++ /dev/null
@@ -1,38 +0,0 @@
-//===- RewriteByReferenceParameters.h -------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef POLLY_REWRITEBYREFERENCEPARAMETERS_H
-#define POLLY_REWRITEBYREFERENCEPARAMETERS_H
-
-#include "polly/ScopPass.h"
-
-namespace llvm {
-class PassRegistry;
-class Pass;
-class raw_ostream;
-} // namespace llvm
-
-namespace polly {
-llvm::Pass *createRewriteByrefParamsWrapperPass();
-
-struct RewriteByrefParamsPass : llvm::PassInfoMixin<RewriteByrefParamsPass> {
-  RewriteByrefParamsPass() {}
-
-  llvm::PreservedAnalyses run(llvm::Function &F,
-                              llvm::FunctionAnalysisManager &FAM);
-};
-
-} // namespace polly
-
-namespace llvm {
-void initializeRewriteByrefParamsWrapperPassPass(llvm::PassRegistry &);
-} // namespace llvm
-
-#endif /* POLLY_REWRITEBYREFERENCEPARAMETERS_H */

diff  --git a/polly/include/polly/ScopBuilder.h b/polly/include/polly/ScopBuilder.h
index 7c3a944dd5c97..dbfc3dcff122a 100644
--- a/polly/include/polly/ScopBuilder.h
+++ b/polly/include/polly/ScopBuilder.h
@@ -74,65 +74,6 @@ class ScopBuilder {
   ///      only be simplified later on.
   RecordedAssumptionsTy RecordedAssumptions;
 
-  // Methods for pattern matching against Fortran code generated by dragonegg.
-  // @{
-
-  /// Try to match for the descriptor of a Fortran array whose allocation
-  /// is not visible. That is, we can see the load/store into the memory, but
-  /// we don't actually know where the memory is allocated. If ALLOCATE had been
-  /// called on the Fortran array, then we will see the lowered malloc() call.
-  /// If not, this is dubbed as an "invisible allocation".
-  ///
-  /// "<descriptor>" is the descriptor of the Fortran array.
-  ///
-  /// Pattern match for "@descriptor":
-  ///  1. %mem = load double*, double** bitcast (%"struct.array1_real(kind=8)"*
-  ///    <descriptor> to double**), align 32
-  ///
-  ///  2. [%slot = getelementptr inbounds i8, i8* %mem, i64 <index>]
-  ///  2 is optional because if you are writing to the 0th index, you don't
-  ///     need a GEP.
-  ///
-  ///  3.1 store/load <memtype> <val>, <memtype>* %slot
-  ///  3.2 store/load <memtype> <val>, <memtype>* %mem
-  ///
-  /// @see polly::MemoryAccess, polly::ScopArrayInfo
-  ///
-  /// @note assumes -polly-canonicalize has been run.
-  ///
-  /// @param Inst The LoadInst/StoreInst that accesses the memory.
-  ///
-  /// @returns Reference to <descriptor> on success, nullptr on failure.
-  Value *findFADAllocationInvisible(MemAccInst Inst);
-
-  /// Try to match for the descriptor of a Fortran array whose allocation
-  /// call is visible. When we have a Fortran array, we try to look for a
-  /// Fortran array where we can see the lowered ALLOCATE call. ALLOCATE
-  /// is materialized as a malloc(...) which we pattern match for.
-  ///
-  /// Pattern match for "%untypedmem":
-  ///  1. %untypedmem = i8* @malloc(...)
-  ///
-  ///  2. %typedmem = bitcast i8* %untypedmem to <memtype>
-  ///
-  ///  3. [%slot = getelementptr inbounds i8, i8* %typedmem, i64 <index>]
-  ///  3 is optional because if you are writing to the 0th index, you don't
-  ///     need a GEP.
-  ///
-  ///  4.1 store/load <memtype> <val>, <memtype>* %slot, align 8
-  ///  4.2 store/load <memtype> <val>, <memtype>* %mem, align 8
-  ///
-  /// @see polly::MemoryAccess, polly::ScopArrayInfo
-  ///
-  /// @note assumes -polly-canonicalize has been run.
-  ///
-  /// @param Inst The LoadInst/StoreInst that accesses the memory.
-  ///
-  /// @returns Reference to %untypedmem on success, nullptr on failure.
-  Value *findFADAllocationVisible(MemAccInst Inst);
-
-  // @}
-
   // Build the SCoP for Region @p R.
   void buildScop(Region &R, AssumptionCache &AC);
 
@@ -417,9 +358,6 @@ class ScopBuilder {
   /// all memory accesses have been modeled and canonicalized.
   void assumeNoOutOfBounds();
 
-  /// Mark arrays that have memory accesses with FortranArrayDescriptor.
-  void markFortranArrays();
-
   /// Build the alias checks for this SCoP.
   bool buildAliasChecks();
 

diff  --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h
index 7f07af3d8d16e..5eff6eb3e8d20 100644
--- a/polly/include/polly/ScopInfo.h
+++ b/polly/include/polly/ScopInfo.h
@@ -264,16 +264,6 @@ class ScopArrayInfo {
   ///                          with old sizes
   bool updateSizes(ArrayRef<const SCEV *> Sizes, bool CheckConsistency = true);
 
-  /// Make the ScopArrayInfo model a Fortran array.
-  /// It receives the Fortran array descriptor and stores this.
-  /// It also adds a piecewise expression for the outermost dimension
-  /// since this information is available for Fortran arrays at runtime.
-  void applyAndSetFAD(Value *FAD);
-
-  /// Get the FortranArrayDescriptor corresponding to this array if it exists,
-  /// nullptr otherwise.
-  Value *getFortranArrayDescriptor() const { return this->FAD; }
-
   /// Set the base pointer to @p BP.
   void setBasePtr(Value *BP) { BasePtr = BP; }
 
@@ -440,10 +430,6 @@ class ScopArrayInfo {
 
   /// The scop this SAI object belongs to.
   Scop &S;
-
-  /// If this array models a Fortran array, then this points
-  /// to the Fortran array descriptor.
-  Value *FAD = nullptr;
 };
 
 /// Represent memory accesses in statements.
@@ -636,13 +622,6 @@ class MemoryAccess {
 
   /// Updated access relation read from JSCOP file.
   isl::map NewAccessRelation;
-
-  /// Fortran arrays whose sizes are not statically known are stored in terms
-  /// of a descriptor struct. This maintains a raw pointer to the memory,
-  /// along with auxiliary fields with information such as dimensions.
-  /// We hold a reference to the descriptor corresponding to a MemoryAccess
-  /// into a Fortran array. FAD for "Fortran Array Descriptor"
-  AssertingVH<Value> FAD;
   // @}
 
   isl::basic_map createBasicAccessMap(ScopStmt *Statement);
@@ -935,10 +914,6 @@ class MemoryAccess {
   /// the dimension of the innermost loop containing the statement.
   isl::set getStride(isl::map Schedule) const;
 
-  /// Get the FortranArrayDescriptor corresponding to this memory access if
-  /// it exists, and nullptr otherwise.
-  Value *getFortranArrayDescriptor() const { return this->FAD; }
-
   /// Is the stride of the access equal to a certain width? Schedule is a map
   /// from the statement to a schedule where the innermost dimension is the
   /// dimension of the innermost loop containing the statement.
@@ -1061,10 +1036,6 @@ class MemoryAccess {
   /// Get the reduction type of this access
   ReductionType getReductionType() const { return RedType; }
 
-  /// Set the array descriptor corresponding to the Array on which the
-  /// memory access is performed.
-  void setFortranArrayDescriptor(Value *FAD);
-
   /// Update the original access relation.
   ///
   /// We need to update the original access relation during scop construction,

diff  --git a/polly/lib/Analysis/ScopBuilder.cpp b/polly/lib/Analysis/ScopBuilder.cpp
index 35e91b4423d6d..2cb6f37441e8d 100644
--- a/polly/lib/Analysis/ScopBuilder.cpp
+++ b/polly/lib/Analysis/ScopBuilder.cpp
@@ -129,11 +129,6 @@ static cl::opt<std::string> UserContextStr(
     cl::desc("Provide additional constraints on the context parameters"),
     cl::init(""), cl::cat(PollyCategory));
 
-static cl::opt<bool> DetectFortranArrays(
-    "polly-detect-fortran-arrays",
-    cl::desc("Detect Fortran arrays and use this for code generation"),
-    cl::Hidden, cl::init(false), cl::cat(PollyCategory));
-
 static cl::opt<bool> DetectReductions("polly-detect-reductions",
                                       cl::desc("Detect and exploit reductions"),
                                       cl::Hidden, cl::ZeroOrMore,
@@ -1333,189 +1328,6 @@ void ScopBuilder::buildEscapingDependences(Instruction *Inst) {
     ensureValueWrite(Inst);
 }
 
-/// Check that a value is a Fortran Array descriptor.
-///
-/// We check if V has the following structure:
-/// %"struct.array1_real(kind=8)" = type { i8*, i<zz>, i<zz>,
-///                                   [<num> x %struct.descriptor_dimension] }
-///
-///
-/// %struct.descriptor_dimension = type { i<zz>, i<zz>, i<zz> }
-///
-/// 1. V's type name starts with "struct.array"
-/// 2. V's type has layout as shown.
-/// 3. Final member of V's type has name "struct.descriptor_dimension",
-/// 4. "struct.descriptor_dimension" has layout as shown.
-/// 5. Consistent use of i<zz> where <zz> is some fixed integer number.
-///
-/// We are interested in such types since this is the code that dragonegg
-/// generates for Fortran array descriptors.
-///
-/// @param V the Value to be checked.
-///
-/// @returns True if V is a Fortran array descriptor, False otherwise.
-bool isFortranArrayDescriptor(Value *V) {
-  PointerType *PTy = dyn_cast<PointerType>(V->getType());
-
-  if (!PTy)
-    return false;
-
-  Type *Ty = PTy->getElementType();
-  assert(Ty && "Ty expected to be initialized");
-  auto *StructArrTy = dyn_cast<StructType>(Ty);
-
-  if (!(StructArrTy && StructArrTy->hasName()))
-    return false;
-
-  if (!StructArrTy->getName().startswith("struct.array"))
-    return false;
-
-  if (StructArrTy->getNumElements() != 4)
-    return false;
-
-  const ArrayRef<Type *> ArrMemberTys = StructArrTy->elements();
-
-  // i8* match
-  if (ArrMemberTys[0] != Type::getInt8PtrTy(V->getContext()))
-    return false;
-
-  // Get a reference to the int type and check that all the members
-  // share the same int type
-  Type *IntTy = ArrMemberTys[1];
-  if (ArrMemberTys[2] != IntTy)
-    return false;
-
-  // type: [<num> x %struct.descriptor_dimension]
-  ArrayType *DescriptorDimArrayTy = dyn_cast<ArrayType>(ArrMemberTys[3]);
-  if (!DescriptorDimArrayTy)
-    return false;
-
-  // type: %struct.descriptor_dimension := type { ixx, ixx, ixx }
-  StructType *DescriptorDimTy =
-      dyn_cast<StructType>(DescriptorDimArrayTy->getElementType());
-
-  if (!(DescriptorDimTy && DescriptorDimTy->hasName()))
-    return false;
-
-  if (DescriptorDimTy->getName() != "struct.descriptor_dimension")
-    return false;
-
-  if (DescriptorDimTy->getNumElements() != 3)
-    return false;
-
-  for (auto MemberTy : DescriptorDimTy->elements()) {
-    if (MemberTy != IntTy)
-      return false;
-  }
-
-  return true;
-}
-
-Value *ScopBuilder::findFADAllocationVisible(MemAccInst Inst) {
-  // match: 4.1 & 4.2 store/load
-  if (!isa<LoadInst>(Inst) && !isa<StoreInst>(Inst))
-    return nullptr;
-
-  // match: 4
-  if (Inst.getAlignment() != 8)
-    return nullptr;
-
-  Value *Address = Inst.getPointerOperand();
-
-  const BitCastInst *Bitcast = nullptr;
-  // [match: 3]
-  if (auto *Slot = dyn_cast<GetElementPtrInst>(Address)) {
-    Value *TypedMem = Slot->getPointerOperand();
-    // match: 2
-    Bitcast = dyn_cast<BitCastInst>(TypedMem);
-  } else {
-    // match: 2
-    Bitcast = dyn_cast<BitCastInst>(Address);
-  }
-
-  if (!Bitcast)
-    return nullptr;
-
-  auto *MallocMem = Bitcast->getOperand(0);
-
-  // match: 1
-  auto *MallocCall = dyn_cast<CallInst>(MallocMem);
-  if (!MallocCall)
-    return nullptr;
-
-  Function *MallocFn = MallocCall->getCalledFunction();
-  if (!(MallocFn && MallocFn->hasName() && MallocFn->getName() == "malloc"))
-    return nullptr;
-
-  // Find all uses the malloc'd memory.
-  // We are looking for a "store" into a struct with the type being the Fortran
-  // descriptor type
-  for (auto user : MallocMem->users()) {
-    /// match: 5
-    auto *MallocStore = dyn_cast<StoreInst>(user);
-    if (!MallocStore)
-      continue;
-
-    auto *DescriptorGEP =
-        dyn_cast<GEPOperator>(MallocStore->getPointerOperand());
-    if (!DescriptorGEP)
-      continue;
-
-    // match: 5
-    auto DescriptorType =
-        dyn_cast<StructType>(DescriptorGEP->getSourceElementType());
-    if (!(DescriptorType && DescriptorType->hasName()))
-      continue;
-
-    Value *Descriptor = dyn_cast<Value>(DescriptorGEP->getPointerOperand());
-
-    if (!Descriptor)
-      continue;
-
-    if (!isFortranArrayDescriptor(Descriptor))
-      continue;
-
-    return Descriptor;
-  }
-
-  return nullptr;
-}
-
-Value *ScopBuilder::findFADAllocationInvisible(MemAccInst Inst) {
-  // match: 3
-  if (!isa<LoadInst>(Inst) && !isa<StoreInst>(Inst))
-    return nullptr;
-
-  Value *Slot = Inst.getPointerOperand();
-
-  LoadInst *MemLoad = nullptr;
-  // [match: 2]
-  if (auto *SlotGEP = dyn_cast<GetElementPtrInst>(Slot)) {
-    // match: 1
-    MemLoad = dyn_cast<LoadInst>(SlotGEP->getPointerOperand());
-  } else {
-    // match: 1
-    MemLoad = dyn_cast<LoadInst>(Slot);
-  }
-
-  if (!MemLoad)
-    return nullptr;
-
-  auto *BitcastOperator =
-      dyn_cast<BitCastOperator>(MemLoad->getPointerOperand());
-  if (!BitcastOperator)
-    return nullptr;
-
-  Value *Descriptor = dyn_cast<Value>(BitcastOperator->getOperand(0));
-  if (!Descriptor)
-    return nullptr;
-
-  if (!isFortranArrayDescriptor(Descriptor))
-    return nullptr;
-
-  return Descriptor;
-}
-
 void ScopBuilder::addRecordedAssumptions() {
   for (auto &AS : llvm::reverse(RecordedAssumptions)) {
 
@@ -2350,17 +2162,8 @@ void ScopBuilder::addArrayAccess(ScopStmt *Stmt, MemAccInst MemAccInst,
                                  ArrayRef<const SCEV *> Sizes,
                                  Value *AccessValue) {
   ArrayBasePointers.insert(BaseAddress);
-  auto *MemAccess = addMemoryAccess(Stmt, MemAccInst, AccType, BaseAddress,
-                                    ElementType, IsAffine, AccessValue,
-                                    Subscripts, Sizes, MemoryKind::Array);
-
-  if (!DetectFortranArrays)
-    return;
-
-  if (Value *FAD = findFADAllocationInvisible(MemAccInst))
-    MemAccess->setFortranArrayDescriptor(FAD);
-  else if (Value *FAD = findFADAllocationVisible(MemAccInst))
-    MemAccess->setFortranArrayDescriptor(FAD);
+  addMemoryAccess(Stmt, MemAccInst, AccType, BaseAddress, ElementType, IsAffine,
+                  AccessValue, Subscripts, Sizes, MemoryKind::Array);
 }
 
 /// Check if @p Expr is divisible by @p Size.
@@ -2490,29 +2293,11 @@ void ScopBuilder::foldSizeConstantsToRight() {
   }
 }
 
-void ScopBuilder::markFortranArrays() {
-  for (ScopStmt &Stmt : *scop) {
-    for (MemoryAccess *MemAcc : Stmt) {
-      Value *FAD = MemAcc->getFortranArrayDescriptor();
-      if (!FAD)
-        continue;
-
-      // TODO: const_cast-ing to edit
-      ScopArrayInfo *SAI =
-          const_cast<ScopArrayInfo *>(MemAcc->getLatestScopArrayInfo());
-      assert(SAI && "memory access into a Fortran array does not "
-                    "have an associated ScopArrayInfo");
-      SAI->applyAndSetFAD(FAD);
-    }
-  }
-}
-
 void ScopBuilder::finalizeAccesses() {
   updateAccessDimensionality();
   foldSizeConstantsToRight();
   foldAccessRelations();
   assumeNoOutOfBounds();
-  markFortranArrays();
 }
 
 void ScopBuilder::updateAccessDimensionality() {

diff  --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp
index 60a54f1ccb80c..dc2d4848ba3bc 100644
--- a/polly/lib/Analysis/ScopInfo.cpp
+++ b/polly/lib/Analysis/ScopInfo.cpp
@@ -298,32 +298,6 @@ void ScopArrayInfo::updateElementType(Type *NewElementType) {
   }
 }
 
-/// Make the ScopArrayInfo model a Fortran Array
-void ScopArrayInfo::applyAndSetFAD(Value *FAD) {
-  assert(FAD && "got invalid Fortran array descriptor");
-  if (this->FAD) {
-    assert(this->FAD == FAD &&
-           "receiving 
diff erent array descriptors for same array");
-    return;
-  }
-
-  assert(DimensionSizesPw.size() > 0 && DimensionSizesPw[0].is_null());
-  assert(!this->FAD);
-  this->FAD = FAD;
-
-  isl::space Space(S.getIslCtx(), 1, 0);
-
-  std::string param_name = getName();
-  param_name += "_fortranarr_size";
-  isl::id IdPwAff = isl::id::alloc(S.getIslCtx(), param_name, this);
-
-  Space = Space.set_dim_id(isl::dim::param, 0, IdPwAff);
-  isl::pw_aff PwAff =
-      isl::aff::var_on_domain(isl::local_space(Space), isl::dim::param, 0);
-
-  DimensionSizesPw[0] = PwAff;
-}
-
 bool ScopArrayInfo::updateSizes(ArrayRef<const SCEV *> NewSizes,
                                 bool CheckConsistency) {
   int SharedDims = std::min(NewSizes.size(), DimensionSizes.size());
@@ -372,12 +346,8 @@ LLVM_DUMP_METHOD void ScopArrayInfo::dump() const { print(errs()); }
 void ScopArrayInfo::print(raw_ostream &OS, bool SizeAsPwAff) const {
   OS.indent(8) << *getElementType() << " " << getName();
   unsigned u = 0;
-  // If this is a Fortran array, then we can print the outermost dimension
-  // as a isl_pw_aff even though there is no SCEV information.
-  bool IsOutermostSizeKnown = SizeAsPwAff && FAD;
 
-  if (!IsOutermostSizeKnown && getNumberOfDimensions() > 0 &&
-      !getDimensionSize(0)) {
+  if (getNumberOfDimensions() > 0 && !getDimensionSize(0)) {
     OS << "[*]";
     u++;
   }
@@ -894,7 +864,7 @@ MemoryAccess::MemoryAccess(ScopStmt *Stmt, Instruction *AccessInst,
       Sizes(Sizes.begin(), Sizes.end()), AccessInstruction(AccessInst),
       AccessValue(AccessValue), IsAffine(Affine),
       Subscripts(Subscripts.begin(), Subscripts.end()), AccessRelation(),
-      NewAccessRelation(), FAD(nullptr) {
+      NewAccessRelation() {
   static const std::string TypeStrings[] = {"", "_Read", "_Write", "_MayWrite"};
   const std::string Access = TypeStrings[AccType] + utostr(Stmt->size());
 
@@ -904,8 +874,7 @@ MemoryAccess::MemoryAccess(ScopStmt *Stmt, Instruction *AccessInst,
 
 MemoryAccess::MemoryAccess(ScopStmt *Stmt, AccessType AccType, isl::map AccRel)
     : Kind(MemoryKind::Array), AccType(AccType), Statement(Stmt),
-      InvalidDomain(), AccessRelation(), NewAccessRelation(AccRel),
-      FAD(nullptr) {
+      InvalidDomain(), AccessRelation(), NewAccessRelation(AccRel) {
   isl::id ArrayInfoId = NewAccessRelation.get_tuple_id(isl::dim::out);
   auto *SAI = ScopArrayInfo::getFromId(ArrayInfoId);
   Sizes.push_back(nullptr);
@@ -949,8 +918,6 @@ raw_ostream &polly::operator<<(raw_ostream &OS,
   return OS;
 }
 
-void MemoryAccess::setFortranArrayDescriptor(Value *FAD) { this->FAD = FAD; }
-
 void MemoryAccess::print(raw_ostream &OS) const {
   switch (AccType) {
   case READ:
@@ -966,11 +933,6 @@ void MemoryAccess::print(raw_ostream &OS) const {
 
   OS << "[Reduction Type: " << getReductionType() << "] ";
 
-  if (FAD) {
-    OS << "[Fortran array descriptor: " << FAD->getName();
-    OS << "] ";
-  };
-
   OS << "[Scalar: " << isScalarKind() << "]\n";
   OS.indent(16) << getOriginalAccessRelationStr() << ";\n";
   if (hasNewAccessRelation())
@@ -1539,41 +1501,6 @@ void Scop::addParameterBounds() {
   intersectDefinedBehavior(Context, AS_ASSUMPTION);
 }
 
-static std::vector<isl::id> getFortranArrayIds(Scop::array_range Arrays) {
-  std::vector<isl::id> OutermostSizeIds;
-  for (auto Array : Arrays) {
-    // To check if an array is a Fortran array, we check if it has a isl_pw_aff
-    // for its outermost dimension. Fortran arrays will have this since the
-    // outermost dimension size can be picked up from their runtime description.
-    // TODO: actually need to check if it has a FAD, but for now this works.
-    if (Array->getNumberOfDimensions() > 0) {
-      isl::pw_aff PwAff = Array->getDimensionSizePw(0);
-      if (PwAff.is_null())
-        continue;
-
-      isl::id Id = PwAff.get_dim_id(isl::dim::param, 0);
-      assert(!Id.is_null() &&
-             "Invalid Id for PwAff expression in Fortran array");
-      OutermostSizeIds.push_back(Id);
-    }
-  }
-  return OutermostSizeIds;
-}
-
-// The FORTRAN array size parameters are known to be non-negative.
-static isl::set boundFortranArrayParams(isl::set Context,
-                                        Scop::array_range Arrays) {
-  std::vector<isl::id> OutermostSizeIds;
-  OutermostSizeIds = getFortranArrayIds(Arrays);
-
-  for (isl::id Id : OutermostSizeIds) {
-    int dim = Context.find_dim_by_id(isl::dim::param, Id);
-    Context = Context.lower_bound_si(isl::dim::param, dim, 0);
-  }
-
-  return Context;
-}
-
 void Scop::realignParams() {
   if (PollyIgnoreParamBounds)
     return;
@@ -1586,9 +1513,6 @@ void Scop::realignParams() {
   AssumedContext = AssumedContext.align_params(Space);
   InvalidContext = InvalidContext.align_params(Space);
 
-  // Bound the size of the fortran array dimensions.
-  Context = boundFortranArrayParams(Context, arrays());
-
   // As all parameters are known add bounds to them.
   addParameterBounds();
 
@@ -1901,11 +1825,8 @@ isl::set Scop::getContext() const { return Context; }
 isl::space Scop::getParamSpace() const { return getContext().get_space(); }
 
 isl::space Scop::getFullParamSpace() const {
-  std::vector<isl::id> FortranIDs;
-  FortranIDs = getFortranArrayIds(arrays());
 
-  isl::space Space = isl::space::params_alloc(
-      getIslCtx(), ParameterIds.size() + FortranIDs.size());
+  isl::space Space = isl::space::params_alloc(getIslCtx(), ParameterIds.size());
 
   unsigned PDim = 0;
   for (const SCEV *Parameter : Parameters) {
@@ -1913,9 +1834,6 @@ isl::space Scop::getFullParamSpace() const {
     Space = Space.set_dim_id(isl::dim::param, PDim++, Id);
   }
 
-  for (isl::id Id : FortranIDs)
-    Space = Space.set_dim_id(isl::dim::param, PDim++, Id);
-
   return Space;
 }
 

diff  --git a/polly/lib/CMakeLists.txt b/polly/lib/CMakeLists.txt
index 9a967b106ea65..c6c1a18e90046 100644
--- a/polly/lib/CMakeLists.txt
+++ b/polly/lib/CMakeLists.txt
@@ -97,7 +97,6 @@ add_llvm_pass_plugin(Polly
   Transform/ZoneAlgo.cpp
   Transform/Simplify.cpp
   Transform/MaximalStaticExpansion.cpp
-  Transform/RewriteByReferenceParameters.cpp
   Transform/ScopInliner.cpp
   Transform/ManualOptimizer.cpp
   Transform/MatmulOptimizer.cpp

diff  --git a/polly/lib/CodeGen/IslNodeBuilder.cpp b/polly/lib/CodeGen/IslNodeBuilder.cpp
index 06fb1c775f695..36864dbe51fa9 100644
--- a/polly/lib/CodeGen/IslNodeBuilder.cpp
+++ b/polly/lib/CodeGen/IslNodeBuilder.cpp
@@ -1160,84 +1160,6 @@ bool IslNodeBuilder::materializeParameters() {
   return true;
 }
 
-/// Generate the computation of the size of the outermost dimension from the
-/// Fortran array descriptor (in this case, `@g_arr`). The final `%size`
-/// contains the size of the array.
-///
-/// %arrty = type { i8*, i64, i64, [3 x %desc.dimensionty] }
-/// %desc.dimensionty = type { i64, i64, i64 }
-/// @g_arr = global %arrty zeroinitializer, align 32
-/// ...
-/// %0 = load i64, i64* getelementptr inbounds
-///                       (%arrty, %arrty* @g_arr, i64 0, i32 3, i64 0, i32 2)
-/// %1 = load i64, i64* getelementptr inbounds
-///                      (%arrty, %arrty* @g_arr, i64 0, i32 3, i64 0, i32 1)
-/// %2 = sub nsw i64 %0, %1
-/// %size = add nsw i64 %2, 1
-static Value *buildFADOutermostDimensionLoad(Value *GlobalDescriptor,
-                                             PollyIRBuilder &Builder,
-                                             std::string ArrayName) {
-  assert(GlobalDescriptor && "invalid global descriptor given");
-  Type *Ty = GlobalDescriptor->getType()->getPointerElementType();
-
-  Value *endIdx[4] = {Builder.getInt64(0), Builder.getInt32(3),
-                      Builder.getInt64(0), Builder.getInt32(2)};
-  Value *endPtr = Builder.CreateInBoundsGEP(Ty, GlobalDescriptor, endIdx,
-                                            ArrayName + "_end_ptr");
-  Type *type = cast<GEPOperator>(endPtr)->getResultElementType();
-  assert(isa<IntegerType>(type) && "expected type of end to be integral");
-
-  Value *end = Builder.CreateLoad(type, endPtr, ArrayName + "_end");
-
-  Value *beginIdx[4] = {Builder.getInt64(0), Builder.getInt32(3),
-                        Builder.getInt64(0), Builder.getInt32(1)};
-  Value *beginPtr = Builder.CreateInBoundsGEP(Ty, GlobalDescriptor, beginIdx,
-                                              ArrayName + "_begin_ptr");
-  Value *begin = Builder.CreateLoad(type, beginPtr, ArrayName + "_begin");
-
-  Value *size =
-      Builder.CreateNSWSub(end, begin, ArrayName + "_end_begin_delta");
-
-  size = Builder.CreateNSWAdd(
-      end, ConstantInt::get(type, 1, /* signed = */ true), ArrayName + "_size");
-
-  return size;
-}
-
-bool IslNodeBuilder::materializeFortranArrayOutermostDimension() {
-  for (ScopArrayInfo *Array : S.arrays()) {
-    if (Array->getNumberOfDimensions() == 0)
-      continue;
-
-    Value *FAD = Array->getFortranArrayDescriptor();
-    if (!FAD)
-      continue;
-
-    isl_pw_aff *ParametricPwAff = Array->getDimensionSizePw(0).release();
-    assert(ParametricPwAff && "parametric pw_aff corresponding "
-                              "to outermost dimension does not "
-                              "exist");
-
-    isl_id *Id = isl_pw_aff_get_dim_id(ParametricPwAff, isl_dim_param, 0);
-    isl_pw_aff_free(ParametricPwAff);
-
-    assert(Id && "pw_aff is not parametric");
-
-    if (IDToValue.count(Id)) {
-      isl_id_free(Id);
-      continue;
-    }
-
-    Value *FinalValue =
-        buildFADOutermostDimensionLoad(FAD, Builder, Array->getName());
-    assert(FinalValue && "unable to build Fortran array "
-                         "descriptor load of outermost dimension");
-    IDToValue[Id] = FinalValue;
-    isl_id_free(Id);
-  }
-  return true;
-}
-
 Value *IslNodeBuilder::preloadUnconditionally(isl_set *AccessRange,
                                               isl_ast_build *Build,
                                               Instruction *AccInst) {
@@ -1569,12 +1491,6 @@ void IslNodeBuilder::addParameters(__isl_take isl_set *Context) {
   // Materialize values for the parameters of the SCoP.
   materializeParameters();
 
-  // materialize the outermost dimension parameters for a Fortran array.
-  // NOTE: materializeParameters() does not work since it looks through
-  // the SCEVs. We don't have a corresponding SCEV for the array size
-  // parameter
-  materializeFortranArrayOutermostDimension();
-
   // Generate values for the current loop iteration for all surrounding loops.
   //
   // We may also reference loops outside of the scop which do not contain the

diff  --git a/polly/lib/Support/RegisterPasses.cpp b/polly/lib/Support/RegisterPasses.cpp
index ebc0a7ee41ebe..e546525e1388f 100644
--- a/polly/lib/Support/RegisterPasses.cpp
+++ b/polly/lib/Support/RegisterPasses.cpp
@@ -264,7 +264,6 @@ void initializePollyPasses(PassRegistry &Registry) {
   initializeScopInlinerPass(Registry);
   initializeScopInfoRegionPassPass(Registry);
   initializeScopInfoWrapperPassPass(Registry);
-  initializeRewriteByrefParamsWrapperPassPass(Registry);
   initializeCodegenCleanupPass(Registry);
   initializeFlattenSchedulePass(Registry);
   initializeForwardOpTreeWrapperPassPass(Registry);

diff  --git a/polly/lib/Transform/Canonicalization.cpp b/polly/lib/Transform/Canonicalization.cpp
index 8dc26b3047819..d65d626df0c5b 100644
--- a/polly/lib/Transform/Canonicalization.cpp
+++ b/polly/lib/Transform/Canonicalization.cpp
@@ -15,7 +15,6 @@
 #include "polly/Canonicalization.h"
 #include "polly/LinkAllPasses.h"
 #include "polly/Options.h"
-#include "polly/RewriteByReferenceParameters.h"
 #include "llvm/Analysis/GlobalsModRef.h"
 #include "llvm/Analysis/ProfileSummaryInfo.h"
 #include "llvm/IR/LegacyPassManager.h"
@@ -42,7 +41,6 @@ static cl::opt<bool>
 
 void polly::registerCanonicalicationPasses(llvm::legacy::PassManagerBase &PM) {
   bool UseMemSSA = true;
-  PM.add(polly::createRewriteByrefParamsWrapperPass());
   PM.add(llvm::createPromoteMemoryToRegisterPass());
   PM.add(llvm::createEarlyCSEPass(UseMemSSA));
   PM.add(llvm::createInstructionCombiningPass());
@@ -98,7 +96,6 @@ polly::buildCanonicalicationPassesForNPM(llvm::ModulePassManager &MPM,
   FunctionPassManager FPM;
 
   bool UseMemSSA = true;
-  FPM.addPass(RewriteByrefParamsPass());
   FPM.addPass(PromotePass());
   FPM.addPass(EarlyCSEPass(UseMemSSA));
   FPM.addPass(InstCombinePass());

diff  --git a/polly/lib/Transform/RewriteByReferenceParameters.cpp b/polly/lib/Transform/RewriteByReferenceParameters.cpp
deleted file mode 100644
index 2cf4764cd6217..0000000000000
--- a/polly/lib/Transform/RewriteByReferenceParameters.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-//===------ RewriteByReferenceParameters.cpp --------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This pass introduces separate 'alloca' instructions for read-only
-// by-reference function parameters to indicate that these paramters are
-// read-only. After this transformation -mem2reg has more freedom to promote
-// variables to registers, which allows SCEV to work in more cases.
-//
-//===----------------------------------------------------------------------===//
-
-#include "polly/RewriteByReferenceParameters.h"
-#include "polly/LinkAllPasses.h"
-#include "llvm/IR/Instruction.h"
-#include "llvm/IR/Instructions.h"
-#include "llvm/Pass.h"
-
-#define DEBUG_TYPE "polly-rewrite-byref-params"
-
-using namespace llvm;
-
-namespace {
-static void tryRewriteInstruction(Instruction &Inst) {
-  BasicBlock *Entry = &Inst.getParent()->getParent()->getEntryBlock();
-
-  auto *Call = dyn_cast<CallInst>(&Inst);
-
-  if (!Call)
-    return;
-
-  llvm::Function *F = Call->getCalledFunction();
-
-  if (!F)
-    return;
-
-  // We currently match for a very specific function. In case this proves
-  // useful, we can make this code dependent on readonly metadata.
-  if (!F->hasName() || F->getName() != "_gfortran_transfer_integer_write")
-    return;
-
-  auto *BitCast = dyn_cast<BitCastInst>(Call->getOperand(1));
-
-  if (!BitCast)
-    return;
-
-  auto *Alloca = dyn_cast<AllocaInst>(BitCast->getOperand(0));
-
-  if (!Alloca)
-    return;
-
-  std::string InstName = Alloca->getName().str();
-
-  auto NewAlloca =
-      new AllocaInst(Alloca->getAllocatedType(), 0,
-                     "polly_byref_alloca_" + InstName, &*Entry->begin());
-
-  auto *LoadedVal = new LoadInst(Alloca->getAllocatedType(), Alloca,
-                                 "polly_byref_load_" + InstName, &Inst);
-
-  new StoreInst(LoadedVal, NewAlloca, &Inst);
-  auto *NewBitCast = new BitCastInst(NewAlloca, BitCast->getType(),
-                                     "polly_byref_cast_" + InstName, &Inst);
-  Call->setOperand(1, NewBitCast);
-}
-
-static void runRewriteByrefParams(Function &F) {
-  for (BasicBlock &BB : F)
-    for (Instruction &Inst : BB)
-      tryRewriteInstruction(Inst);
-}
-
-class RewriteByrefParamsWrapperPass : public FunctionPass {
-private:
-  RewriteByrefParamsWrapperPass(const RewriteByrefParamsWrapperPass &) = delete;
-  const RewriteByrefParamsWrapperPass &
-  operator=(const RewriteByrefParamsWrapperPass &) = delete;
-
-public:
-  static char ID;
-  explicit RewriteByrefParamsWrapperPass() : FunctionPass(ID) {}
-
-  virtual void getAnalysisUsage(AnalysisUsage &AU) const override {}
-
-  virtual bool runOnFunction(Function &F) override {
-    runRewriteByrefParams(F);
-    return true;
-  }
-};
-
-char RewriteByrefParamsWrapperPass::ID;
-} // anonymous namespace
-
-Pass *polly::createRewriteByrefParamsWrapperPass() {
-  return new RewriteByrefParamsWrapperPass();
-}
-
-llvm::PreservedAnalyses
-polly ::RewriteByrefParamsPass::run(llvm::Function &F,
-                                    llvm::FunctionAnalysisManager &FAM) {
-  runRewriteByrefParams(F);
-  return PreservedAnalyses::none();
-}
-
-INITIALIZE_PASS_BEGIN(RewriteByrefParamsWrapperPass,
-                      "polly-rewrite-byref-params",
-                      "Polly - Rewrite by reference parameters", false, false)
-INITIALIZE_PASS_END(RewriteByrefParamsWrapperPass, "polly-rewrite-byref-params",
-                    "Polly - Rewrite by reference parameters", false, false)

diff  --git a/polly/test/CodeGen/fortran_array_runtime_size_generation.ll b/polly/test/CodeGen/fortran_array_runtime_size_generation.ll
deleted file mode 100644
index 29eeb1ce4dd28..0000000000000
--- a/polly/test/CodeGen/fortran_array_runtime_size_generation.ll
+++ /dev/null
@@ -1,77 +0,0 @@
-; Check that the runtime size computation is generated for Fortran arrays.
-
-; Regular code generation backend:
-; RUN: opt %loadPolly -S -polly-detect-fortran-arrays \
-; RUN: -polly-codegen < %s | FileCheck %s
-
-; What the input fortran code should look like. NOTE: this is fake, the
-; .ll file was hand-written.
-;
-; MODULE testmod
-; USE data_parameters, ONLY : &
-; IMPLICIT NONE
-;
-; INTEGER (KIND=iintegers), ALLOCATABLE, PRIVATE  :: &
-;   arrin(:), arrout(:)
-; CONTAINS
-;
-; SUBROUTINE test()
-;   INTEGER (KIND=iintegers) :: i
-;
-;   DO i = 1, 100
-;       arrout(i) = arrin(i) * arrin(i)
-;   END DO
-; END SUBROUTINE test
-; END MODULE testmod
-
-target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i32:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
-target triple = "x86_64-unknown-linux-gnu"
-
-module asm "\09.ident\09\22GCC: (GNU) 4.6.4 LLVM: 3.3.1\22"
-
-%"struct.array1_real(kind=8)" = type { i8*, i32, i32, [1 x %struct.descriptor_dimension] }
-%struct.descriptor_dimension = type { i32, i32, i32 }
-
- at arrin = unnamed_addr global %"struct.array1_real(kind=8)" zeroinitializer, align 32
- at arrout = unnamed_addr global %"struct.array1_real(kind=8)" zeroinitializer, align 32
-
-; Function Attrs: nounwind uwtable
-define void @__src_soil_MOD_terra1() unnamed_addr #0 {
-entry:
-  br label %entry.split
-
-entry.split:                                      ; preds = %entry
-  %rawmemin1 = load i32*, i32** bitcast (%"struct.array1_real(kind=8)"* @arrin to i32**), align 32, !tbaa !0
-  %rawmemout2 = load i32*, i32** bitcast (%"struct.array1_real(kind=8)"* @arrout to i32**), align 32, !tbaa !0
-  br label %for.body
-
-for.body:                                         ; preds = %entry.split, %for.body
-  %indvars.iv = phi i64 [ 1, %entry.split ], [ %indvars.iv.next4, %for.body ]
-  %inslot = getelementptr inbounds i32, i32* %rawmemin1, i64 %indvars.iv
-  %inval = load i32, i32* %inslot, align 8
-  %outslot = getelementptr inbounds i32, i32* %rawmemout2, i64 %indvars.iv
-  %out = mul nsw i32 %inval, %inval
-  store i32 %out, i32* %outslot, align 8
-  %indvars.iv.next4 = add nuw nsw i64 %indvars.iv, 1
-  %exitcond = icmp eq i64 %indvars.iv.next4, 100
-  br i1 %exitcond, label %return, label %for.body
-
-return:                                           ; preds = %for.body
-  ret void
-}
-
-attributes #0 = { nounwind uwtable }
-
-!0 = !{!1, !1, i32 0}
-!1 = !{!"alias set 3: void*", !2}
-!2 = distinct !{!2}
-
-
-; CHECK:       %MemRef_rawmemin1_end = load i32, i32* getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @arrin, i64 0, i32 3, i64 0, i32 2)
-; CHECK-NEXT:  %MemRef_rawmemin1_begin = load i32, i32* getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @arrin, i64 0, i32 3, i64 0, i32 1)
-; CHECK-NEXT:  %MemRef_rawmemin1_end_begin_delta = sub nsw i32 %MemRef_rawmemin1_end, %MemRef_rawmemin1_begin
-; CHECK-NEXT:  %MemRef_rawmemin1_size = add nsw i32 %MemRef_rawmemin1_end, 1
-; CHECK-NEXT:  %MemRef_rawmemout2_end = load i32, i32* getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @arrout, i64 0, i32 3, i64 0, i32 2)
-; CHECK-NEXT:  %MemRef_rawmemout2_begin = load i32, i32* getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @arrout, i64 0, i32 3, i64 0, i32 1)
-; CHECK-NEXT:  %MemRef_rawmemout2_end_begin_delta = sub nsw i32 %MemRef_rawmemout2_end, %MemRef_rawmemout2_begin
-; CHECK-NEXT:  %MemRef_rawmemout2_size = add nsw i32 %MemRef_rawmemout2_end, 1

diff  --git a/polly/test/GPGPU/check-unused-fortran-array-size-param-offloaded-to-kernel.ll b/polly/test/GPGPU/check-unused-fortran-array-size-param-offloaded-to-kernel.ll
deleted file mode 100644
index d7ef8cec86c5a..0000000000000
--- a/polly/test/GPGPU/check-unused-fortran-array-size-param-offloaded-to-kernel.ll
+++ /dev/null
@@ -1,103 +0,0 @@
-; RUN: opt %loadPolly -analyze -polly-scops \
-; RUN:     -polly-detect-fortran-arrays \
-; RUN:     -polly-invariant-load-hoisting \
-; RUN:     -polly-use-llvm-names \
-; RUN:     -polly-stmt-granularity=bb \
-; RUN:     < %s | FileCheck %s --check-prefix=SCOP
-
-; RUN: opt %loadPolly -S \
-; RUN:     -polly-detect-fortran-arrays \
-; RUN:     -polly-codegen-ppcg \
-; RUN:     -polly-invariant-load-hoisting \
-; RUN:     -polly-use-llvm-names \
-; RUN:     -polly-acc-fail-on-verify-module-failure \
-; RUN:     < %s | FileCheck %s --check-prefix=HOST-IR
-
-; REQUIRES: pollyacc
-
-; In Polly, we specifically add a parameter to represent the outermost dimension
-; size of fortran arrays. We do this because this information is statically
-; available from the fortran metadata generated by dragonegg.
-; However, we were only materializing these parameters (meaning, creating an
-; llvm::Value to back the isl_id) from *memory accesses*. This is wrong,
-; we should materialize parameters from *scop array info*.
-
-; It is wrong because if there is a case where we detect 2 fortran arrays,
-; but only one of them is accessed, we may not materialize the other array's
-; dimensions at all.
-
-; This test case checks that we do not fail if there is an array that does
-; not have an access (In this case, `memory`), we still generate the
-; parameter.
-
-; Check that we detect the function as a Scop.
-; SCOP:      Function: f
-; SCOP-NEXT: Region: %loop.prepare---%for.exit
-; SCOP-NEXT: Max Loop Depth:  1
-
-; Check that we detect fortran arrays.
-; SCOP:    Arrays (Bounds as pw_affs) {
-; SCOP:             double* MemRef_global_arr[*]; // Element size 8
-; SCOP-NEXT:        double MemRef_memory[ [MemRef_memory_fortranarr_size] -> { [] -> [(MemRef_memory_fortranarr_size)] } ]; [BasePtrOrigin: MemRef_global_arr] // Element size 8
-; SCOP-NEXT:        double MemRef_memory2[ [MemRef_memory2_fortranarr_size] -> { [] -> [(MemRef_memory2_fortranarr_size)] } ]; [BasePtrOrigin: MemRef_global_arr] // Element size 8
-; SCOP-NEXT:    }
-
-; Check that we have writes *only* into memory2, not into memory.
-; SCOP:    Statements {
-; SCOP:    	Stmt_for_body
-; SCOP:            MustWriteAccess :=	[Reduction Type: NONE] [Fortran array descriptor: global_arr] [Scalar: 0]
-; SCOP-NEXT:                [start_val, end_val, offset, MemRef_memory_fortranarr_size, MemRef_memory2_fortranarr_size] -> { Stmt_for_body[i0] -> MemRef_memory2[start_val + offset + i0] };
-; SCOP-NEXT:            ReadAccess :=	[Reduction Type: NONE] [Fortran array descriptor: global_arr] [Scalar: 0]
-; SCOP-NEXT:                [start_val, end_val, offset, MemRef_memory_fortranarr_size, MemRef_memory2_fortranarr_size] -> { Stmt_for_body[i0] -> MemRef_memory2[start_val + offset + i0] };
-; SCOP-NEXT:    }
-
-; Check that we materialize the sizes and send it across to the kernel.
-; HOST-IR: store i64 %MemRef_memory_size, i64* %polly_launch_0_param_4
-; HOST-IR: store i64 %MemRef_memory2_size, i64* %polly_launch_0_param_5
-target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
-target triple = "x86_64-unknown-linux-gnu"
-
-module asm "\09.ident\09\22GCC: (GNU) 4.6.4 LLVM: 3.3.1\22"
-
-%"struct.array1_real(kind=8)" = type { i8*, i64, i64, [1 x %struct.descriptor_dimension] }
-%struct.descriptor_dimension = type { i64, i64, i64 }
-
- at global_arr = external unnamed_addr global %"struct.array1_real(kind=8)", align 32
-
-; Function Attrs: nounwind uwtable
-define void @f(i32* noalias %ipstart, i32* noalias %ipend) unnamed_addr #0 {
-entry:
-  br label %loop.prepare
-
-
-loop.prepare:                                              ; preds = %"6", %"3.preheader"
-  %start.val = load i32, i32* %ipstart, align 4
-  %end.val = load i32, i32* %ipend, align 4
-  %should.loop = icmp sgt i32 %start.val, %end.val
-  br i1 %should.loop, label %for.exit, label %for.body
-
-
-for.body:                                              ; preds = %for.body, %"4.preheader"
-  %i = phi i32 [ %i.next, %for.body ], [ %start.val, %loop.prepare ]
-  %i.sext = sext i32 %i to i64
-  %memory = load double*, double** bitcast (%"struct.array1_real(kind=8)"* @global_arr to double**), align 32
-  %offset = load i64, i64* getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @global_arr, i64 0, i32 1), align 8
-  %idx = add i64 %offset, %i.sext
-  %slot = getelementptr double, double* %memory, i64 %idx
-  store double 1.0, double* %slot, align 8
-
-  %memory2 = load double*, double** bitcast (%"struct.array1_real(kind=8)"* @global_arr to double**), align 32
-  %offset2 = load i64, i64* getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @global_arr, i64 0, i32 1), align 8
-  %idx2 = add i64 %offset2, %i.sext
-  %slot2 = getelementptr double, double* %memory2, i64 %idx2
-  %val = load double, double* %slot2, align 8
-
-  %should.loopexit = icmp eq i32 %i, %end.val
-  %i.next = add i32 %i, 1
-  br i1 %should.loopexit, label %for.exit, label %for.body
-
-for.exit:                                     ; preds = %for.body
-  ret void
-}
-
-attributes #0 = { nounwind uwtable }

diff  --git a/polly/test/RewriteByReferenceParameters/fortran_io.ll b/polly/test/RewriteByReferenceParameters/fortran_io.ll
deleted file mode 100644
index bc372c4754c0f..0000000000000
--- a/polly/test/RewriteByReferenceParameters/fortran_io.ll
+++ /dev/null
@@ -1,40 +0,0 @@
-; RUN: opt %loadPolly -polly-rewrite-byref-params -S < %s \
-; RUN: | FileCheck %s
-
-
-; Verify that we rewrite the read-only by-reference into a separate alloca slot.
-; This is useful in case %j3 is an induction variable, which should be promoted
-; by -mem2reg into a register.
-
-; CHECK: define void @foo(%struct.__st_parameter_dt* %p) {
-; CHECK-NEXT: entry:
-; CHECK-NEXT:   %polly_byref_alloca_j3 = alloca i32
-; CHECK-NEXT:   %j3 = alloca i32, align 4
-; CHECK-NEXT:   %tmp = bitcast i32* %j3 to i8*
-; CHECK-NEXT:   br label %bb
-
-; CHECK: bb:                                               ; preds = %entry
-; CHECK-NEXT:   %polly_byref_load_j3 = load i32, i32* %j3
-; CHECK-NEXT:   store i32 %polly_byref_load_j3, i32* %polly_byref_alloca_j3
-; CHECK-NEXT:   %polly_byref_cast_j3 = bitcast i32* %polly_byref_alloca_j3 to i8*
-; CHECK-NEXT:   call void @_gfortran_transfer_integer_write(%struct.__st_parameter_dt* %p, i8* %polly_byref_cast_j3, i32 4)
-; CHECK-NEXT:   ret void
-; CHECK-NEXT: }
-
-target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
-target triple = "x86_64-unknown-linux-gnu"
-
-%struct.__st_parameter_dt = type { }
-
-declare void @_gfortran_transfer_integer_write(%struct.__st_parameter_dt*, i8*, i32)
-
-define void @foo(%struct.__st_parameter_dt* %p) {
-entry:
-  %j3 = alloca i32, align 4
-  %tmp = bitcast i32* %j3 to i8*
-  br label %bb
-
-bb:
-  call void @_gfortran_transfer_integer_write(%struct.__st_parameter_dt* %p, i8* %tmp, i32 4)
-  ret void
-}

diff  --git a/polly/test/ScopInfo/fortran_array_global_malloc_nonvectored.ll b/polly/test/ScopInfo/fortran_array_global_malloc_nonvectored.ll
deleted file mode 100644
index eceef8b752371..0000000000000
--- a/polly/test/ScopInfo/fortran_array_global_malloc_nonvectored.ll
+++ /dev/null
@@ -1,116 +0,0 @@
-; RUN: opt %loadPolly -analyze -S -polly-detect-fortran-arrays \
-; RUN: -polly-process-unprofitable -polly-scops  < %s | FileCheck %s
-
-; MODULE src_soil
-; USE data_parameters, ONLY :   &
-;     wp,        & ! KIND-type parameter for real variables
-;     iintegers    ! KIND-type parameter for standard integer variables
-; IMPLICIT NONE
-; REAL (KIND = wp),     ALLOCATABLE, PRIVATE  :: &
-;   xdzs     (:)
-; CONTAINS
-; SUBROUTINE terra1(n)
-;   INTEGER, intent(in) :: n
-;   INTEGER (KIND=iintegers) ::  &
-;     j
-;   Allocate(xdzs(n));
-;    DO j = 2, n
-;         xdzs(j) = xdzs(j) * xdzs(j) + xdzs(j - 1)
-;   END DO
-; END SUBROUTINE terra1
-; END MODULE src_soil
-
-
-target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
-target triple = "x86_64-unknown-linux-gnu"
-
-module asm "\09.ident\09\22GCC: (GNU) 4.6.4 LLVM: 3.3.1\22"
-
-%"struct.array1_real(kind=8)" = type { i8*, i64, i64, [1 x %struct.descriptor_dimension] }
-%struct.descriptor_dimension = type { i64, i64, i64 }
-
- at __src_soil_MOD_xdzs = unnamed_addr global %"struct.array1_real(kind=8)" zeroinitializer, align 32
- at .cst = private unnamed_addr constant [67 x i8] c"Integer overflow when calculating the amount of memory to allocate\00", align 64
- at .cst1 = private unnamed_addr constant [37 x i8] c"Allocation would exceed memory limit\00", align 64
- at .cst2 = private unnamed_addr constant [93 x i8] c"At line 23 of file /home/siddhart/cosmo-self-installation/cosmo-pompa/cosmo/src/src_soil.f90\00", align 64
- at .cst3 = private unnamed_addr constant [55 x i8] c"Attempting to allocate already allocated variable '%s'\00", align 64
- at .cst4 = private unnamed_addr constant [5 x i8] c"xdzs\00", align 8
-
-; Function Attrs: nounwind uwtable
-define void @__src_soil_MOD_terra1(i32* noalias nocapture %n) unnamed_addr #0 {
-entry:
-  br label %entry.split
-
-entry.split:                                      ; preds = %entry
-  store i64 537, i64* getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @__src_soil_MOD_xdzs, i64 0, i32 2), align 16, !tbaa !0
-  store i64 1, i64* getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @__src_soil_MOD_xdzs, i64 0, i32 3, i64 0, i32 1), align 8, !tbaa !0
-  %tmp = load i32, i32* %n, align 4, !tbaa !3
-  %tmp1 = sext i32 %tmp to i64
-  store i64 %tmp1, i64* getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @__src_soil_MOD_xdzs, i64 0, i32 3, i64 0, i32 2), align 8, !tbaa !0
-  store i64 1, i64* getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @__src_soil_MOD_xdzs, i64 0, i32 3, i64 0, i32 0), align 8, !tbaa !0
-  %tmp2 = icmp slt i32 %tmp, 1
-  %tmp3 = zext i32 %tmp to i64
-  %tmp4 = shl nuw nsw i64 %tmp3, 3
-  %.24 = select i1 %tmp2, i64 0, i64 %tmp4
-  %tmp5 = icmp ne i64 %.24, 0
-  %tmp6 = select i1 %tmp5, i64 %.24, i64 1
-  %tmp7 = tail call noalias i8* @malloc(i64 %tmp6) #2
-  store i8* %tmp7, i8** getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @__src_soil_MOD_xdzs, i64 0, i32 0), align 32, !tbaa !5
-  store i64 -1, i64* getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @__src_soil_MOD_xdzs, i64 0, i32 1), align 8, !tbaa !0
-  %tmp8 = icmp sgt i32 %tmp, 1
-  br i1 %tmp8, label %"21.preheader", label %return
-
-"21.preheader":                                   ; preds = %entry.split
-  %tmp9 = bitcast i8* %tmp7 to double*
-  %tmp10 = add i32 %tmp, 1
-  br label %"21"
-
-"21":                                             ; preds = %"21", %"21.preheader"
-  %tmp11 = phi double [ undef, %"21.preheader" ], [ %tmp16, %"21" ]
-  %indvars.iv = phi i64 [ 2, %"21.preheader" ], [ %indvars.iv.next, %"21" ]
-  %tmp12 = add nsw i64 %indvars.iv, -1
-  %tmp13 = getelementptr inbounds double, double* %tmp9, i64 %tmp12
-  %tmp14 = load double, double* %tmp13, align 8, !tbaa !7
-  %tmp15 = fmul double %tmp14, %tmp14
-  %tmp16 = fadd double %tmp11, %tmp15
-  store double %tmp16, double* %tmp13, align 8, !tbaa !7
-  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
-  %lftr.wideiv1 = trunc i64 %indvars.iv.next to i32
-  %exitcond2 = icmp eq i32 %lftr.wideiv1, %tmp10
-  br i1 %exitcond2, label %return.loopexit, label %"21"
-
-return.loopexit:                                  ; preds = %"21"
-  br label %return
-
-return:                                           ; preds = %return.loopexit, %entry.split
-  ret void
-}
-
-; Function Attrs: noreturn
-declare void @_gfortran_runtime_error(i8*, ...) #1
-
-; Function Attrs: nounwind
-declare noalias i8* @malloc(i64) #2
-
-; Function Attrs: noreturn
-declare void @_gfortran_os_error(i8*) #1
-
-; Function Attrs: noreturn
-declare void @_gfortran_runtime_error_at(i8*, i8*, ...) #1
-
-attributes #0 = { nounwind uwtable }
-attributes #1 = { noreturn }
-attributes #2 = { nounwind }
-
-!0 = !{!1, !1, i64 0}
-!1 = !{!"alias set 4: integer(kind=8)", !2}
-!2 = distinct !{!2}
-!3 = !{!4, !4, i64 0}
-!4 = !{!"alias set 11: integer(kind=4)", !2}
-!5 = !{!6, !6, i64 0}
-!6 = !{!"alias set 3: void*", !2}
-!7 = !{!8, !8, i64 0}
-!8 = !{!"alias set 18: real(kind=8)", !2}
-
-; CHECK: ReadAccess :=	[Reduction Type: NONE] [Fortran array descriptor: __src_soil_MOD_xdzs] [Scalar: 0]
-; CHECK: MustWriteAccess :=	[Reduction Type: NONE] [Fortran array descriptor: __src_soil_MOD_xdzs] [Scalar: 0]

diff  --git a/polly/test/ScopInfo/fortran_array_global_nonmalloc_nonvectored.ll b/polly/test/ScopInfo/fortran_array_global_nonmalloc_nonvectored.ll
deleted file mode 100644
index 9e7e37b49ecb8..0000000000000
--- a/polly/test/ScopInfo/fortran_array_global_nonmalloc_nonvectored.ll
+++ /dev/null
@@ -1,89 +0,0 @@
-; RUN: opt %loadPolly -analyze -S -polly-detect-fortran-arrays \
-; RUN: -polly-process-unprofitable -polly-scops  < %s | FileCheck %s
-
-; MODULE src_soil
-; USE data_parameters, ONLY :   &
-;     wp,        & ! KIND-type parameter for real variables
-;     iintegers    ! KIND-type parameter for standard integer variables
-; IMPLICIT NONE
-; REAL (KIND = wp),     ALLOCATABLE, PRIVATE  :: &
-;   xdzs     (:)
-; CONTAINS
-;
-; SUBROUTINE terra1(n)
-;   INTEGER, intent(in) :: n
-;
-;   INTEGER (KIND=iintegers) ::  &
-;     j
-;
-;    DO j = 22, n
-;         xdzs(j) = xdzs(j) * xdzs(j) + xdzs(j - 1)
-;   END DO
-; END SUBROUTINE terra1
-; END MODULE src_soil
-
-target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
-target triple = "x86_64-unknown-linux-gnu"
-
-module asm "\09.ident\09\22GCC: (GNU) 4.6.4 LLVM: 3.3.1\22"
-
-%"struct.array1_real(kind=8)" = type { i8*, i64, i64, [1 x %struct.descriptor_dimension] }
-%struct.descriptor_dimension = type { i64, i64, i64 }
-
- at __src_soil_MOD_xdzs = unnamed_addr global %"struct.array1_real(kind=8)" zeroinitializer, align 32
-
-; Function Attrs: nounwind uwtable
-define void @__src_soil_MOD_terra1(i32* noalias nocapture %n) unnamed_addr #0 {
-entry:
-  br label %entry.split
-
-entry.split:                                      ; preds = %entry
-  %tmp = load i32, i32* %n, align 4, !tbaa !0
-  %tmp1 = icmp sgt i32 %tmp, 21
-  br i1 %tmp1, label %"3.preheader", label %return
-
-"3.preheader":                                    ; preds = %entry.split
-  %tmp2 = load i64, i64* getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @__src_soil_MOD_xdzs, i64 0, i32 1), align 8, !tbaa !3
-  %tmp3 = load double*, double** bitcast (%"struct.array1_real(kind=8)"* @__src_soil_MOD_xdzs to double**), align 32, !tbaa !5
-  %tmp4 = add i32 %tmp, 1
-  br label %"3"
-
-"3":                                              ; preds = %"3", %"3.preheader"
-  %indvars.iv = phi i64 [ 22, %"3.preheader" ], [ %indvars.iv.next, %"3" ]
-  %tmp5 = add nsw i64 %indvars.iv, %tmp2
-  %tmp6 = getelementptr inbounds double, double* %tmp3, i64 %tmp5
-  %tmp7 = load double, double* %tmp6, align 8, !tbaa !7
-  %tmp8 = fmul double %tmp7, %tmp7
-  %tmp9 = add i64 %tmp2, -1
-  %tmp10 = add i64 %tmp9, %indvars.iv
-  %tmp11 = getelementptr inbounds double, double* %tmp3, i64 %tmp10
-  %tmp12 = load double, double* %tmp11, align 8, !tbaa !7
-  %tmp13 = fadd double %tmp8, %tmp12
-  store double %tmp13, double* %tmp6, align 8, !tbaa !7
-  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
-  %lftr.wideiv1 = trunc i64 %indvars.iv.next to i32
-  %exitcond2 = icmp eq i32 %lftr.wideiv1, %tmp4
-  br i1 %exitcond2, label %return.loopexit, label %"3"
-
-return.loopexit:                                  ; preds = %"3"
-  br label %return
-
-return:                                           ; preds = %return.loopexit, %entry.split
-  ret void
-}
-
-attributes #0 = { nounwind uwtable }
-
-!0 = !{!1, !1, i64 0}
-!1 = !{!"alias set 11: integer(kind=4)", !2}
-!2 = distinct !{!2}
-!3 = !{!4, !4, i64 0}
-!4 = !{!"alias set 4: integer(kind=8)", !2}
-!5 = !{!6, !6, i64 0}
-!6 = !{!"alias set 3: void*", !2}
-!7 = !{!8, !8, i64 0}
-!8 = !{!"alias set 18: real(kind=8)", !2}
-
-; CHECK: ReadAccess :=	[Reduction Type: NONE] [Fortran array descriptor: __src_soil_MOD_xdzs] [Scalar: 0]
-; CHECK: ReadAccess :=	[Reduction Type: NONE] [Fortran array descriptor: __src_soil_MOD_xdzs] [Scalar: 0]
-; CHECK: MustWriteAccess :=	[Reduction Type: NONE] [Fortran array descriptor: __src_soil_MOD_xdzs] [Scalar: 0]

diff  --git a/polly/test/ScopInfo/fortran_array_param_nonmalloc_nonvectored.ll b/polly/test/ScopInfo/fortran_array_param_nonmalloc_nonvectored.ll
deleted file mode 100644
index 6e86bcea0e550..0000000000000
--- a/polly/test/ScopInfo/fortran_array_param_nonmalloc_nonvectored.ll
+++ /dev/null
@@ -1,68 +0,0 @@
-; RUN: opt %loadPolly -analyze -polly-detect-fortran-arrays \
-; RUN: -polly-scops -polly-allow-nonaffine -polly-invariant-load-hoisting < %s | FileCheck %s
-
-; This testcase is the corresponding LLVM for testfunc:
-; PROGRAM main
-;     INTEGER, DIMENSION(1) :: xs
-;
-;     CALL testfunc(xs, 10)
-; CONTAINS
-;     SUBROUTINE func(xs, n)
-;         IMPLICIT NONE
-;         INTEGER, DIMENSION(:), INTENT(INOUT) :: xs
-;         INTEGER, INTENT(IN) :: n
-;         INTEGER :: i
-
-;         DO i = 1, n
-;             xs(i) = 1
-;         END DO
-;
-;     END SUBROUTINE func
-; END PROGRAM
-
-target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
-target triple = "x86_64-unknown-linux-gnu"
-
-module asm "\09.ident\09\22GCC: (GNU) 4.6.4 LLVM: 3.3.1\22"
-
-%"struct.array1_integer(kind=4)" = type { i8*, i64, i64, [1 x %struct.descriptor_dimension] }
-%struct.descriptor_dimension = type { i64, i64, i64 }
-
-define internal void @testfunc(%"struct.array1_integer(kind=4)"* noalias %xs, i32* noalias %n) {
-entry:
-  br label %entry.split
-
-entry.split:                                      ; preds = %entry
-  %tmp = getelementptr inbounds %"struct.array1_integer(kind=4)", %"struct.array1_integer(kind=4)"* %xs, i64 0, i32 3, i64 0, i32 0
-  %tmp1 = load i64, i64* %tmp, align 8
-  %tmp2 = icmp eq i64 %tmp1, 0
-  %tmp3 = select i1 %tmp2, i64 1, i64 %tmp1
-  %tmp4 = bitcast %"struct.array1_integer(kind=4)"* %xs to i32**
-  %tmp5 = load i32*, i32** %tmp4, align 8
-  %tmp6 = load i32, i32* %n, align 4
-  %tmp7 = icmp sgt i32 %tmp6, 0
-  br i1 %tmp7, label %"6.preheader", label %return
-
-"6.preheader":                                    ; preds = %entry.split
-  br label %"6"
-
-"6":                                              ; preds = %"6", %"6.preheader"
-  %tmp8 = phi i32 [ %tmp14, %"6" ], [ 1, %"6.preheader" ]
-  %tmp9 = sext i32 %tmp8 to i64
-  %tmp10 = mul i64 %tmp3, %tmp9
-  %tmp11 = sub i64 %tmp10, %tmp3
-  %tmp12 = getelementptr i32, i32* %tmp5, i64 %tmp11
-  ; store
-  store i32 1, i32* %tmp12, align 4
-  %tmp13 = icmp eq i32 %tmp8, %tmp6
-  %tmp14 = add i32 %tmp8, 1
-  br i1 %tmp13, label %return.loopexit, label %"6"
-
-return.loopexit:                                  ; preds = %"6"
-  br label %return
-
-return:                                           ; preds = %return.loopexit, %entry.split
-  ret void
-}
-
-; CHECK: MustWriteAccess := [Reduction Type: NONE] [Fortran array descriptor: xs] [Scalar: 0]

diff  --git a/polly/test/ScopInfo/fortran_array_param_nonmalloc_nonvectored_read_and_write.ll b/polly/test/ScopInfo/fortran_array_param_nonmalloc_nonvectored_read_and_write.ll
deleted file mode 100644
index 480eb2ed5774e..0000000000000
--- a/polly/test/ScopInfo/fortran_array_param_nonmalloc_nonvectored_read_and_write.ll
+++ /dev/null
@@ -1,93 +0,0 @@
-; RUN: opt %loadPolly -analyze -polly-detect-fortran-arrays \
-; RUN: -polly-scops -polly-allow-nonaffine -polly-ignore-aliasing < %s | FileCheck %s
-
-; PROGRAM main
-; ...
-; CONTAINS
-;     SUBROUTINE copy(xs, ys, n)
-;         IMPLICIT NONE
-;         INTEGER, DIMENSION(:), INTENT(INOUT) :: xs, ys
-;         INTEGER, INTENT(IN) :: n
-;         INTEGER :: i
-; 
-;         DO i = 1, n
-;             ys(i * i) = xs(i * i)
-;         END DO
-; 
-;     END SUBROUTINE copy
-; END PROGRAM
-
-target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
-target triple = "x86_64-unknown-linux-gnu"
-
-module asm "\09.ident\09\22GCC: (GNU) 4.6.4 LLVM: 3.3.1\22"
-
-%"struct.array1_integer(kind=4)" = type { i8*, i64, i64, [1 x %struct.descriptor_dimension] }
-%struct.descriptor_dimension = type { i64, i64, i64 }
-%"struct.array1_integer(kind=4).0" = type { i8*, i64, i64, [1 x %struct.descriptor_dimension] }
-%"struct.array1_integer(kind=4).1" = type { i8*, i64, i64, [1 x %struct.descriptor_dimension] }
-%"struct.array1_integer(kind=4).2" = type { i8*, i64, i64, [1 x %struct.descriptor_dimension] }
-%struct.__st_parameter_dt = type { %struct.__st_parameter_common, i64, i64*, i64*, i8*, i8*, i32, i32, i8*, i8*, i32, i32, i8*, [256 x i8], i32*, i64, i8*, i32, i32, i8*, i8*, i32, i32, i8*, i8*, i32, i32, i8*, i8*, i32, [4 x i8] }
-%struct.__st_parameter_common = type { i32, i32, i8*, i32, i32, i8*, i32* }
-%"struct.array1_integer(kind=4).3" = type { i8*, i64, i64, [1 x %struct.descriptor_dimension] }
-
- at 0 = internal constant i32 10
- at .cst = private constant [12 x i8] c"program.f90\00", align 8
- at options.12.1603 = internal constant [8 x i32] [i32 68, i32 511, i32 0, i32 0, i32 0, i32 1, i32 0, i32 1], align 32
-
-; Function Attrs: nounwind uwtable
-define internal void @copy.1550(%"struct.array1_integer(kind=4)"* noalias %xs, %"struct.array1_integer(kind=4).0"* noalias %ys, i32* noalias %n) {
-entry:
-  br label %entry.split
-
-entry.split:                                      ; preds = %entry
-  %0 = getelementptr inbounds %"struct.array1_integer(kind=4).0", %"struct.array1_integer(kind=4).0"* %ys, i64 0, i32 3, i64 0, i32 0
-  %1 = load i64, i64* %0, align 8
-  %2 = icmp eq i64 %1, 0
-  %3 = select i1 %2, i64 1, i64 %1
-  %4 = bitcast %"struct.array1_integer(kind=4).0"* %ys to i32**
-  %5 = load i32*, i32** %4, align 8
-  %6 = getelementptr inbounds %"struct.array1_integer(kind=4)", %"struct.array1_integer(kind=4)"* %xs, i64 0, i32 3, i64 0, i32 0
-  %7 = load i64, i64* %6, align 8
-  %8 = icmp eq i64 %7, 0
-  %. = select i1 %8, i64 1, i64 %7
-  %9 = bitcast %"struct.array1_integer(kind=4)"* %xs to i32**
-  %10 = load i32*, i32** %9, align 8
-  %11 = load i32, i32* %n, align 4
-  %12 = icmp sgt i32 %11, 0
-  br i1 %12, label %"9.preheader", label %return
-
-"9.preheader":                                    ; preds = %entry.split
-  br label %"9"
-
-"9":                                              ; preds = %"9.preheader", %"9"
-  %13 = phi i32 [ %26, %"9" ], [ 1, %"9.preheader" ]
-  %14 = mul i32 %13, %13
-  %15 = sext i32 %14 to i64
-  %16 = mul i64 %3, %15
-  %17 = sub i64 %16, %3
-  %18 = mul i32 %13, %13
-  %19 = sext i32 %18 to i64
-  %20 = mul i64 %., %19
-  %21 = sub i64 %20, %.
-  %22 = getelementptr i32, i32* %10, i64 %21
-  ; load
-  %23 = load i32, i32* %22, align 4
-  %24 = getelementptr i32, i32* %5, i64 %17
-  ; write
-  store i32 %23, i32* %24, align 4
-  %25 = icmp eq i32 %13, %11
-  %26 = add i32 %13, 1
-  br i1 %25, label %return.loopexit, label %"9"
-
-return.loopexit:                                  ; preds = %"9"
-  br label %return
-
-return:                                           ; preds = %return.loopexit, %entry.split
-  ret void
-}
-
-; CHECK:      ReadAccess :=	[Reduction Type: NONE] [Fortran array descriptor: xs] [Scalar: 0]
-; CHECK-NEXT:     [p_0_loaded_from_n, MemRef0_fortranarr_size, MemRef1_fortranarr_size] -> { Stmt_9[i0] -> MemRef0[o0] };
-; CHECK-NEXT: MayWriteAccess :=	[Reduction Type: NONE] [Fortran array descriptor: ys] [Scalar: 0]
-; CHECK-NEXT:     [p_0_loaded_from_n, MemRef0_fortranarr_size, MemRef1_fortranarr_size] -> { Stmt_9[i0] -> MemRef1[o0] };


        


More information about the llvm-commits mailing list