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

    <tr>
        <th>Summary</th>
        <td>
            opt -O3 removes memove initialiser
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    The following program has its local var initializer of the Work function removed at -O3 by opt. Using opt-bisect it looks like the DSE pass is the culprit.

```
; ModuleID = 'Main.mb'
source_filename = "../Main.m3"
target datalayout = "e-m:e-p:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"

%M_Const_struct = type { [7 x i8], [1 x i8], [4 x i8], [1 x i8], [10 x i8], [1 x i8], ptr, ptr, ptr, ptr, ptr, ptr, [8 x i8], [10 x i8], [6 x i8] }
%M_Main_struct = type { ptr, [32 x i8], ptr, [24 x i8], ptr, [8 x i8], ptr, i64, [8 x i8], ptr, ptr, [8 x i8], ptr, ptr, [8 x i8], ptr, ptr, [8 x i8], ptr, ptr, [8 x i8], ptr, ptr, [8 x i8], ptr, ptr, [8 x i8], ptr, [8 x i8] }
%struct.0 = type { [16 x i8] }

@M_Const = internal constant %M_Const_struct { [7 x i8] c"Main_M3", [1 x i8] zeroinitializer, [4 x i8] c"Work", [1 x i8] zeroinitializer, [10 x i8] c"DisplayArr", [1 x i8] zeroinitializer, ptr @Main_M3, ptr @M_Const, ptr @Main__Work, ptr getelementptr inbounds (i8, ptr @M_Const, i64 8), ptr @Main__DisplayArr, ptr getelementptr inbounds (i8, ptr @M_Const, i64 13), [8 x i8] zeroinitializer, [10 x i8] c"../Main.m3", [6 x i8] zeroinitializer }, align 8
@M_Main = internal global %M_Main_struct { ptr getelementptr inbounds (i8, ptr @M_Const, i64 80), [32 x i8] zeroinitializer, ptr getelementptr inbounds (i8, ptr @M_Const, i64 24), [24 x i8] zeroinitializer, ptr getelementptr inbounds (i8, ptr @M_Main, i64 104), [8 x i8] zeroinitializer, ptr @Main_M3, i64 3, [8 x i8] zeroinitializer, ptr @Main_I3, ptr getelementptr inbounds (i8, ptr @M_Main, i64 128), [8 x i8] zeroinitializer, ptr @Remote_I3, ptr getelementptr inbounds (i8, ptr @M_Main, i64 152), [8 x i8] zeroinitializer, ptr @Wr_I3, ptr getelementptr inbounds (i8, ptr @M_Main, i64 176), [8 x i8] zeroinitializer, ptr @Thread_I3, ptr getelementptr inbounds (i8, ptr @M_Main, i64 200), [8 x i8] zeroinitializer, ptr @Stdio_I3, ptr getelementptr inbounds (i8, ptr @M_Main, i64 224), [8 x i8] zeroinitializer, ptr @Fmt_I3, ptr getelementptr inbounds (i8, ptr @M_Main, i64 248), [8 x i8] zeroinitializer, ptr @RTHooks_I3, [8 x i8] zeroinitializer }, align 8
@m3_jmpbuf_size = external global i64, align 8

declare ptr @__m3_personality_v0()

declare ptr @Main_I3()

declare ptr @Remote_I3()

declare ptr @Wr_I3()

declare ptr @Thread_I3()

declare ptr @Stdio_I3()

declare ptr @Fmt_I3()

declare ptr @RTHooks_I3()

define void @Main__DisplayArr(ptr byval(%struct.0) align 8 %Val) #0 {
entry:
  %tmp.13 = alloca %struct.0, align 8
  %tmp.18 = alloca ptr, align 8
  %tmp.21 = alloca ptr, align 8
 br label %second

second:                                           ; preds = %entry
  br label %label_1_

label_1_: ; preds = %second
  %store_dest = getelementptr inbounds i8, ptr %tmp.13, i64 8
  store volatile i64 5, ptr %store_dest, align 8
  call void @RTHooks__PushEFrame(ptr %tmp.13)
  %v.2 = load volatile ptr, ptr getelementptr inbounds (i8, ptr @M_Main, i64 200), align 8
  %load_ind = getelementptr inbounds i8, ptr %v.2, i64 112
  %load_ind1 = load volatile ptr, ptr %load_ind, align 8
  store volatile ptr %load_ind1, ptr %tmp.18, align 8
  %v.18 = load volatile ptr, ptr %tmp.18, align 8
  %icmp = icmp eq ptr null, %v.18
  br i1 %icmp, label %if_2, label %else_2

else_2: ; preds = %label_1_
  %v.182 = load ptr, ptr %tmp.18, align 8
  %loophole-addr_word = ptrtoint ptr %v.182 to i64
 %and = and i64 %loophole-addr_word, 1
  %icmp3 = icmp ne i64 %and, 0
  br i1 %icmp3, label %if_2, label %else_24

else_24: ; preds = %else_2
  %v.185 = load ptr, ptr %tmp.18, align 8
 %load_ind6 = getelementptr inbounds i8, ptr %v.185, i64 -8
  %load_ind7 = load i64, ptr %load_ind6, align 8
  %eshl = shl i64 %load_ind7, 41
  %eshr = lshr i64 %eshl, 63
  %icmp8 = icmp eq i64 %eshr, 0
  br i1 %icmp8, label %if_2, label %else_29

else_29:                                          ; preds = %else_24
  %v.1810 = load ptr, ptr %tmp.18, align 8
  call void @RTHooks__CheckLoadTracedRef(ptr %v.1810)
  br label %if_2

if_2: ; preds = %else_29, %else_24, %else_2, %label_1_
  %v.11 = load i64, ptr %Val, align 8
  %result = call ptr @Fmt__Int(i64 %v.11, i8 10)
  store ptr %result, ptr %tmp.21, align 8
 %v.1811 = load ptr, ptr %tmp.18, align 8
  %v.21 = load ptr, ptr %tmp.21, align 8
  call void @Wr__PutText(ptr %v.1811, ptr %v.21)
  %v.212 = load ptr, ptr getelementptr inbounds (i8, ptr @M_Main, i64 200), align 8
 %load_ind13 = getelementptr inbounds i8, ptr %v.212, i64 112
  %load_ind14 = load ptr, ptr %load_ind13, align 8
  store ptr %load_ind14, ptr %tmp.21, align 8
  %v.2115 = load ptr, ptr %tmp.21, align 8
  %icmp16 = icmp eq ptr null, %v.2115
  br i1 %icmp16, label %if_3, label %else_3

else_3: ; preds = %if_2
  %v.2117 = load ptr, ptr %tmp.21, align 8
  %loophole-addr_word18 = ptrtoint ptr %v.2117 to i64
 %and19 = and i64 %loophole-addr_word18, 1
  %icmp20 = icmp ne i64 %and19, 0
  br i1 %icmp20, label %if_3, label %else_321

else_321: ; preds = %else_3
  %v.2122 = load ptr, ptr %tmp.21, align 8
  %load_ind23 = getelementptr inbounds i8, ptr %v.2122, i64 -8
 %load_ind24 = load i64, ptr %load_ind23, align 8
  %eshl25 = shl i64 %load_ind24, 41
  %eshr26 = lshr i64 %eshl25, 63
  %icmp27 = icmp eq i64 %eshr26, 0
  br i1 %icmp27, label %if_3, label %else_328

else_328: ; preds = %else_321
  %v.2129 = load ptr, ptr %tmp.21, align 8
  call void @RTHooks__CheckLoadTracedRef(ptr %v.2129)
 br label %if_3

if_3:                                             ; preds = %else_328, %else_321, %else_3, %if_2
  %load_dest = getelementptr inbounds i8, ptr %Val, i64 8
  %v.1130 = load i64, ptr %load_dest, align 8
 %result31 = call ptr @Fmt__Int(i64 %v.1130, i8 10)
  store ptr %result31, ptr %tmp.18, align 8
  %v.2132 = load ptr, ptr %tmp.21, align 8
  %v.1833 = load ptr, ptr %tmp.18, align 8
  call void @Wr__PutText(ptr %v.2132, ptr %v.1833)
  br label %label_4_

label_4_: ; preds = %if_3
  %v.13 = load volatile ptr, ptr %tmp.13, align 8
 call void @RTHooks__PopEFrame(ptr %v.13)
  ret void
}

declare void @RTHooks__PushEFrame(ptr) #0

declare ptr @alloca()

declare void @RTHooks__CheckLoadTracedRef(ptr) #0

declare ptr @Fmt__Int(i64, i8) #0

declare void @Wr__PutText(ptr, ptr) #0

declare void @RTHooks__PopEFrame(ptr) #0

define void @Main__Work() #0 {
entry:
  %AC = alloca %struct.0, align 8
  br label %second

second: ; preds = %entry
  %v.2 = load ptr, ptr getelementptr inbounds (i8, ptr @M_Main, i64 128), align 8
  %load_ind = getelementptr inbounds i8, ptr %v.2, i64 120
  %load_ind1 = load ptr, ptr %load_ind, align 8
  call void @llvm.memmove.p0.p0.i64(ptr align 8 %AC, ptr align 8 %load_ind1, i64 16, i1 false)
  call void @Main__DisplayArr(ptr %AC)
  ret void
}

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memmove.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1 immarg) #1

define ptr @Main_M3(i64 %mode) #0 {
entry:
  %mode1 = alloca i64, align 8
  store i64 %mode, ptr %mode1, align 8
  br label %second

second: ; preds = %entry
  %v.3 = load i64, ptr %mode1, align 8
  %icmp = icmp eq i64 %v.3, 0
  br i1 %icmp, label %if_5, label %else_5

else_5:                                           ; preds = %second
  call void @Main__Work()
  br label %if_5

if_5: ; preds = %else_5, %second
  ret ptr @M_Main
}

attributes #0 = { "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }

!llvm.ident = !{!0}

!0 = !{!"versions- cm3: d5.11.9 llvm: 20.0.0git"}

```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWktv2zr2_zTMhrAhkpItL7xwkhv8C_yLGdx2pkuDlmibt5SoISkn7qcfkHpRsuTY111METR6nBfP-Z0HGVGt-SFnbA2iZxC9PtHSHKVapyyT3LDsaSfT8_r7kcG9FEK-8_wACyUPimbwSDXkRkMhEyrgiSrIc244FfwXU1DuoTky-EOqn3Bf5onhMoeKZfLEUkgNnP2DwN0ZysLM4b-0lSsLM9txzRIDuYFCyp8aCv6TOTmv3_6ABdUacu3uk1IUips5CDb2ZxHUP8EGkGf4VaalYF9eISCvEODlV8rzebYDeAmCjZalSth2zwXLacZqGjyfA_xWERKAMQg2hqoDMzClhgp6lqVpSNksA2TDZgUgm0Xo_pvx9gLhGJANwvFsHwf1Ve4eLQDZEFyRfbNkvhqjeCFaaz7ixXYRzopkJnhefswOeVlR2x8cfd2-yFybrTaqTCq7zLlgECyfIYiel_AD8hhErwC_2Hs0uA8_eY-CawSFUTf-AtFz_JnoRXMPwfK1WZ2Nw-jiOsEEj9gEomccjj-PRx7boE2_vc77v_nWf9w5tPLkPLgACrrwfrABYVDDy5Hz3DCVUwET-4jmBo7gbwA7mACMXQy_ulwagAj-Ykp6xWKISsduK8ftvB2sHPMr14Wg541SN4oojIJ24Y3N3ZNqpUOabWVe9fDADBMsY7mxdzzfyTJPNQQ45vG4KL4IYQzw6kKsb_gjwhGppfcAcZPvhoVwmKYDIQ44-AVSwQ85jBsAWQF9_ByE3FEBL_O7Suu_68WgW2hXEqZC_Pd04LDT0ZWXh3VYJ7TxCsIbA3aJVMtP7mX9Qh6zF8f32fsny6RhD6uN8H1qf6iHVS4X96n8flSMpo-qxUFwn9pvJuXyYa34Thi-ZeZhneG9UPr-f3Y4rPVeYxqtTRnZ_pUVu3K_1fxXNXCxj36NqucCjy3YpCwRVLHGiO02I9uCKS1zKrg5b08BqHJijLpNuUkKLz8maWowT773kDdJ08FkkqSJ6bStXgB8oj3PGTxJno73s9iy784nKhxbO5UAvGpcbbvDv-37FQSYBLY3gGDDcqPOgFgl0FKYrJgj4iJHhd1-wJ40P3AdfezT19PSCB1G1-l2Cgq6Y66PaZbIPK1WX1-TDbz9n92qFIrZDHFTf1Qt1Frjq3EXW7StFLV3ZHMpoLUIVi6Rim1TVk9yE9nppWbj2m5EsZKcGHiSghoumHsReSydlqFLEypEi4cGNNt_lvr4x5uiGash4aldNaaf5tjZLCRNO9XdCPxoUR1E3qrZ8jy92U-nOW4bBMJDMei67R7l0JaBrwfUaBipeGQtpwbr1_RPcvMkK6q5zV6w_ziGvBTC1dpKeoNQjhoO-7LFK99vce8BE5pt681rfT0GXg_n7UI8FNy4ACFlcZSCzWiaqu27VFVQC6OM5LnpAmiFG-lqfbCxj2gdf_vbBnZUmNWIfGeRzls5a_hoFdng0lPkFleFvq_CUWe1Pm1dFd3lKg9ViztQj-Kowf3sInuWnQV1Bx3gdzESL6aPwvHZ363ba4GWPkQeqapU2Iua1vJbsgXxoxL3MNyRqomwxLeEZeWHZXVXrZ-IX-gHEAX3gX28vL4cWfLz_yVNvyuasPRPtu_KbKWlKbN-j3ErdqtzV9OIW9V1oLHfv6tvRvIYTSHDNfsLTCimS1E1LbdIbzDZfsmNLfJVRK1oh8cYduuqamitoBI18CVGl9ngfIPuLjenZmKYYLpQ1Q_bD2UbovnOPswgTKjfbVC_OaLxwvj7uqLfdcg9bRFdbYzhlK86ZeMtcUgWfurn2hx0tS6OstmCgBbXu6AVfFlG0GJYR8hlHSFeGSGjqVZnY7eG5d1ruOxc9VRw2Qid_GEnRKvPe2GVEL1uiIOJdohWE5UXB7e4DCPfaRhNVyjSy5Kr88OE4yqE4TtRj_t90ZcUftYX8QXo68aGo6nWWJXefm_Ei9HuiKPL_oiXUw0SL6YCtbwpUHEvUPGVQGHUC9XqgTJ6Y_ezWuo6Omh-pG1-5L493FRrt0v3eiOpFtCBtLrxE91F9q7NWt08u51a3RFJcBVwI1u1tlESdGPXJcEtfZfcuGPBiNyfqbZNEvLAzDTRfK0xg6GXkLGhqRp0wt7GPBzfmNcQa-wmt23QhmVhYkMti-F--uTtphUzjsda2fyNpznQ-XRz3pzEjJ4DVYckYwdFN-flVfl95FV4G2eYjCho_jR2jWvKk0OukfOt6s9A8ScHVpuXGw-rPj9dunJmNDw2eXQu7M74f-dpCQ6unJbcdkjSSwMhTtk8Y1kmT2xeBPbHgcWlgnesuHlpJHsPewcrzjzX_TiCeyo0a1Kop3DiYLNWMZ1zNnJvzZcQG2OUtvHMpRW-o8lPmMu9YgzmsszfrXffuRCKmVLlMGOZVGeAY6oOGcsso2I0fVfc1EYOMX3VLVZpYUrFoJMgc3FunNO9sgqaN036IcizjKpDjXfUy4zhX6aadpHJlH2SIJakd_B6cQLftJeezBYpjv_3JxOZ6qOj-sZOz9qOSSamquFMFV3OVJE3UUUPnjB7B8QjoO6q2dgBQdTOSNH0VBfVk42nyCZDv8B4WUGNUXxXGqZrfFhZy2cIMK4-jJntGbV41ABjQF7dX6Sf9x_aFgqAn7Pso7rQNl3rC1xdfcRLYHcAGJe5pns22xezjJpjK6lO8opEs5mWezPbC0nNCImzuG8uas39LWnsfYOBkUtgnrK8-ewI2dTBKPCJgv47gPGJKc1lrmcwydwom0ZzhOYraOXZexzMg3lw4G6JrajmA6qndE3SFVnRJ7ZGS0KC1RItyNNxnexpEKIVCfByFa_COFrRPYmTNF0FaJHs0BNf4wCHCAcIkwiHZB7uKYqSMIjDdIUQYiAMWEa5mLuVSXV44lqXbI1QjEn05JCm3XdoGOfsHbq31sjo9UmtLdNsVx60rW1cG92JMdwItpZF9VFZ9Y2Zdr4-sfabNM3UU6nE-mhMYQsvwG8Avx24OZa7eSIzgN-ch6pfs0LJv1hiAH5zZmiA32o7T2v83wAAAP__FKZkzg">