diff options
author | Heejin Ahn <aheejin@gmail.com> | 2023-03-14 00:32:43 -0700 |
---|---|---|
committer | Heejin Ahn <aheejin@gmail.com> | 2023-03-17 20:16:16 -0700 |
commit | 6d33affac05a7f30f8b3761a66f81fe63b9f44e1 (patch) | |
tree | 442cce288f566c5489cddb0b97d625650fdb0acd /llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp | |
parent | 4f2401f4f9074548b6de3952a6858aeac2f6950f (diff) | |
download | llvm-6d33affac05a7f30f8b3761a66f81fe63b9f44e1.zip llvm-6d33affac05a7f30f8b3761a66f81fe63b9f44e1.tar.gz llvm-6d33affac05a7f30f8b3761a66f81fe63b9f44e1.tar.bz2 |
[WebAssembly] Add comments on local.tee transformation
We have a good comment on `TEE` transformation in `RegStackify`:
https://github.com/llvm/llvm-project/blob/547e3456660000a16fc5c2a2f819f1a2b5d35b5d/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp#L613-L632
And I think it can be helpful to have some more comments on how the
`TEE`s created in `RegStackify` are converted into `LOCAL_TEE`s.
Variable `OldReg` is changed to `DefReg` to be consistent with
`RegStackify`'s comment.
Reviewed By: tlively
Differential Revision: https://reviews.llvm.org/D146084
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp index 08483b7..84fd34d 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp @@ -267,15 +267,42 @@ bool WebAssemblyExplicitLocals::runOnMachineFunction(MachineFunction &MF) { // Replace tee instructions with local.tee. The difference is that tee // instructions have two defs, while local.tee instructions have one def // and an index of a local to write to. + // + // - Before: + // TeeReg, Reg = TEE DefReg + // INST ..., TeeReg, ... + // INST ..., Reg, ... + // INST ..., Reg, ... + // * DefReg: may or may not be stackified + // * Reg: not stackified + // * TeeReg: stackified + // + // - After (when DefReg was already stackified): + // TeeReg = LOCAL_TEE LocalId1, DefReg + // INST ..., TeeReg, ... + // INST ..., Reg, ... + // INST ..., Reg, ... + // * Reg: mapped to LocalId1 + // * TeeReg: stackified + // + // - After (when DefReg was not already stackified): + // NewReg = LOCAL_GET LocalId1 + // TeeReg = LOCAL_TEE LocalId2, NewReg + // INST ..., TeeReg, ... + // INST ..., Reg, ... + // INST ..., Reg, ... + // * DefReg: mapped to LocalId1 + // * Reg: mapped to LocalId2 + // * TeeReg: stackified if (WebAssembly::isTee(MI.getOpcode())) { assert(MFI.isVRegStackified(MI.getOperand(0).getReg())); assert(!MFI.isVRegStackified(MI.getOperand(1).getReg())); - Register OldReg = MI.getOperand(2).getReg(); - const TargetRegisterClass *RC = MRI.getRegClass(OldReg); + Register DefReg = MI.getOperand(2).getReg(); + const TargetRegisterClass *RC = MRI.getRegClass(DefReg); // Stackify the input if it isn't stackified yet. - if (!MFI.isVRegStackified(OldReg)) { - unsigned LocalId = getLocalId(Reg2Local, MFI, CurLocal, OldReg); + if (!MFI.isVRegStackified(DefReg)) { + unsigned LocalId = getLocalId(Reg2Local, MFI, CurLocal, DefReg); Register NewReg = MRI.createVirtualRegister(RC); unsigned Opc = getLocalGetOpcode(RC); BuildMI(MBB, &MI, MI.getDebugLoc(), TII->get(Opc), NewReg) |