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

    <tr>
        <th>Summary</th>
        <td>
            [GlobalOpt] Incorrect handling of memset in global ctor evaluation
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            miscompilation
      </td>
    </tr>

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

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

<pre>
    ```
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [
  { i32, ptr, ptr } { i32 65535, ptr @ctor, ptr null }
]

@g = global { i32, i32 } { i32 0, i32 1 }

define internal void @ctor() {
  call void @llvm.memset.p0.i64(ptr @g, i8 0, i64 8, i1 false)
  ret void
}

declare void @llvm.memset.p0.i64(ptr, i8, i64, i1)

; RUN: opt -globalopt < %s

@llvm.global_ctors = appending global [0 x { i32, ptr, ptr }] zeroinitializer
@g = local_unnamed_addr global { i32, i32 } { i32 0, i32 1 }
```

The memset is removed, but the global is not zeroed. This is because https://github.com/llvm/llvm-project/blob/10f7255d32b690a44556297cee9a2ddb476e8ea6/llvm/lib/Transforms/Utils/Evaluator.cpp#L441-L442 only checks whether the first byte is zero, not all bytes that are being set.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJydU11vnDAQ_DXwYgUZg7njgYck11aVqlaq0ufI4AXcGBvZ5tr019c2kItOqtJWQv5ae2Z2dmk1f26SCm8fPiX4NimxlOcpG6RumXzsnDYWJcUJsXkGxYUa0BpCCb3L0U-UHO6QKEhC7tHszDb501NCT-HOCov-fG-PoIrSgr4EShy4961apIygq0i6L3bNQ9S4K7tQBdzXHHg_zF-hxZFDLxQgoRwY5UHOWvCLimNC6gCyZ9MxebkSDZtgsuCyGWeiKv2DLYkhEh434qpEx7jIUc-kBY-6IxpwEXDTdC2uk8zAm4wr2Ua1Er1QbGNxh75--5wUt0jPDt2sloVlUtyjhFB75ezfdwN-qxt-gdFCCSeYFH59VTypvamPi1JsAv7IODf_W8-rjo7jwwhoNQwJ682e9Bl4eNwuDjkf3Lh8UGkXpQLP0MPoD_zXQscWC2h0brbevIS8998g3Li0WacnvwlGbdPNbPR36Jzfth7WTznuD4RSXpC2qjErS0orUh86gJoRztvyUMERWPUKR4R3D4Yp22szWb_55oQM87szkwvztci6eU5I8aks8xs_EKSVfEbdCN2TRT9G8HmZmFwvjHWofXYQkgnJhdRDoqGPw7n195jf-iZrIdQ1tFbKm4LXRc1SJ5yExhf5Q7Tpy-xCQT-qThvjE0UjU1yGZ7p_sVntnoa2QbCKFlqli5HNPxsprF0gZE_pkdbp2GBOCOY1rqq85HlP677kbU2KHhec1mWdStaCtEF0QsgkrEefhYwS_IHXn4qGYA9S4SIvaYGPGS6PVd0Ba7ue0IpR35wwMSGz-BdoM6SmibraZbDh5xDW2UuQWSsGBdGogM8WN2rTKPEkujQm0ET1vwGIR6Lc">