https://llvm.org/bugs/show_bug.cgi?id=30480
Bug ID: 30480 Summary: [LoopInterchange] Calls with side effects should prevent loop interchange. Product: libraries Version: trunk Hardware: PC OS: Windows NT Status: NEW Severity: normal Priority: P Component: Loop Optimizer Assignee: unassignedb...@nondot.org Reporter: mcros...@codeaurora.org CC: llvm-bugs@lists.llvm.org Classification: Unclassified Given the below test case: void foo(unsigned a); unsigned A[100][100]; void interchange_w_call() { for (int i = 0; i < 100; ++i) for(int j = 0; j < 100; ++j) { foo(A[j][i]); A[j][i] = i * j; } } The loop interchange pass will interchange this loop. However, the interchange will change the order of the values passed to foo(). If foo() has side effects, I believe this optimization is legal. Compile with debug output: clang loopinterchange.c -S -o /dev/null -O3 -mllvm -enable-loopinterchange -mllvm -debug-only=loop-interchange Calling populateWorklist on Func: interchange_w_call Loop: %for.cond1.preheader Worklist size = 1 Processing LoopList of size = 2 Found 2 Loads and Stores to analyze Found anti dependency between Src and Dst Src: %0 = load i32, i32* %arrayidx6, align 4, !tbaa !1 Dst: store i32 %2, i32* %arrayidx6, align 4, !tbaa !1 Processing Inner Loop Id = 1 and OuterLoopId = 0 Checking if loops are tightly nested Checking instructions in Loop header and Loop latch Loops are perfectly nested Loops are legal to interchange Cost = -1 Calling Split Inner Loop splitInnerLoopLatch done Output of splitInnerLoopHeader InnerLoopHeaderSucc & InnerLoopHeader splitInnerLoopHeader done adjustLoopBranches called Loops interchanged -- You are receiving this mail because: You are on the CC list for the bug.
_______________________________________________ llvm-bugs mailing list llvm-bugs@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs