diff options
| author | Sam Parker <sam.parker@arm.com> | 2018-09-12 09:11:48 +0000 |
|---|---|---|
| committer | Sam Parker <sam.parker@arm.com> | 2018-09-12 09:11:48 +0000 |
| commit | 569b24549edc485e36b4428a486e3e776e2f5a0b (patch) | |
| tree | 0983337edb64754afbaa8ac6092292d50a0d00ba | |
| parent | eaf4fd749bbcea2187b23bd4742702f707907858 (diff) | |
| download | bcm5719-llvm-569b24549edc485e36b4428a486e3e776e2f5a0b.tar.gz bcm5719-llvm-569b24549edc485e36b4428a486e3e776e2f5a0b.zip | |
[ARM] Allow bitcasts in ARMCodeGenPrepare
Allow bitcasts in the use-def chains, treating them as sources.
Differential Revision: https://reviews.llvm.org/D50758
llvm-svn: 342032
| -rw-r--r-- | llvm/lib/Target/ARM/ARMCodeGenPrepare.cpp | 9 | ||||
| -rw-r--r-- | llvm/test/CodeGen/ARM/arm-cgp-casts.ll (renamed from llvm/test/CodeGen/ARM/arm-cgp-zext-truncs.ll) | 44 |
2 files changed, 48 insertions, 5 deletions
diff --git a/llvm/lib/Target/ARM/ARMCodeGenPrepare.cpp b/llvm/lib/Target/ARM/ARMCodeGenPrepare.cpp index f7df39ac385..bc33e65b067 100644 --- a/llvm/lib/Target/ARM/ARMCodeGenPrepare.cpp +++ b/llvm/lib/Target/ARM/ARMCodeGenPrepare.cpp @@ -209,6 +209,8 @@ static bool isSource(Value *V) { return true; else if (isa<LoadInst>(V)) return true; + else if (isa<BitCastInst>(V)) + return true; else if (auto *Call = dyn_cast<CallInst>(V)) return Call->hasRetAttr(Attribute::AttrKind::ZExt); return false; @@ -545,11 +547,8 @@ bool ARMCodeGenPrepare::isSupportedValue(Value *V) { isa<LoadInst>(V)) return isSupportedType(V); - if (auto *Trunc = dyn_cast<TruncInst>(V)) - return isSupportedType(Trunc->getOperand(0)); - - if (auto *ZExt = dyn_cast<ZExtInst>(V)) - return isSupportedType(ZExt->getOperand(0)); + if (isa<CastInst>(V) && !isa<SExtInst>(V)) + return isSupportedType(cast<CastInst>(V)->getOperand(0)); // Special cases for calls as we need to check for zeroext // TODO We should accept calls even if they don't have zeroext, as they can diff --git a/llvm/test/CodeGen/ARM/arm-cgp-zext-truncs.ll b/llvm/test/CodeGen/ARM/arm-cgp-casts.ll index 021b11f4f2d..e742ed7dba2 100644 --- a/llvm/test/CodeGen/ARM/arm-cgp-zext-truncs.ll +++ b/llvm/test/CodeGen/ARM/arm-cgp-casts.ll @@ -288,6 +288,50 @@ cleanup: ret i32 %retval.0 } +; CHECK-COMMON-LABEL: bitcast_i16 +; CHECK-COMMON-NOT: uxt +define i16 @bitcast_i16(i16 zeroext %arg0, i16 zeroext %arg1) { +entry: + %cast = bitcast i16 12345 to i16 + %add = add nuw i16 %arg0, 1 + %cmp = icmp ule i16 %add, %cast + %res = select i1 %cmp, i16 %arg1, i16 32657 + ret i16 %res +} + +; CHECK-COMMON-LABEL: bitcast_i8 +; CHECK-COMMON-NOT: uxt +define i8 @bitcast_i8(i8 zeroext %arg0, i8 zeroext %arg1) { +entry: + %cast = bitcast i8 127 to i8 + %mul = shl nuw i8 %arg0, 1 + %cmp = icmp uge i8 %mul, %arg1 + %res = select i1 %cmp, i8 %cast, i8 128 + ret i8 %res +} + +; CHECK-COMMON-LABEL: bitcast_i16_minus +; CHECK-COMMON-NOT: uxt +define i16 @bitcast_i16_minus(i16 zeroext %arg0, i16 zeroext %arg1) { +entry: + %cast = bitcast i16 -12345 to i16 + %xor = xor i16 %arg0, 7 + %cmp = icmp eq i16 %xor, %arg1 + %res = select i1 %cmp, i16 %cast, i16 32657 + ret i16 %res +} + +; CHECK-COMMON-LABEL: bitcast_i8_minus +; CHECK-COMMON-NOT: uxt +define i8 @bitcast_i8_minus(i8 zeroext %arg0, i8 zeroext %arg1) { +entry: + %cast = bitcast i8 -127 to i8 + %and = and i8 %arg0, 3 + %cmp = icmp ne i8 %and, %arg1 + %res = select i1 %cmp, i8 %cast, i8 128 + ret i8 %res +} + declare %class.x* @_ZNK2ae2afEv(%class.ae*) local_unnamed_addr declare %class.v* @_ZN1x2acEv(%class.x*) local_unnamed_addr declare i32 @dummy(i32, i32) |

