diff options
| author | Daniel Sanders <daniel_l_sanders@apple.com> | 2017-11-13 18:30:23 +0000 |
|---|---|---|
| committer | Daniel Sanders <daniel_l_sanders@apple.com> | 2017-11-13 18:30:23 +0000 |
| commit | b78ac6e3220bb8d3124947dc3cec6a3a377b2f67 (patch) | |
| tree | 730ff253c4eb39a335fac1c041215c9660a729ac | |
| parent | f38b40daf7eb0295d1a3541fb1ceb5844702133d (diff) | |
| download | bcm5719-llvm-b78ac6e3220bb8d3124947dc3cec6a3a377b2f67.tar.gz bcm5719-llvm-b78ac6e3220bb8d3124947dc3cec6a3a377b2f67.zip | |
[globalisel][tablegen] Add support for extload.
llvm-svn: 318068
| -rw-r--r-- | llvm/test/CodeGen/AArch64/GlobalISel/select-load.mir | 32 | ||||
| -rw-r--r-- | llvm/utils/TableGen/GlobalISelEmitter.cpp | 18 |
2 files changed, 36 insertions, 14 deletions
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/select-load.mir b/llvm/test/CodeGen/AArch64/GlobalISel/select-load.mir index 04fa74c5562..5c030f931dd 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/select-load.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/select-load.mir @@ -33,6 +33,7 @@ define void @sextload_s32_from_s16(i16 *%addr) { ret void } define void @zextload_s32_from_s16(i16 *%addr) { ret void } + define void @aextload_s32_from_s16(i16 *%addr) { ret void } ... --- @@ -95,8 +96,7 @@ body: | ; CHECK-LABEL: name: load_s16_gpr ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY %x0 ; CHECK: [[LDRHHui:%[0-9]+]]:gpr32 = LDRHHui [[COPY]], 0 :: (load 2 from %ir.addr) - ; CHECK: [[COPY1:%[0-9]+]]:gpr32all = COPY [[LDRHHui]] - ; CHECK: %w0 = COPY [[COPY1]] + ; CHECK: %w0 = COPY [[LDRHHui]] %0(p0) = COPY %x0 %1(s16) = G_LOAD %0 :: (load 2 from %ir.addr) %2:gpr(s32) = G_ANYEXT %1 @@ -119,8 +119,7 @@ body: | ; CHECK-LABEL: name: load_s8_gpr ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY %x0 ; CHECK: [[LDRBBui:%[0-9]+]]:gpr32 = LDRBBui [[COPY]], 0 :: (load 1 from %ir.addr) - ; CHECK: [[COPY1:%[0-9]+]]:gpr32all = COPY [[LDRBBui]] - ; CHECK: %w0 = COPY [[COPY1]] + ; CHECK: %w0 = COPY [[LDRBBui]] %0(p0) = COPY %x0 %1(s8) = G_LOAD %0 :: (load 1 from %ir.addr) %2:gpr(s32) = G_ANYEXT %1 @@ -221,8 +220,7 @@ body: | ; CHECK-LABEL: name: load_gep_64_s16_gpr ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY %x0 ; CHECK: [[LDRHHui:%[0-9]+]]:gpr32 = LDRHHui [[COPY]], 32 :: (load 2 from %ir.addr) - ; CHECK: [[COPY1:%[0-9]+]]:gpr32all = COPY [[LDRHHui]] - ; CHECK: %w0 = COPY [[COPY1]] + ; CHECK: %w0 = COPY [[LDRHHui]] %0(p0) = COPY %x0 %1(s64) = G_CONSTANT i64 64 %2(p0) = G_GEP %0, %1 @@ -249,8 +247,7 @@ body: | ; CHECK-LABEL: name: load_gep_1_s8_gpr ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY %x0 ; CHECK: [[LDRBBui:%[0-9]+]]:gpr32 = LDRBBui [[COPY]], 1 :: (load 1 from %ir.addr) - ; CHECK: [[COPY1:%[0-9]+]]:gpr32all = COPY [[LDRBBui]] - ; CHECK: %w0 = COPY [[COPY1]] + ; CHECK: %w0 = COPY [[LDRBBui]] %0(p0) = COPY %x0 %1(s64) = G_CONSTANT i64 1 %2(p0) = G_GEP %0, %1 @@ -508,3 +505,22 @@ body: | %2:gpr(s32) = G_ZEXT %1 %w0 = COPY %2(s32) ... + +--- +name: aextload_s32_from_s16 +legalized: true +regBankSelected: true + +body: | + bb.0: + liveins: %w0 + + ; CHECK-LABEL: name: aextload_s32_from_s16 + ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY %x0 + ; CHECK: [[T0:%[0-9]+]]:gpr32 = LDRHHui [[COPY]], 0 :: (load 2 from %ir.addr) + ; CHECK: %w0 = COPY [[T0]] + %0:gpr(p0) = COPY %x0 + %1:gpr(s16) = G_LOAD %0 :: (load 2 from %ir.addr) + %2:gpr(s32) = G_ANYEXT %1 + %w0 = COPY %2(s32) +... diff --git a/llvm/utils/TableGen/GlobalISelEmitter.cpp b/llvm/utils/TableGen/GlobalISelEmitter.cpp index 8a0d625ca44..83fa9c582e6 100644 --- a/llvm/utils/TableGen/GlobalISelEmitter.cpp +++ b/llvm/utils/TableGen/GlobalISelEmitter.cpp @@ -3507,11 +3507,12 @@ TreePatternNode *GlobalISelEmitter::fixupPatternNode(TreePatternNode *N) { // must be transformed into: // (sext:[i32] (ld:[i16] [iPTR])<<unindexed>>) // - // Likewise for zeroext-load. + // Likewise for zeroext-load and anyext-load. std::vector<TreePredicateFn> Predicates; bool IsSignExtLoad = false; bool IsZeroExtLoad = false; + bool IsAnyExtLoad = false; Record *MemVT = nullptr; for (const auto &P : N->getPredicateFns()) { if (P.isLoad() && P.isSignExtLoad()) { @@ -3522,6 +3523,10 @@ TreePatternNode *GlobalISelEmitter::fixupPatternNode(TreePatternNode *N) { IsZeroExtLoad = true; continue; } + if (P.isLoad() && P.isAnyExtLoad()) { + IsAnyExtLoad = true; + continue; + } if (P.isLoad() && P.getMemoryVT()) { MemVT = P.getMemoryVT(); continue; @@ -3529,12 +3534,13 @@ TreePatternNode *GlobalISelEmitter::fixupPatternNode(TreePatternNode *N) { Predicates.push_back(P); } - if ((IsSignExtLoad || IsZeroExtLoad) && MemVT) { - assert(((IsSignExtLoad && !IsZeroExtLoad) || - (!IsSignExtLoad && IsZeroExtLoad)) && - "IsSignExtLoad and IsZeroExtLoad are mutually exclusive"); + if ((IsSignExtLoad || IsZeroExtLoad || IsAnyExtLoad) && MemVT) { + assert((IsSignExtLoad + IsZeroExtLoad + IsAnyExtLoad) == 1 && + "IsSignExtLoad, IsZeroExtLoad, IsAnyExtLoad are mutually exclusive"); TreePatternNode *Ext = new TreePatternNode( - RK.getDef(IsSignExtLoad ? "sext" : "zext"), {N}, 1); + RK.getDef(IsSignExtLoad ? "sext" + : IsZeroExtLoad ? "zext" : "anyext"), + {N}, 1); Ext->setType(0, N->getType(0)); N->clearPredicateFns(); N->setPredicateFns(Predicates); |

