summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AArch64/AArch64FastISel.cpp
diff options
context:
space:
mode:
authorJuergen Ributzka <juergen@apple.com>2014-08-20 16:34:15 +0000
committerJuergen Ributzka <juergen@apple.com>2014-08-20 16:34:15 +0000
commite1bb055ed393eac50ef19541d240d4cee46b06fa (patch)
tree8694f8968d31159452e8622154687aafa07259a2 /llvm/lib/Target/AArch64/AArch64FastISel.cpp
parent208faaaa290319b7eecab112e7922f88097c3ebe (diff)
downloadbcm5719-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.cpp27
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);
}
OpenPOWER on IntegriCloud