[PATCH] D48374: [mips] Sign extend i32 return values on MIPS64
Stefan Maksimovic via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 16 07:33:11 PDT 2018
smaksimovic requested review of this revision.
smaksimovic added inline comments.
================
Comment at: include/llvm/CodeGen/TargetLowering.h:2140
+ /// combined in certain conditions.
+ virtual bool keepSextInRegNode(EVT VT) const {
+ return false;
----------------
efriedma wrote:
> Is this required for correctness? If it is, then the MIPS target is lying to DAGCombine somehow, and this fix is just papering over the bug. Otherwise, I can't see how keeping around a redundant SIGN_EXTEND_INREG would make the generated code more efficient.
The sole purpose of that function, and keeping the SIGN_EXTEND_INREG node alive, is so that it could be later matched with this pattern:
```
def : MipsPat<(i64 (sext_inreg GPR64:$src, i32)),
(SLL64_64 GPR64:$src)>;
```
As an example, SelectionDAG for the or_i32 function which resides in the or.ll test file:
```
t0: ch = EntryToken
t2: i64,ch = CopyFromReg t0, Register:i64 %0
t4: i64 = AssertSext t2, ValueType:ch:i32
t5: i32 = truncate t4
t7: i64,ch = CopyFromReg t0, Register:i64 %1
t8: i64 = AssertSext t7, ValueType:ch:i32
t9: i32 = truncate t8
t10: i32 = or t5, t9
t11: i64 = sign_extend t10
t13: ch,glue = CopyToReg t0, Register:i64 $v0_64, t11
t14: ch = MipsISD::Ret t13, Register:i64 $v0_64, t13:1
```
gets eventually transformed to this (including the sign_extend_inreg node incorporated by this patch):
```
t0: ch = EntryToken
t2: i64,ch = CopyFromReg t0, Register:i64 %0
t4: i64 = AssertSext t2, ValueType:ch:i32
t7: i64,ch = CopyFromReg t0, Register:i64 %1
t8: i64 = AssertSext t7, ValueType:ch:i32
t15: i64 = or t4, t8
t17: i64 = sign_extend_inreg t15, ValueType:ch:i32
t13: ch,glue = CopyToReg t0, Register:i64 $v0_64, t17
t14: ch = MipsISD::Ret t13, Register:i64 $v0_64, t13:1
```
In place of sign_extend_inreg node would be the sign_extend node, which would be removed the same way the sign_extend_inreg would.
Hence the keepSextInRegNode function to keep it until it can be pattern matched and replaced with the target dependent machine node.
I completely agree that its existence is indeed questionable, looking at the code above by itself.
However I have not found a better way to go about this change.
https://reviews.llvm.org/D48374
More information about the llvm-commits
mailing list