<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/148577>148577</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Stores with invariant address unnecessarily widened with EVL tail folding
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            vectorizers
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
            lukel97
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          lukel97
      </td>
    </tr>
</table>

<pre>
    https://godbolt.org/z/9a6b9oe5c

Given a loop that has a store to an invariant address:

```llvm
define void @f(ptr %p, ptr %q, i32 %n) {
entry:
  br label %loop

loop:
  %iv = phi i32 [0, %entry], [%iv.next, %loop]
  %gep = getelementptr i32, ptr %p, i32 %iv
  %x = load i32, ptr %gep
  %y = add i32 %x, 1
  store i32 %y, ptr %gep
  store i32 %y, ptr %q ; address invariant
  %iv.next = add i32 %iv, 1
  %done = icmp eq i32 %iv.next, %n
  br i1 %done, label %exit, label %loop

exit:
  ret void
}
```

 Typically we extract the corresponding element and emit a scalar store:

```llvm
  %wide.load = load <vscale x 4 x i32>, ptr %14, align 4
  %15 = add <vscale x 4 x i32> %wide.load, splat (i32 1)
  %19 = extractelement <vscale x 4 x i32> %15, i32 %18
  store i32 %19, ptr %q, align 4
```

However with EVL tail folding we fail to do this and instead emit a scatter:

```
%vp.op.load = call <vscale x 4 x i32> @llvm.vp.load.nxv4i32.p0(ptr align 4 %13, <vscale x 4 x i1> splat (i1 true), i32 %11)
  %14 = add <vscale x 4 x i32> %vp.op.load, splat (i32 1)
  call void @llvm.vp.store.nxv4i32.p0(<vscale x 4 x i32> %14, ptr align 4 %13, <vscale x 4 x i1> splat (i1 true), i32 %11)
  call void @llvm.vp.scatter.nxv4i32.nxv4p0(<vscale x 4 x i32> %14, <vscale x 4 x ptr> align 4 %broadcast.splat, <vscale x 4 x i1> splat (i1 true), i32 %11)
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVcGSozYQ_Rr50rUUCGTgwGFmZ50ccksqd4HaoESWWElm7P36lAQYj2cmtVVJlass6O6nfu81EndO9hqxIeyZUKrOf6OqS0IpYS87fvaDsc3yctcacW0G70dH8idCD4QeeiNao3xibE_o4Qehh5rv29og60j6RNKnX-SEGjgoY0bwA_cwcAccnDcWwRvgGqSeuJVce-BCWHQRPlaTfTr_lJpOJH0SeJQaYTJSACnSI6HV6C0QykZCv8Ky_h7WMqdhrQmtgZTPJH1C7e11hgZoLSjeogo5obd5v7haMghlcgKSv8A4yBmOPacBmlA2Y7GX-BiUY3JKNF78Eo9A7GUF6nGMSD16VHhC7UOrMqd3XY93XctprbzEOmW4eEjvcVxzrjGHC7GWX0JeFsOzzsv76wf1nyZ8B5I_r45sHm3aRL6PW8tp25tQJozGmCK70wj4fUu7V0uvlshsLQqRm0F4kf7Ni82xGFocs-jjaIRI-XI_PnMu_HEdZceVusIrAl685Z0HPyB0xlp0o9FC6h4Wi4BrAXiSPoxrxxW3s1ifTmdk_CoFJtGvm3Ek_zoFAIQLFHCJRubf7qTOivDAlew1FCtQxm7afgzwZrcA4EbFPRBaBZEzQusbVB2hFsYrvc9RM3Y3i1n1fk6y-vFz25p_EP1X84oTWniVfoBvf_4GnksFR6Oi1K8Ix_DsDQgDfpAuqi6188jv1fce7Xvhw5qyaUzMuGkeHP6UXBHNSqY5P9GXqZA5TcZ0OUoWHpFkHsfzESgLOJvUGXh7xiD2nWRvxC9-wseNwudGRl7r0beyiLa8pfEvvharbf8zzY9bm127NRf-f6rBx_jobYjf9dxaw0XHnU9ih_-VwG2edqLJRZ3XfIdNVjJalFWWF7uhKcu6yqvsWJV5WrGy2ldtV6Vluk-PRdbtcScbmlKWllmRlrRiRYJp2mZVRsssr457JkiR4olLlUR5jO130rkzNllRsbLcxaPNLbfwhJ03Vv5A65ab2Dah7Et77l1QWDrvNiAvvcLm9zAJbv7O3t2ocNYaO3SOWxmOPylQo_j4o9ydrXq85qUfzm3SmROhh3jazX9fRmv-ws4TeohsHKGHhdDU0H8CAAD___b5b7c">