diff options
author | Juergen Ributzka <juergen@apple.com> | 2014-08-20 16:34:15 +0000 |
---|---|---|
committer | Juergen Ributzka <juergen@apple.com> | 2014-08-20 16:34:15 +0000 |
commit | e1bb055ed393eac50ef19541d240d4cee46b06fa (patch) | |
tree | 8694f8968d31159452e8622154687aafa07259a2 /llvm/lib/Target/AArch64/AArch64FastISel.cpp | |
parent | 208faaaa290319b7eecab112e7922f88097c3ebe (diff) | |
download | bcm5719-llvm-e1bb055ed393eac50ef19541d240d4cee46b06fa.tar.gz bcm5719-llvm-e1bb055ed393eac50ef19541d240d4cee46b06fa.zip |
[FastISel][AArch64] Don't fold the sign-/zero-extend from i1 into the compare.
This fixes a bug I introduced in a previous commit (r216033). Sign-/Zero-
extension from i1 cannot be folded into the ADDS/SUBS instructions. Instead both
operands have to be sign-/zero-extended with separate instructions.
Related to <rdar://problem/17913111>.
llvm-svn: 216073
Diffstat (limited to 'llvm/lib/Target/AArch64/AArch64FastISel.cpp')
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64FastISel.cpp | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64FastISel.cpp b/llvm/lib/Target/AArch64/AArch64FastISel.cpp index 7320bb89dc4..1bc5e424eac 100644 --- a/llvm/lib/Target/AArch64/AArch64FastISel.cpp +++ b/llvm/lib/Target/AArch64/AArch64FastISel.cpp @@ -773,19 +773,27 @@ unsigned AArch64FastISel::emitAddsSubs(bool UseAdds, MVT RetVT, const Value *LHS, const Value *RHS, bool IsZExt, bool WantResult) { AArch64_AM::ShiftExtendType ExtendType = AArch64_AM::InvalidShiftExtend; - MVT SrcVT = RetVT; + bool NeedExtend = false; switch (RetVT.SimpleTy) { - default: return 0; + default: + return 0; case MVT::i1: + NeedExtend = true; + break; case MVT::i8: - ExtendType = IsZExt ? AArch64_AM::UXTB : AArch64_AM::SXTB; RetVT = MVT::i32; + NeedExtend = true; + ExtendType = IsZExt ? AArch64_AM::UXTB : AArch64_AM::SXTB; break; case MVT::i16: - ExtendType = IsZExt ? AArch64_AM::UXTH : AArch64_AM::SXTH; RetVT = MVT::i32; + NeedExtend = true; + ExtendType = IsZExt ? AArch64_AM::UXTH : AArch64_AM::SXTH; + break; + case MVT::i32: // fall-through + case MVT::i64: break; - case MVT::i32: break; - case MVT::i64: break; } + MVT SrcVT = RetVT; + RetVT.SimpleTy = std::max(RetVT.SimpleTy, MVT::i32); // Canonicalize immediates to the RHS first. if (UseAdds && isa<ConstantInt>(LHS) && !isa<ConstantInt>(RHS)) @@ -805,7 +813,7 @@ unsigned AArch64FastISel::emitAddsSubs(bool UseAdds, MVT RetVT, return 0; bool LHSIsKill = hasTrivialKill(LHS); - if (ExtendType != AArch64_AM::InvalidShiftExtend) + if (NeedExtend) LHSReg = EmitIntExt(SrcVT, LHSReg, RetVT, IsZExt); unsigned ResultReg = 0; @@ -821,6 +829,7 @@ unsigned AArch64FastISel::emitAddsSubs(bool UseAdds, MVT RetVT, if (ResultReg) return ResultReg; + // Only extend the RHS within the instruction if there is a valid extend type. if (ExtendType != AArch64_AM::InvalidShiftExtend) { if (const auto *SI = dyn_cast<BinaryOperator>(RHS)) if (const auto *C = dyn_cast<ConstantInt>(SI->getOperand(1))) @@ -867,6 +876,10 @@ unsigned AArch64FastISel::emitAddsSubs(bool UseAdds, MVT RetVT, if (!RHSReg) return 0; bool RHSIsKill = hasTrivialKill(RHS); + + if (NeedExtend) + RHSReg = EmitIntExt(SrcVT, RHSReg, RetVT, IsZExt); + return emitAddsSubs_rr(UseAdds, RetVT, LHSReg, LHSIsKill, RHSReg, RHSIsKill, WantResult); } |