mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[GlobalISel] Look through extends etc in CombinerHelper::matchConstantOp
It's possible to end up with a zext or something in the way of a G_CONSTANT, even pre-legalization. This can happen with memsets. e.g. https://godbolt.org/z/Bjc8cw To make sure we can catch these cases, use `getConstantVRegValWithLookThrough` instead of `mi_match`. Differential Revision: https://reviews.llvm.org/D81875
This commit is contained in:
parent
cec0aa2b18
commit
ff5c742e1e
@ -1617,8 +1617,9 @@ bool CombinerHelper::matchEqualDefs(const MachineOperand &MOP1,
|
||||
bool CombinerHelper::matchConstantOp(const MachineOperand &MOP, int64_t C) {
|
||||
if (!MOP.isReg())
|
||||
return false;
|
||||
int64_t Cst;
|
||||
return mi_match(MOP.getReg(), MRI, m_ICst(Cst)) && Cst == C;
|
||||
// MIPatternMatch doesn't let us look through G_ZEXT etc.
|
||||
auto ValAndVReg = getConstantVRegValWithLookThrough(MOP.getReg(), MRI);
|
||||
return ValAndVReg && ValAndVReg->Value == C;
|
||||
}
|
||||
|
||||
bool CombinerHelper::replaceSingleDefInstWithOperand(MachineInstr &MI,
|
||||
|
@ -286,4 +286,24 @@ body: |
|
||||
%op:_(s32) = G_SUB %x(s32), %cst
|
||||
$w0 = COPY %op(s32)
|
||||
RET_ReallyLR implicit $w0
|
||||
|
||||
...
|
||||
---
|
||||
name: look_through_zext
|
||||
tracksRegLiveness: true
|
||||
body: |
|
||||
bb.0:
|
||||
liveins: $x0
|
||||
; CHECK-LABEL: name: look_through_zext
|
||||
; CHECK: liveins: $x0
|
||||
; CHECK: %zero:_(s8) = G_CONSTANT i8 0
|
||||
; CHECK: %zext_zero:_(s64) = G_ZEXT %zero(s8)
|
||||
; CHECK: $x0 = COPY %zext_zero(s64)
|
||||
; CHECK: RET_ReallyLR implicit $x0
|
||||
%zero:_(s8) = G_CONSTANT i8 0
|
||||
%zext_zero:_(s64) = G_ZEXT %zero(s8)
|
||||
%c:_(s64) = G_CONSTANT i64 72340172838076673
|
||||
%mul:_(s64) = G_MUL %c, %zext_zero
|
||||
$x0 = COPY %mul(s64)
|
||||
RET_ReallyLR implicit $x0
|
||||
...
|
||||
|
Loading…
x
Reference in New Issue
Block a user