1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02:00

[AArch4][GlobalISel] Post-legalize combine s64 = G_MERGE s32, 0 -> G_ZEXT.

These are generated as a byproduce of legalization.

Differential Revision: https://reviews.llvm.org/D106768
This commit is contained in:
Amara Emerson 2021-07-25 07:32:44 -07:00
parent 2211738092
commit 6a4c66376a
3 changed files with 52 additions and 1 deletions

View File

@ -182,6 +182,13 @@ def form_truncstore : GICombineRule<
(apply [{ applyFormTruncstore(*${root}, MRI, B, Observer, ${matchinfo}); }])
>;
def fold_merge_to_zext : GICombineRule<
(defs root:$d),
(match (wip_match_opcode G_MERGE_VALUES):$d,
[{ return matchFoldMergeToZext(*${d}, MRI); }]),
(apply [{ applyFoldMergeToZext(*${d}, MRI, B, Observer); }])
>;
// Post-legalization combines which should happen at all optimization levels.
// (E.g. ones that facilitate matching for the selector) For example, matching
// pseudos.
@ -204,6 +211,6 @@ def AArch64PostLegalizerCombinerHelper
mul_const, redundant_sext_inreg,
form_bitfield_extract, rotate_out_of_range,
icmp_to_true_false_known_bits, merge_unmerge,
select_combines]> {
select_combines, fold_merge_to_zext]> {
let DisableRuleOption = "aarch64postlegalizercombiner-disable-rule";
}

View File

@ -23,6 +23,7 @@
#include "llvm/CodeGen/GlobalISel/Combiner.h"
#include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
#include "llvm/CodeGen/GlobalISel/CombinerInfo.h"
#include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h"
#include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
@ -240,6 +241,27 @@ bool applyAArch64MulConstCombine(
return true;
}
/// Try to fold a G_MERGE_VALUES of 2 s32 sources, where the second source
/// is a zero, into a G_ZEXT of the first.
bool matchFoldMergeToZext(MachineInstr &MI, MachineRegisterInfo &MRI) {
auto &Merge = cast<GMerge>(MI);
LLT SrcTy = MRI.getType(Merge.getSourceReg(0));
if (SrcTy != LLT::scalar(32) || Merge.getNumSources() != 2)
return false;
return mi_match(Merge.getSourceReg(1), MRI, m_SpecificICst(0));
}
void applyFoldMergeToZext(MachineInstr &MI, MachineRegisterInfo &MRI,
MachineIRBuilder &B, GISelChangeObserver &Observer) {
// Mutate %d(s64) = G_MERGE_VALUES %a(s32), 0(s32)
// ->
// %d(s64) = G_ZEXT %a(s32)
Observer.changingInstr(MI);
MI.setDesc(B.getTII().get(TargetOpcode::G_ZEXT));
MI.RemoveOperand(2);
Observer.changedInstr(MI);
}
#define AARCH64POSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS
#include "AArch64GenPostLegalizeGICombiner.inc"
#undef AARCH64POSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS

View File

@ -68,3 +68,25 @@ body: |
RET_ReallyLR implicit $x0
...
---
name: merge_to_zext
alignment: 4
legalized: true
liveins:
- { reg: '$w0' }
body: |
bb.1.entry:
liveins: $w0
; CHECK-LABEL: name: merge_to_zext
; CHECK: %v:_(s32) = COPY $w0
; CHECK: %merge:_(s64) = G_ZEXT %v(s32)
; CHECK: $x0 = COPY %merge(s64)
; CHECK: RET_ReallyLR implicit $x0
%v:_(s32) = COPY $w0
%zero:_(s32) = G_CONSTANT i32 0
%merge:_(s64) = G_MERGE_VALUES %v, %zero
$x0 = COPY %merge(s64)
RET_ReallyLR implicit $x0
...