summaryrefslogtreecommitdiffstats
path: root/polly/test/Isl/CodeGen/non-affine-phi-node-expansion-3.ll
Commit message (Collapse)AuthorAgeFilesLines
* Unique phi write accessesMichael Kruse2016-01-261-3/+3
| | | | | | | | | | | | | | | | | | | Ensure that there is at most one phi write access per PHINode and ScopStmt. In particular, this would be possible for non-affine subregions with multiple exiting blocks. We replace multiple MAY_WRITE accesses by one MUST_WRITE access. The written value is constructed using a PHINode of all exiting blocks. The interpretation of the PHI WRITE's "accessed value" changed from the incoming value to the PHI like for PHI READs since there is no unique incoming value. Because region simplification shuffles around PHI nodes -- particularly with exit node PHIs -- the PHINodes at analysis time does not always exist anymore in the code generation pass. We instead remember the incoming block/value pair in the MemoryAccess. Differential Revision: http://reviews.llvm.org/D15681 llvm-svn: 258809
* RegionGenerator: Only introduce subregion.ivs for loops fully within a subregionTobias Grosser2015-11-121-2/+0
| | | | | | | | | | | | | | | IVs of loops for which the loop header is in the subregion, but not the entire loop may be incremented outside of the subregion and can consequently not be kept private to the subregion. Instead, they need to and are modeled as virtual loops in the iteration domains. As this is the case, generating new subregion induction variables for such loops is not needed and indeed wrong as they would hide the virtual induction variables modeled in the scop. This fixes a miscompile in MultiSource/Benchmarks/Ptrdist/bc and MultiSource/Benchmarks/nbench/. Thanks Michael and Johannes for their investiagations and helpful observations regarding this bug. llvm-svn: 252860
* Load/Store scalar accesses before/after the statement itselfMichael Kruse2015-10-171-1/+1
| | | | | | | | | | | | | | | | | | | | | Instead of generating implicit loads within basic blocks, put them before the instructions of the statment itself, including non-affine subregions. The region's entry node is dominating all blocks in the region and therefore the loaded value will be available there. Implicit writes in block-stmts were already stored back at the end of the block. Now, also generate the stores of non-affine subregions when leaving the statement, i.e. in the exiting block. This change is required for array-mapped implicits ("De-LICM") to ensure that there are no dependencies of demoted scalars within statments. Statement load all required values, operator on copied in registers, and then write back the changed value to the demoted memory. Lifetimes analysis within statements becomes unecessary. Differential Revision: http://reviews.llvm.org/D13487 llvm-svn: 250625
* test: Correctly check for branch statementsTobias Grosser2015-10-151-0/+4
| | | | | | | | | | | | | In r250408 'CHECK-NEXT: br' lines were removed as they also matched a '%polly.subregion.iv.inc' instruction and did consequently not check what they were supposed to check. However, without these lines we can not test that the .s2a instructions that are not any more generated since r250411 really are not emitted. Hence, we add back the CHECK-NEXT lines to ensure there are really no instructions generated between the store that we check for and the branch at the end of the basic block. To ensure we do not match too early, we now check for 'br i1' or 'br label'. llvm-svn: 250435
* Do not add accesses for intra-ScopStmt scalar def-use chainsMichael Kruse2015-10-151-6/+0
| | | | | | | | | | | | When pulling a llvm::Value to be written as a PHI write, the former code did only check whether it is within the same basic block, but it could also be the same non-affine subregion. In that case some unecessary pair of MemoryAccesses would have been created. Two unit test were explicitely checking for the unecessary writes, including the comments that the writes are unecessary. llvm-svn: 250411
* Remove "CHECK: br" from some unit testsMichael Kruse2015-10-151-3/+0
| | | | | | | | | They happen to match %polly.subregion.iv.inc = add i32 %polly.subregion.iv, 1 ^^ ^^ that is, are misleading in what they actually check. llvm-svn: 250408
* [tests] More testing for PHI-nodes in non-affine regionsTobias Grosser2015-10-131-0/+3
| | | | | | | | | | | | | We harden one test case by ensuring no additional stores may possibly be introduced between the stores we check for and the basic block terminator statements. We also add a test case for the situation where a value that is passed from a non-affine region to a PHI node does not dominate the exit of the non-affine region. This case has come up in patch reviews, so we make sure it is properly handled today and in the future. llvm-svn: 250217
* tests: Drop -polly-detect-unprofitable and -polly-no-early-exitTobias Grosser2015-10-061-2/+2
| | | | | | | | These flags are now always passed to all tests and need to be disabled if not needed. Disabling these flags, rather than passing them to almost all tests, significantly simplfies our RUN: lines. llvm-svn: 249422
* Reapply "BlockGenerator: Generate synthesisable instructions only on-demand"Tobias Grosser2015-09-301-0/+1
| | | | | | | | | | | | | | | Instructions which we can synthesis from a SCEV expression are not generated directly, but only when they are used as an operand of another instruction. This avoids generating unnecessary instructions and works more reliably than first inserting them and then deleting them later on. This commit was reverted in r248860 due to a remaining miscompile, where we forgot to synthesis the operand values that were referenced from scalar writes. test/Isl/CodeGen/scalar-store-from-same-bb.ll tests that we do this now correctly. llvm-svn: 248900
* Revert "BlockGenerator: Generate synthesisable instructions only on-demand"Johannes Doerfert2015-09-291-1/+0
| | | | | | | | | | | | This reverts commit 07830c18d789ee72812d5b5b9b4f8ce72ebd4207. The commit broke at least one test in lnt, MultiSource/Benchmarks/Ptrdist/bc/number.c was miss compiled and the test produced a wrong result. One Polly test case that was added later was adjusted too. llvm-svn: 248860
* BlockGenerator: Generate synthesisable instructions only on-demandTobias Grosser2015-09-281-0/+1
| | | | | | | | | | | | | Instructions which we can synthesis from a SCEV expression are not generated directly, but only when they are used as an operand of another instruction. This avoids generating unnecessary instruction and works more reliably than first inserting them and then deleting them later on. Suggested-by: Johannes Doerfert <doerfert@cs.uni-saarland.de> Differential Revision: http://reviews.llvm.org/D13208 llvm-svn: 248712
* BlockGenerator: Be less agressive with deleting dead instructionsTobias Grosser2015-09-271-5/+8
| | | | | | | | | | | | | | We now only delete trivially dead instructions in the BB we copy (copyBB), but not in any other BB. Only for copyBB we know that there will _never_ be any future uses of instructions that have no use after copyBB has been generated. Other instructions in the AST that have been generated by IslNodeBuilder may look dead at the moment, but may possibly still be referenced by GlobalMaps. If we delete them now, later uses would break surprisingly. We do not have a test case that breaks due to us deleting too many instructions. This issue was found by inspection. llvm-svn: 248688
* BlockGenerator: Simplify code generated for region statementsTobias Grosser2015-09-271-9/+5
| | | | | | | | | | | | After having generated a new user statement a couple of inefficient or trivially dead instructions may remain. This commit runs instruction simplification over the newly generated blocks to ensure unneeded instructions are removed right away. This commit does adds simplification for non-affine subregions which was not yet part of 248681. llvm-svn: 248683
* Always use the branch instructions to model the PHI-node writesTobias Grosser2015-08-311-0/+49
Before this commit we did this only for Arguments or Constants, but indeed an instruction may define a value a lot higher up in the dominance tree, but the actual write generally needs to happen right before branching to the PHI node. Otherwise, the writes of different branches into PHI nodes may get intermixed if they lay higher up in the dominance tree. llvm-svn: 246441
OpenPOWER on IntegriCloud