Issue |
149776
|
Summary |
[LoopInterchange] Can only replace phis iff the uses are in the loop nest exit
|
Labels |
new issue
|
Assignees |
|
Reporter |
sjoerdmeijer
|
For the reproducers, see also: https://godbolt.org/z/3W6eMxsMh
For this input:
```
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"
target triple = "aarch64-unknown-linux-gnu"
define void @_Z1fisPi() {
entry:
br label %for.body
for.cond.for.cond.cleanup_crit_edge.split.loopexit:
ret void
for.body:
%.us-phi495254 = phi i16 [ %.sroa.speculated, %for.cond1.for.cond.cleanup2_crit_edge.split ], [ 0, %entry ]
br label %for.body3
for.cond1.for.cond.cleanup2_crit_edge.split:
br i1 false, label %for.body, label %for.cond.for.cond.cleanup_crit_edge.split.loopexit
for.body3:
%m.047 = phi i32 [ 0, %for.body ], [ %add20, %for.cond.cleanup15.split ]
%0 = phi i16 [ %.us-phi495254, %for.body ], [ %.sroa.speculated, %for.cond.cleanup15.split ]
br label %for.body16
for.cond.cleanup15.split:
%.sroa.speculated = tail call i16 @llvm.umax.i16(i16 %0, i16 0)
%add20 = add i32 %m.047, 1
br i1 true, label %for.cond1.for.cond.cleanup2_crit_edge.split, label %for.body3
for.body16:
br i1 false, label %for.body16, label %for.cond.cleanup15.split
; uselistorder directives
uselistorder i16 %.sroa.speculated, { 1, 0 }
}
declare i16 @llvm.umax.i16(i16, i16) #0
attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
```
Compile with:
```
-S -passes=loop-interchange --disable-output -loop-interchange-profitabilities=ignore
```
to run into this assert:
```
opt: /root/llvm-project/llvm/lib/Transforms/Scalar/LoopInterchange.cpp:1711: void moveLCSSAPhis(llvm::BasicBlock*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::Loop*, llvm::LoopInfo*): Assertion `all_of(P.users(), [OuterHeader, OuterExit, IncI, InnerHeader](User *U) { return (cast<PHINode>(U)->getParent() == OuterHeader && IncI->getParent() == InnerHeader) || cast<PHINode>(U)->getParent() == OuterExit; }) && "Can only replace phis iff the uses are in the loop nest exit or " "the incoming value is defined in the inner header (it will " "dominate all loop blocks after interchanging)"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: /opt/compiler-explorer/clang-assertions-trunk/bin/opt -o /app/output.s -S -S -passes=loop-interchange --disable-output -loop-interchange-profitabilities=ignore <source>
1. Running pass "function(loop(loop-interchange))" on module "<source>"
2. Running pass "loop(loop-interchange)" on function "_Z1fisPi"
```
The stack trace:
```
#0 0x0000aaaaae8e9074 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /llvm-project/llvm/lib/Support/Unix/Signals.inc:834:11
#1 0x0000aaaaae8e9594 PrintStackTraceSignalHandler(void*) /llvm-project/llvm/lib/Support/Unix/Signals.inc:918:1
#2 0x0000aaaaae8e7634 llvm::sys::RunSignalHandlers() /llvm-project/llvm/lib/Support/Signals.cpp:104:5
#3 0x0000aaaaae8e9d5c SignalHandler(int, siginfo_t*, void*) /llvm-project/llvm/lib/Support/Unix/Signals.inc:426:38
#4 0x0000fffff7fb09d0 (linux-vdso.so.1+0x9d0)
#5 0x0000fffff7a1f200 __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#6 0x0000fffff79da67c gsignal ./signal/../sysdeps/posix/raise.c:27:6
#7 0x0000fffff79c7130 abort ./stdlib/abort.c:81:7
#8 0x0000fffff79d3fd0 __assert_fail_base ./assert/assert.c:89:7
#9 0x0000fffff79d4040 __assert_perror_fail ./assert/assert-perr.c:31:1
#10 0x0000aaaab0fc0e24 moveLCSSAPhis(llvm::BasicBlock*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::Loop*, llvm::LoopInfo*) /llvm-project/llvm/lib/Transforms/Scalar/LoopInterchange.cpp:1639:5
#11 0x0000aaaab0fc0094 (anonymous namespace)::LoopInterchangeTransform::adjustLoopBranches() /llvm-project/llvm/lib/Transforms/Scalar/LoopInterchange.cpp:1808:3
#12 0x0000aaaab0fbfa70 (anonymous namespace)::LoopInterchangeTransform::adjustLoopLinks() /llvm-project/llvm/lib/Transforms/Scalar/LoopInterchange.cpp:1856:18
#13 0x0000aaaab0fb91f4 (anonymous namespace)::LoopInterchangeTransform::transform() /llvm-project/llvm/lib/Transforms/Scalar/LoopInterchange.cpp:1542:18
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs