<!--- Verify first that your issue is not already reported on GitHub -->
<!--- Also test if the latest release and devel branch are affected too -->
<!--- Complete *all* sections as described, this form is processed automatically -->

##### SUMMARY
<!--- Explain the problem briefly below -->
[The document](https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html#role-duplication-and-execution) says that `allow_duplicates: true` makes it possible to execute a same role multiple times in play but it doesn't work. Actually I'm not sure the current behavior is not intended or it's just an omission of correction in documents. However, I think the variable should enable the control of that execution as stated in the example because we can do that in `roles` directive.

Edit (sivel): This appears to have been caused by 376b199c0540e39189bdf6b31b9a60eadffa3989

Something is likely looking at the wrong reference of `play.roles`, maybe instead of using `self._extend_value` in `_load_roles` we can switch to doing: `self.roles[:0] = roles` so the reference stays the same. Or someone can track down the incorrect reference.

##### ISSUE TYPE
- Bug Report

##### COMPONENT NAME
<!--- Write the short name of the module, plugin, task or feature below, use your best guess if unsure -->
allow_duplicates

##### ANSIBLE VERSION
<!--- Paste verbatim output from "ansible --version" between quotes -->

```
ansible 2.9.1
  config file = /home/knagamin/t/ansible/ansible-test-allow_duplicates/ansible.cfg
  configured module search path = ['/home/knagamin/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/knagamin/.local/lib/python3.7/site-packages/ansible
  executable location = /home/knagamin/.local/bin/ansible
  python version = 3.7.5 (default, Oct 17 2019, 12:16:48) [GCC 9.2.1 20190827 (Red Hat 9.2.1-1)]
```

NOTE: I tried it with some older versions then I found that It works correctly in v2.7.0 but doesn't in v2.7.1

##### CONFIGURATION
<!--- Paste verbatim output from "ansible-config dump --only-changed" between quotes -->
```paste below

```

##### OS / ENVIRONMENT
<!--- Provide all relevant information below, e.g. target OS versions, network device firmware, etc. -->

* target OS version

```
$ uname -srvmpio
Linux 5.3.11-300.fc31.x86_64 #1 SMP Tue Nov 12 19:08:07 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
```

##### STEPS TO REPRODUCE
<!--- Describe exactly how to reproduce the problem, using a minimal test-case -->

<!--- Paste example playbooks or commands between quotes below -->

* Directory structure

```
├── playbook.yml
└── roles
    └── test_role
        ├── meta
        │   └── main.yml
        └── tasks
             └── main.yml
```

* `./playbook.yml`

```yaml

---
- name: test for allow_duplicates
  hosts: localhost
  gather_facts: false
  roles:
    - role: test_role
    - role: test_role
    - role: test_role
```

* `./roles/test_role/task/main.yml`

```yaml
---
# tasks file for test_role

- name: Just show a message
  debug:
      msg: "hoge"

```

* `./roles/test_role/meta/main.yml`
```yaml
galaxy_info:
  author: your name
  description: your role description
  company: your company (optional)
  license: license (GPL-2.0-or-later, MIT, etc)
  min_ansible_version: 2.9
  galaxy_tags: []
dependencies: []
allow_duplicates: true
```
<!--- HINT: You can paste gist.github.com links for larger files -->

##### EXPECTED RESULTS
<!--- Describe what you expected to happen when running the steps above -->

```
PLAY [test for allow_duplicates] *************************************************************************************

TASK [test_role : Just show a message] *******************************************************************************
ok: [localhost] => {
        "msg": "hoge"
}

TASK [test_role : Just show a message] *******************************************************************************
ok: [localhost] => {
        "msg": "hoge"
}

TASK [test_role : Just show a message] *******************************************************************************
ok: [localhost] => {
        "msg": "hoge"
}

PLAY RECAP ***********************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```


##### ACTUAL RESULTS
<!--- Describe what actually happened. If possible run with extra verbosity (-vvvv) -->

<!--- Paste verbatim command output between quotes -->
```paste below
PLAY [test for allow_duplicates] *************************************************************************************

TASK [test_role : Just show a message] *******************************************************************************
ok: [localhost] => {
        "msg": "hoge"
}

PLAY RECAP ***********************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```

'''
        Handles the role compilation step, returning a flat list of tasks
        with the lowest level dependencies first. For example, if a role R
        has a dependency D1, which also has a dependency D2, the tasks from
        D2 are merged first, followed by D1, and lastly by the tasks from
        the parent role R last. This is done for all roles in the Play.
        '''
        block_list = []
        if len(self.roles) > 0:
            for r in self.roles:
                
                
                if r.from_include:
                    continue
                block_list.extend(r.compile(play=self))
        return block_list
    def compile_roles_handlers(self):
        '''
        Handles the role handler compilation step, returning a flat list of Handlers
        This is done for all roles in the Play.
        '''
        block_list = []
        if len(self.roles) > 0:
            for r in self.roles:
                if r.from_include:
                    continue
                block_list.extend(r.get_handler_blocks(play=self))
        return block_list
    def compile(self):