Problem with getkeyup,GetKeyUp doesnt work sometimes

So when pressing one key, lets say “A”, then pressing another one, lets say “D” and keeping “A” pressed, when i then release “D”, getkeyup for that doesnt get fired, i need help

void Update()
    {

        if (Input.GetKeyUp(KeyCode.W) && moveDirection.z != 0) {
                stopw = true;
            }
            if (Input.GetKeyUp(KeyCode.S) && moveDirection.z != 0) {
                stops = true;
            }
            if (Input.GetKeyUp(KeyCode.A) && moveDirection.x != 0) {
                stopa = true;
            }
            if (Input.GetKeyUp(KeyCode.D) && moveDirection.x != 0) {
                Debug.Log("d up");
                stopd = true;
            }
        
        if (c.isGrounded)
        {
            if (stopw) {
                moveDirection -= transform.forward * speed;
                stopw = false;
            }
            if (stops) {
                moveDirection += transform.forward * speed;
                stops = false;
            }
            if (stopa) {
                moveDirection += transform.right * speed;
                stopa = false;
            }
            if (stopd) {
                moveDirection -= transform.right * speed;
                stopd = false;
            }
            // We are grounded, so recalculate
            // move direction directly from axes

            if (Input.GetKeyDown(KeyCode.W)) {
                moveDirection += transform.forward * speed;
            }
            if (Input.GetKeyDown(KeyCode.S)) {
                moveDirection -= transform.forward * speed;
            }
            if (Input.GetKeyDown(KeyCode.A)) {
                moveDirection -= transform.right * speed;
                Debug.Log("a down");
            }
            if (Input.GetKeyDown(KeyCode.D)) {
                moveDirection += transform.right * speed;
                Debug.Log("d down");
            }

,i know there are lot of questions about getkeyup, but i havent seen mz problem anywhere. So when i press one key, lets say a, then press another, lets say b, and then release b, getkeyup for b doesnt get fired.`void Update()
{

    if (Input.GetKeyUp(KeyCode.W) && moveDirection.z != 0) {
            stopw = true;
        }
        if (Input.GetKeyUp(KeyCode.S) && moveDirection.z != 0) {
            stops = true;
        }
        if (Input.GetKeyUp(KeyCode.A) && moveDirection.x != 0) {
            stopa = true;
        }
        if (Input.GetKeyUp(KeyCode.D) && moveDirection.x != 0) {
            Debug.Log("d up");
            stopd = true;
        }
    
    if (c.isGrounded)
    {
        if (stopw) {
            moveDirection -= transform.forward * speed;
            stopw = false;
        }
        if (stops) {
            moveDirection += transform.forward * speed;
            stops = false;
        }
        if (stopa) {
            moveDirection += transform.right * speed;
            stopa = false;
        }
        if (stopd) {
            moveDirection -= transform.right * speed;
            stopd = false;
        }
        // We are grounded, so recalculate
        // move direction directly from axes

        if (Input.GetKeyDown(KeyCode.W)) {
            moveDirection += transform.forward * speed;
        }
        if (Input.GetKeyDown(KeyCode.S)) {
            moveDirection -= transform.forward * speed;
        }
        if (Input.GetKeyDown(KeyCode.A)) {
            moveDirection -= transform.right * speed;
            Debug.Log("a down");
        }
        if (Input.GetKeyDown(KeyCode.D)) {
            moveDirection += transform.right * speed;
            Debug.Log("d down");
        }`

I am facing to the similar problem when GetkeyUp is not called. Reproducing is not for 100%, but it happens when I am pressing more than one key in time and the second key pressing/releasing quite fast. Didnt find solution yet.
I am calling GetKeyUp in LateUpdate (what should be ok).
Unity version 2020.1.8f1.
OS: Mac OS