diff options
| author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-04-20 14:33:23 +0000 |
|---|---|---|
| committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-04-20 14:33:23 +0000 |
| commit | 16331f0aa02a5787d058774237a918d5d7b21680 (patch) | |
| tree | 0bce27ca41d4a6f925c6717e1639c1704c32d96f /llvm | |
| parent | f2c717be82ab8f96d1119022858c7948b3612d26 (diff) | |
| download | bcm5719-llvm-16331f0aa02a5787d058774237a918d5d7b21680.tar.gz bcm5719-llvm-16331f0aa02a5787d058774237a918d5d7b21680.zip | |
[RDF] Consider register as live if any alias is live
This only affects the recomputation of kill flags.
llvm-svn: 266875
Diffstat (limited to 'llvm')
| -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 } |

