<div dir="ltr">Example:<div><br></div><div><div>target triple = "powerpc64le-unknown-linux-gnu"</div><div><br></div><div>define void @TestFoo() {</div><div>entry_bb:</div><div>  br label %loop_bb</div><div><br></div><div>loop_bb:</div><div>  %tmp = load float, float* undef</div><div>  %tmp1 = fmul float %tmp, 0x401F25E360000000</div><div>  %tmp2 = fadd float %tmp1, 0x3FC1A7B960000000</div><div>  %tmp3 = select i1 undef, float 0x401F25E360000000, float %tmp2</div><div>  store float %tmp3, float* undef</div><div>  br label %loop_bb</div><div>}</div></div><div><br></div><div>The code above is triggering a assertion failure when adjusting the live intervals, since OldFMAReg (%vreg12 in debug info) is actually defined in two blocks.</div><div><br></div><div>I wonder if we can fix this by making the transformation simpler, that is, instead of doing:</div><div>    %vreg12<def> = COPY %vreg7; VSSRC:%vreg12,%vreg7</div><div><div>    %vreg12<def,tied1> = XSMADDASP %vreg12<tied0>, %vreg0, %vreg4; VSSRC:%vreg12,%vreg0 F4RC:%vreg4</div><div>-></div><div>    %vreg0<def,tied1> = XSMADDMSP %vreg0<tied0>, %vreg4, %vreg7; VSSRC:%vreg0,%vreg7 F4RC:%vreg4</div></div><div>, we do:</div><div><div>    %vreg12<def> = COPY %vreg7; VSSRC:%vreg12,%vreg7</div><div><div>    %vreg12<def,tied1> = XSMADDASP %vreg12<tied0>, %vreg0, %vreg4; VSSRC:%vreg12,%vreg0 F4RC:%vreg4</div><div>-></div><div>    %vreg0<def,tied1> = XSMADDMSP %vreg0<tied0>, %vreg4, %vreg7; VSSRC:%vreg0,%vreg7 F4RC:%vreg4</div></div></div><div>    %vreg12<def> = COPY %vreg0; VSSRC:%vreg12,%vreg0</div><div><br></div><div>and count on copy elimination to eliminate the introduced copy (which should be easy?).</div><div><br></div><div>Thanks!</div></div>