<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60744>60744</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[MachineSched] Mistake to schedule memory load across memory store
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
phoebewang
</td>
</tr>
</table>
<pre>
It seems [D138899](https://reviews.llvm.org/D138899) exposed a machine scheduler issue. The memory of load and store is overlapped, but scheduler seems not aware of it.
The reproducer comes from [D138899](https://reviews.llvm.org/D138899)
```
source_filename = "../../chrome/browser/dom_distiller/dom_distiller_service_factory.cc"
target datalayout = "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-f80:32-n8:16:32-S128"
target triple = "i686-unknown-linux-android24"
%0 = type { %1 }
%1 = type { %2 }
%2 = type { ptr }
%3 = type { %4 }
%4 = type { %5 }
%5 = type { ptr }
%6 = type { %7 }
%7 = type { %8 }
%8 = type { ptr }
%9 = type { %10 }
%10 = type { %11 }
%11 = type { ptr }
@g = external hidden unnamed_addr constant { [5 x ptr], [9 x ptr] }, align 4
@g2 = external hidden unnamed_addr constant { [5 x ptr] }, align 4
; Function Attrs: minsize nounwind null_pointer_is_valid optsize uwtable
define hidden void @f(ptr noundef align 4 dereferenceable_or_null(48) %0, ptr noundef byval(%0) align 4 %1, ptr noundef byval(%3) align 4 %2, ptr noundef byval(%6) align 4 %3, ptr noundef byval(%9) align 4 %4) unnamed_addr #0 align 2 {
%6 = alloca %0, align 4
%7 = alloca %3, align 4
%8 = alloca %6, align 4
%9 = alloca %9, align 4
store ptr getelementptr inbounds ({ [5 x ptr] }, ptr @g2, i32 0, inrange i32 0, i32 2), ptr %0, align 4
%10 = getelementptr inbounds i8, ptr %0, i32 4
%11 = load ptr, ptr %1, align 4
store ptr null, ptr %1, align 4
store ptr %11, ptr %6, align 4
%12 = load ptr, ptr %2, align 4
store ptr null, ptr %2, align 4
store ptr %12, ptr %7, align 4
%13 = load ptr, ptr %3, align 4
store ptr null, ptr %3, align 4
store ptr %13, ptr %8, align 4
%14 = load ptr, ptr %4, align 4
store ptr null, ptr %4, align 4
store ptr %14, ptr %9, align 4
tail call void @h1(ptr noundef align 4 dereferenceable_or_null(44) %10, ptr noundef nonnull byval(%0) align 4 %6, ptr noundef nonnull byval(%3) align 4 %7, ptr noundef nonnull byval(%6) align 4 %8, ptr noundef nonnull byval(%9) align 4 %9) #2
store ptr getelementptr inbounds ({ [5 x ptr], [9 x ptr] }, ptr @g, i32 0, inrange i32 0, i32 2), ptr %0, align 4
store ptr getelementptr inbounds ({ [5 x ptr], [9 x ptr] }, ptr @g, i32 0, inrange i32 1, i32 2), ptr %10, align 4
call void @h2(ptr noundef align 4 dereferenceable_or_null(4) %4) #2
call void @h3(ptr noundef align 4 dereferenceable_or_null(4) %3) #2
call void @h4(ptr noundef align 4 dereferenceable_or_null(4) %2) #2
call void @h5(ptr noundef align 4 dereferenceable_or_null(4) %1) #2
ret void
}
; Function Attrs: minsize null_pointer_is_valid optsize
declare void @h1(ptr noundef align 4 dereferenceable_or_null(44), ptr noundef byval(%0) align 4, ptr noundef byval(%3) align 4, ptr noundef byval(%6) align 4, ptr noundef byval(%9) align 4) unnamed_addr #1
; Function Attrs: minsize nounwind null_pointer_is_valid optsize uwtable
declare hidden void @h2(ptr noundef align 4 dereferenceable_or_null(4)) unnamed_addr #0 align 2
; Function Attrs: minsize nounwind null_pointer_is_valid optsize uwtable
declare hidden void @h3(ptr noundef align 4 dereferenceable_or_null(4)) unnamed_addr #0 align 2
; Function Attrs: minsize nounwind null_pointer_is_valid optsize uwtable
declare hidden void @h4(ptr noundef align 4 dereferenceable_or_null(4)) unnamed_addr #0 align 2
; Function Attrs: minsize nounwind null_pointer_is_valid optsize uwtable
declare hidden void @h5(ptr noundef align 4 dereferenceable_or_null(4)) unnamed_addr #0 align 2
attributes #0 = { minsize nounwind null_pointer_is_valid optsize uwtable "frame-pointer"="non-leaf" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="i686" "target-features"="+cx8,+mmx,+sse,+sse2,+sse3,+ssse3,+x87" "tune-cpu"="generic" }
attributes #1 = { minsize null_pointer_is_valid optsize "frame-pointer"="non-leaf" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="i686" "target-features"="+cx8,+mmx,+sse,+sse2,+sse3,+ssse3,+x87" "tune-cpu"="generic" }
attributes #2 = { minsize nounwind optsize }
!llvm.linker.options = !{}
!llvm.module.flags = !{!0, !1, !2, !3, !4, !5, !6}
!0 = !{i32 1, !"NumRegisterParameters", i32 0}
!1 = !{i32 7, !"Dwarf Version", i32 4}
!2 = !{i32 2, !"Debug Info Version", i32 3}
!3 = !{i32 1, !"wchar_size", i32 4}
!4 = !{i32 8, !"PIC Level", i32 2}
!5 = !{i32 7, !"uwtable", i32 2}
!6 = !{i32 7, !"frame-pointer", i32 1}
```
With [D138899](https://reviews.llvm.org/D138899) applied, machine-scheduler will turn
```
176B %12:gr32 = LEA32r %fixed-stack.0, 1, $noreg, 0, $noreg
192B %6:gr32 = MOV32rm %12:gr32, 1, $noreg, 0, $noreg :: (dereferenceable load (s32) from %ir.4, align 16)
208B MOVUPSmr %18:gr32, 1, $noreg, 0, $noreg, %3:vr128 :: (store (s128) into %ir.1, align 4)
224B MOV32mr %stack.0, 1, $noreg, 0, $noreg, %2:gr32 :: (store (s32) into %ir.6)
```
into
```
264B %12:gr32 = LEA32r %fixed-stack.0, 1, $noreg, 0, $noreg
272B MOVUPSmr %18:gr32, 1, $noreg, 0, $noreg, %3:vr128 :: (store (s128) into %ir.1, align 4)
280B %6:gr32 = MOV32rm %12:gr32, 1, $noreg, 0, $noreg :: (dereferenceable load (s32) from %ir.4, align 16) // now the content is loaded after the filling 0 MOVUPSmr
320B MOV32mr $esp, 1, $noreg, 16, $noreg, %6:gr32 :: (store (s32))
```
Which seems a wrong schedule given `%ir.4` and `%ir.1` is overlapped.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkWV-PozgS_zTOi0UEBSHkoR860xdppZ3b0c3d7GPkQEF8Y2xkTNJ9n_5kTAiQP5vpvr0b6VotYlO_KleVy0XZZnXNC4n4RBZrsniZscbslX6q9gp3eGSymO1U9vb0i6E1YllTsli_BGGSrFZk8UIg2RtT1SR8JrAhsNF44His50IcyrnSBYHNCQ0riq-VqjGjjJYs3XOJtE73mDUCNeV13eCc_n2PtMRS6TeqcioUyyiTGa2N0kh5TdUBtWBVhRmBT3TXmIEIp6BUhrIj02gFcDMn_gvxn93TStdYaZU1KWqaqhJrmmtVfsSsboDY7_7bbq0aneI25wIlK5GS8IUSgPmcwKZ9pHutSiSw2Wl1rFET2GSq3Ga8NlyIy_62Rn3gViRLjdJv8zQlAG4ww3SBhmbMMMHeVGNOw6FXkvAZvYqEzyG0D6-CpT_uBuOubcVR-_DythFC10scpycTEj4Hset8DSCZqmI0r0RvNY-T2Gvkd6mO0hNcNq8ek5lWPIOo5-yesPBbNvNWISXLNSWwCChZvvT04IIOIzqM6ZXRI3J4wR6N6NEFfTGiL-6Ljy_YlyP68oKejOjJffGrS-f4Y-9ccd_Ef8G9Idwz8osWhK8GtWSC7nmWoaSNtNGcbVmW2eUja8OkceMs1gv6aoW1C-iTfbHqX7QDwCfKBC8kjc6jwEeGuS7VPcM13TQyNVxJ-myMtouZllzW_F9IpWrkkcuMykaIbaW4NKi3vN4emOAZVZVpYc3RsJ1AJzHD3GasTsOD4hklkZ8TSKwDrcQM85MqNEONOWqUKVoRW6W3diwCSZTYVGjj3Ko-5N29HZhFONqql2Xn7A42nGDhDjaeYMM72NUEG9n-aGYIhH6HsEtw7RxFab8MmBAqZb2xo3mitF8NZ1h4HZZMYPF12GoCW12BuS-JNblAgwJLlMb2uNxZF9TUGn8r0NqlYqPWdngItDWLS81kgYMXIVCwX4YTy037u9V6QxWeTCVYySN-t5bb76RV9QwP7truYvFBcDvOAH3D-wHc0gV-RJf74HacAXp5Q5fwli7XIuymLvfB7TgDdHJDl-iWLtGP6HIf3I4zQF8LfcO4oCkTos9e--DH01fUpa_gIn9JJS3oXh6LH-CZ5rPlAzzTvJY8wDPNbytnWAgfShU3P32n3PEfSR3_ZdWCG6oFV3QbBxj8eIB18RVNpmMsN3y33HA6zWPB0bsFw33Bi3cLDqaCNZpWblfqTGq3-5XPvYLnVOikwm6fPpokHixvHqxsHixqHqxnrpUywZ9dPzq3TgrId66Qu7XY_8aQ9y3Jn9CQ96WAn9CQ96Wchw1hxmi-awzWDtLu9pfrd5pCCUCuWYlehyQAJHwhAFJJTyDLCYAFldx2Cya8A6ZGae_IM7Pv0X4Hk8ozmlUVl4VXsgHA6AY7TG1Y-t2rtDJO0q7Jc9RemwtP8KTDupMNL62ansTjJB5Tc2Sm0Vj3EALr9NVWIwTWZfnqGnWNfQP6Vnhq9c3XZHkS30gcDV2gRM3TlnzK_-P5CC7n4-40POr-_3e_wu047105-SJD0B4cCi6_o56ryq78ujscC-y--Xw645ClyhqB81ywYoQDV3ARcPsxAm4vRMDtQwi4PQCBYNH9xpe6-AOJfXFnuwB_bcq_YcFrg_oLs8FgULc-7wvDgabBRM7yLOflyHROv6GuuZID_mjIDxN-GPDjrinoLzJXV4SEQyHhbWOO6Z7p7SnmrmkQTZiTM_OXXz7RX_GAYsALQ97FbetPufkGZ3yb82IBdvzBmX98zOyev3Oz_9DBPKsqwd2Rency752P1Y9cCGoaLUdxNNYjWMZr2v65DXr4XOhupfz6l-cQ2t1Czl8x89rcMG_juJusSCqN7ebDH71wkldwlhwPBX_-7VsIuhyN-MdSqXVJ-Gw3SJPPoNuhE0jqsC3l3b0ALLieD_beQdwf-YOfdKp9_u3bP758Ld2eKHlYF9dehCR8PugAkoFuboNnG-3p-opyaVSnzei0plcGorMyIThdHve102QwcZeKOK8M9IhvXX5YzFUCxNGfFCawhJ9oLhJ__TOF68nlNhFQqY7U7JGmShqUhvK6lYQZZblB3dJyLgSXBfV7bzrDQvAvgizCurpqRxBf8W_8hxF2K6h-3_N0393xMXrUShb93R8t-AEltdjOAbHf3hv2bwL7ZnR_OJ9lT2G2Cldshk9BvIzDJA58mO2fdtkywWDnr9IMV36c7HbxkiXZyvcDFrEIZ_wJfAh9CKIgihKAOfhhmK-WcYA5gyRakcjHknHRp9tZe735FPvLKJoJtkNRtxeuABKP7u7TpvvFy0w_WR5v1xQ1iXzBa3NO2jPDjWhvaj-7LP3V2k8WL_Qzrw37jtSos0-6a1R3h5pqVdenV63HZ40WT-OPRMHNvtnNU1US2NhBux9byf0TU0Ng06paE9i0pvw7AAD__3ujvM8">