diff options
-rw-r--r-- | llvm/lib/Target/Hexagon/RDFLiveness.cpp | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/Hexagon/rdf-reset-kills.ll | 28 |
2 files changed, 30 insertions, 2 deletions
diff --git a/llvm/lib/Target/Hexagon/RDFLiveness.cpp b/llvm/lib/Target/Hexagon/RDFLiveness.cpp index 1d9bd372ff4..102388762a4 100644 --- a/llvm/lib/Target/Hexagon/RDFLiveness.cpp +++ b/llvm/lib/Target/Hexagon/RDFLiveness.cpp @@ -616,8 +616,8 @@ void Liveness::resetKills(MachineBasicBlock *B) { if (!TargetRegisterInfo::isPhysicalRegister(R)) continue; bool IsLive = false; - for (MCSubRegIterator SR(R, &TRI, true); SR.isValid(); ++SR) { - if (!Live[*SR]) + for (MCRegAliasIterator AR(R, &TRI, true); AR.isValid(); ++AR) { + if (!Live[*AR]) continue; IsLive = true; break; diff --git a/llvm/test/CodeGen/Hexagon/rdf-reset-kills.ll b/llvm/test/CodeGen/Hexagon/rdf-reset-kills.ll new file mode 100644 index 00000000000..37db8c5f64e --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/rdf-reset-kills.ll @@ -0,0 +1,28 @@ +; RUN: llc -march=hexagon < %s +; REQUIRES: asserts + +; This test used to crash in register scavenger due to incorrectly set +; kill flags. + +target triple = "hexagon" + +define void @foo(i64 %a) #0 { +entry: + %conv.i = and i64 %a, 9218868437227405312 + %cmp = icmp ne i64 %conv.i, 9218868437227405312 + %and.i37 = and i64 %a, 4503599627370495 + %tobool = icmp eq i64 %and.i37, 0 + %or.cond = or i1 %cmp, %tobool + br i1 %or.cond, label %lor.lhs.false, label %if.then + +lor.lhs.false: ; preds = %entry + br i1 undef, label %return, label %if.then + +if.then: ; preds = %lor.lhs.false, %entry + br label %return + +return: ; preds = %if.then, %lor.lhs.false + ret void +} + +attributes #0 = { norecurse nounwind } |