RESOLVED FIXED227510
Add a new Air::Arg kind ZeroReg to let AIR recognise the new instructions/forms accepting zero register in ARM64
https://bugs.webkit.org/show_bug.cgi?id=227510
Summary Add a new Air::Arg kind ZeroReg to let AIR recognise the new instructions/for...
Yijia Huang
Reported 2021-06-29 15:21:07 PDT
...
Attachments
Patch (16.69 KB, patch)
2021-07-08 15:39 PDT, Yijia Huang
ews-feeder: commit-queue-
Patch (16.68 KB, patch)
2021-07-08 15:56 PDT, Yijia Huang
ews-feeder: commit-queue-
Patch (16.72 KB, patch)
2021-07-08 16:12 PDT, Yijia Huang
no flags
Patch (16.23 KB, patch)
2021-07-08 17:59 PDT, Yijia Huang
no flags
Patch (16.50 KB, patch)
2021-07-08 19:48 PDT, Yijia Huang
no flags
Patch (16.50 KB, patch)
2021-07-08 20:21 PDT, Yijia Huang
no flags
Patch (16.50 KB, patch)
2021-07-09 11:07 PDT, Yijia Huang
no flags
Patch (19.23 KB, patch)
2021-07-11 17:05 PDT, Yijia Huang
no flags
Patch (20.84 KB, patch)
2021-07-11 19:00 PDT, Yijia Huang
no flags
Patch (22.08 KB, patch)
2021-07-11 20:54 PDT, Yijia Huang
no flags
Patch (20.64 KB, patch)
2021-07-12 12:18 PDT, Yijia Huang
no flags
Patch (19.29 KB, patch)
2021-07-12 21:57 PDT, Yijia Huang
no flags
Patch (20.97 KB, patch)
2021-07-13 00:00 PDT, Yijia Huang
no flags
Patch (20.35 KB, patch)
2021-07-13 10:27 PDT, Yijia Huang
ews-feeder: commit-queue-
Patch (20.37 KB, patch)
2021-07-13 10:37 PDT, Yijia Huang
ews-feeder: commit-queue-
Patch (20.49 KB, patch)
2021-07-13 10:51 PDT, Yijia Huang
ews-feeder: commit-queue-
Patch (20.51 KB, patch)
2021-07-13 11:01 PDT, Yijia Huang
ews-feeder: commit-queue-
Patch (20.52 KB, patch)
2021-07-13 11:08 PDT, Yijia Huang
ews-feeder: commit-queue-
Patch (20.53 KB, patch)
2021-07-13 11:18 PDT, Yijia Huang
no flags
Patch (20.52 KB, patch)
2021-07-13 12:27 PDT, Yijia Huang
no flags
Radar WebKit Bug Importer
Comment 1 2021-07-06 15:22:15 PDT
Yijia Huang
Comment 2 2021-07-08 15:39:12 PDT
Yijia Huang
Comment 3 2021-07-08 15:56:36 PDT
Yijia Huang
Comment 4 2021-07-08 16:12:28 PDT
Yijia Huang
Comment 5 2021-07-08 17:59:13 PDT
Yijia Huang
Comment 6 2021-07-08 19:48:07 PDT
Yijia Huang
Comment 7 2021-07-08 20:21:37 PDT
Robin Morisset
Comment 8 2021-07-09 10:08:19 PDT
Comment on attachment 433195 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=433195&action=review > Source/JavaScriptCore/b3/B3LowerToAir.cpp:-1102 > - if (isValidForm(StoreZero32, dest.kind()) && dest.isValidForm(Width32)) Grepping for StoreZero32 and StoreZero64, I still see a lot of them in the code. I think they should get removed and replaced by Store32/64 of Arg::ImmZero everywhere, rather than supporting both until the end of time. > Source/JavaScriptCore/b3/air/AirArg.h:1057 > + case ImmZero: What is the reason for returning false here? Naively I would have expected this to return true since it can be used for integers.
Saam Barati
Comment 9 2021-07-09 10:34:53 PDT
Comment on attachment 433195 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=433195&action=review >> Source/JavaScriptCore/b3/air/AirArg.h:1057 >> + case ImmZero: > > What is the reason for returning false here? Naively I would have expected this to return true since it can be used for integers. Yeah, this should return true I believe > Source/JavaScriptCore/b3/air/opcode_generator.rb:480 > + parseError("Form has an zero register for a non-use argument") nit: I'd use "zero immediate" instead of "zero register" here for consistency. Maybe "Zero immediate must be a use" > Source/JavaScriptCore/b3/air/opcode_generator.rb:483 > + parseError("Form has an zero register for a non-general-purpose argument") ditto, maybe: "Zero immediate must be a general-purpose argument"
Yijia Huang
Comment 10 2021-07-09 10:48:24 PDT
(In reply to Robin Morisset from comment #8) > Comment on attachment 433195 [details] > Patch > > View in context: > https://bugs.webkit.org/attachment.cgi?id=433195&action=review > > > Source/JavaScriptCore/b3/B3LowerToAir.cpp:-1102 > > - if (isValidForm(StoreZero32, dest.kind()) && dest.isValidForm(Width32)) > > Grepping for StoreZero32 and StoreZero64, I still see a lot of them in the > code. > I think they should get removed and replaced by Store32/64 of Arg::ImmZero > everywhere, rather than supporting both until the end of time. Thanks for the review. A previous bug report (https://bugs.webkit.org/show_bug.cgi?id=174821) already pointed out the problem that StoreZero is a temporary hack. I intend to remove all StoreZero references in this patch. > > Source/JavaScriptCore/b3/air/AirArg.h:1057 > > + case ImmZero: > > What is the reason for returning false here? Naively I would have expected > this to return true since it can be used for integers. Will fix.
Yijia Huang
Comment 11 2021-07-09 10:49:14 PDT
(In reply to Saam Barati from comment #9) > Comment on attachment 433195 [details] > Patch > > View in context: > https://bugs.webkit.org/attachment.cgi?id=433195&action=review > > >> Source/JavaScriptCore/b3/air/AirArg.h:1057 > >> + case ImmZero: > > > > What is the reason for returning false here? Naively I would have expected this to return true since it can be used for integers. > > Yeah, this should return true I believe > > > Source/JavaScriptCore/b3/air/opcode_generator.rb:480 > > + parseError("Form has an zero register for a non-use argument") > > nit: I'd use "zero immediate" instead of "zero register" here for > consistency. > > Maybe "Zero immediate must be a use" > > > Source/JavaScriptCore/b3/air/opcode_generator.rb:483 > > + parseError("Form has an zero register for a non-general-purpose argument") > > ditto, maybe: > "Zero immediate must be a general-purpose argument" Thanks. Will fix.
Yijia Huang
Comment 12 2021-07-09 11:07:45 PDT
Saam Barati
Comment 13 2021-07-09 13:19:12 PDT
Comment on attachment 433227 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=433227&action=review > Source/JavaScriptCore/ChangeLog:8 > + Add a new operand ImmZero to Air::Arg. So it can be recognized as the zero registers in ARM64 "zero registers" => "zero register" > Source/JavaScriptCore/ChangeLog:9 > + Air opcode. In this case, the new overloads of the instructions accepting zero registers can ditto > Source/JavaScriptCore/ChangeLog:11 > + I'd also add some discussion here about how you're modeling it. e.g, modeling it like a special kind of "Imm", the "ZeroImm" > Source/JavaScriptCore/b3/air/AirArg.h:91 > + // ImmZero is recognized as a zero register for ARM64 > + ImmZero Nit, maybe "ZeroImm" for consistency with the other names, and I also think it reads a bit nicer. > Source/JavaScriptCore/b3/air/AirOpcode.opcodes:681 > +arm64: Store32 U:G:32, D:G:32 > + ImmZero, Addr > + ImmZero, Index > + > +arm64: Store64 U:G:64, D:G:64 > + ImmZero, Addr > + ImmZero, Index Were you going to remove the other instruction? > Source/JavaScriptCore/b3/air/opcode_generator.rb:937 > + when "ImmZero" Why this here? When is this ruby code run? Why do we never do things for IsValidForm for ImmZero? > Source/JavaScriptCore/b3/testb3_2.cpp:1307 > +void testMulNegArgArg(int a, int b) why is this in this patch?
Yijia Huang
Comment 14 2021-07-11 17:05:55 PDT
Yijia Huang
Comment 15 2021-07-11 19:00:58 PDT
Yijia Huang
Comment 16 2021-07-11 20:54:19 PDT
Saam Barati
Comment 17 2021-07-12 11:19:22 PDT
Comment on attachment 433298 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=433298&action=review > Source/JavaScriptCore/ChangeLog:9 > + to different CPUs, the compiler must make instruction set details explicit eventually.  remove unicode character at the end > Source/JavaScriptCore/ChangeLog:10 > + Then, Air is introduced, and it has syntax to speak of all of the CPU instructions we I think here I'd just say: "Air is designed to target individual CPU architectures and generate instructions specific to those CPUs" or similar. > Source/JavaScriptCore/ChangeLog:11 > + know about.  remove unicode character at the end > Source/JavaScriptCore/ChangeLog:13 > + Previously, B3 and Air don't recognize the ZR register. This problem has been pointed out don't => didn't "ZR register" => "zero register" > Source/JavaScriptCore/ChangeLog:18 > + should be introduced. Its goal is to closely match the CPU instructions accepting a zero immediate "should be introduced" => "is introduced by this patch" > Source/JavaScriptCore/ChangeLog:19 > + or the zero register in X86 and ARM64. Another reason is that with this implementation, the new I don't think we're using the zero immediate for x86, right? I'd say this is for arm64 > Source/JavaScriptCore/ChangeLog:22 > + Here, the ZeroImm is added as a new kind for Air::Arg, which acts as a âhigh levelâ operand more unicode characters here > Source/JavaScriptCore/b3/B3LowerToAir.cpp:1108 > + if (isValidForm(Store32, Arg::ZeroImm, dest.kind()) && dest.isValidForm(Width32)) > + return Inst(Store32, m_value, zeroImm(), dest); This code is already conditionalized under "isARM64" above. I'd just make these instruction variants arm64 only inside AirOpcodes.opcodes > Source/JavaScriptCore/b3/air/AirArg.h:67 > + // ZeroImm is interpreted as a zero register in ARM64 and TrustedImm32(0) in X86 and X86_64 I would not make this a thing on x86. I'd just treat this as modeling how arm64 does things > Source/JavaScriptCore/b3/air/AirArg.h:91 > + remove > Source/JavaScriptCore/b3/air/AirArg.h:760 > + case ZeroImm: this is starting to feel a bit weird to me, and perhaps where the naming is leading us to do weird things. I think I'd just call this the ZeroRegister. > Source/JavaScriptCore/b3/air/AirArg.h:1264 > + case ZeroImm: > + return isValidZeroImmForm(value()); I think this should just be return true, value() doesn't mean anything for ZeroImm. > Source/JavaScriptCore/b3/air/AirArg.h:1369 > +#elif CPU(X86_64) || CPU(X86) > + MacroAssembler::TrustedImm32 asZeroImm() const > + { > + return MacroAssembler::TrustedImm32(0); > + } ditto, I'd just assert at runtime we're arm64, and not have a concept of x86 here. > Source/JavaScriptCore/b3/air/AirOpcode.opcodes:672 > +Store32 U:G:32, ZD:G:32 > + ZeroImm, Addr > + ZeroImm, Index > > -64: StoreZero64 D:G:64 > - Addr > - Index > +64: Store64 U:G:64, D:G:64 > + ZeroImm, Addr > + ZeroImm, Index I'd make these arm64 only
Yijia Huang
Comment 18 2021-07-12 12:18:57 PDT
Saam Barati
Comment 19 2021-07-12 20:40:59 PDT
Comment on attachment 433339 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=433339&action=review Seems like you introduced a lot of test failures. > Source/JavaScriptCore/b3/air/AirArg.h:760 > + case ZeroReg: should be false > Source/JavaScriptCore/b3/air/AirLowerStackArgs.cpp:160 > + RELEASE_ASSERT(isValidForm(Store32, Arg::ZeroReg, Arg::Stack)); was this run on x86 before? If so, gotta keep something around for x86. If so, could keep around StoreZero for x86.
Yijia Huang
Comment 20 2021-07-12 21:34:13 PDT
Comment on attachment 433339 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=433339&action=review >> Source/JavaScriptCore/b3/air/AirLowerStackArgs.cpp:160 >> + RELEASE_ASSERT(isValidForm(Store32, Arg::ZeroReg, Arg::Stack)); > > was this run on x86 before? If so, gotta keep something around for x86. > > If so, could keep around StoreZero for x86. No.
Yijia Huang
Comment 21 2021-07-12 21:57:36 PDT
Yijia Huang
Comment 22 2021-07-13 00:00:34 PDT
Yijia Huang
Comment 23 2021-07-13 10:27:34 PDT
Yijia Huang
Comment 24 2021-07-13 10:37:27 PDT
Yijia Huang
Comment 25 2021-07-13 10:51:30 PDT
Yijia Huang
Comment 26 2021-07-13 11:01:40 PDT
Yijia Huang
Comment 27 2021-07-13 11:08:50 PDT
Yijia Huang
Comment 28 2021-07-13 11:18:31 PDT
Saam Barati
Comment 29 2021-07-13 12:17:27 PDT
Comment on attachment 433427 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=433427&action=review r=me > Source/JavaScriptCore/ChangeLog:13 > + Previously, B3 and Air don't recognize the zero register. This problem has been pointed "B3 and Air" => "Air" > Source/JavaScriptCore/b3/air/AirLowerStackArgs.cpp:164 > +#elif CPU(X86_64) || CPU(X86) I think you can just have CPU(X86_64) here
Yijia Huang
Comment 30 2021-07-13 12:27:01 PDT
EWS
Comment 31 2021-07-13 13:38:27 PDT
Committed r279889 (239640@main): <https://commits.webkit.org/239640@main> All reviewed patches have been landed. Closing bug and clearing flags on attachment 433444 [details].
Yijia Huang
Comment 32 2021-07-14 22:45:51 PDT
*** Bug 174821 has been marked as a duplicate of this bug. ***
Note You need to log in before you can comment on or make changes to this bug.