[llvm-commits] Fwd: [llvm] r168837 - in /llvm/trunk: lib/CodeGen/RegisterCoalescer.cpp test/CodeGen/ARM/coalesce-subregs.ll

Jakob Stoklund Olesen stoklund at 2pi.dk
Wed Nov 28 16:34:50 PST 2012


Hi Pawel,

Would you merge this bugfix to the release branch, please?

I am the code owner.

Thanks,
/jakob

Begin forwarded message:

> From: Jakob Stoklund Olesen <stoklund at 2pi.dk>
> Subject: [llvm-commits] [llvm] r168837 - in /llvm/trunk: lib/CodeGen/RegisterCoalescer.cpp test/CodeGen/ARM/coalesce-subregs.ll
> Date: November 28, 2012 4:26:12 PM PST
> To: llvm-commits at cs.uiuc.edu
> 
> Author: stoklund
> Date: Wed Nov 28 18:26:11 2012
> New Revision: 168837
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=168837&view=rev
> Log:
> Avoid rewriting instructions twice.
> 
> This could cause miscompilations in targets where sub-register
> composition is not always idempotent (ARM).
> 
> <rdar://problem/12758887>
> 
> Modified:
>    llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp
>    llvm/trunk/test/CodeGen/ARM/coalesce-subregs.ll
> 
> Modified: llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp?rev=168837&r1=168836&r2=168837&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp (original)
> +++ llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp Wed Nov 28 18:26:11 2012
> @@ -887,8 +887,17 @@
>   // Update LiveDebugVariables.
>   LDV->renameRegister(SrcReg, DstReg, SubIdx);
> 
> +  SmallPtrSet<MachineInstr*, 8> Visited;
>   for (MachineRegisterInfo::reg_iterator I = MRI->reg_begin(SrcReg);
>        MachineInstr *UseMI = I.skipInstruction();) {
> +    // Each instruction can only be rewritten once because sub-register
> +    // composition is not always idempotent. When SrcReg != DstReg, rewriting
> +    // the UseMI operands removes them from the SrcReg use-def chain, but when
> +    // SrcReg is DstReg we could encounter UseMI twice if it has multiple
> +    // operands mentioning the virtual register.
> +    if (SrcReg == DstReg && !Visited.insert(UseMI))
> +      continue;
> +
>     SmallVector<unsigned,8> Ops;
>     bool Reads, Writes;
>     tie(Reads, Writes) = UseMI->readsWritesVirtualRegister(SrcReg, &Ops);
> 
> Modified: llvm/trunk/test/CodeGen/ARM/coalesce-subregs.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/coalesce-subregs.ll?rev=168837&r1=168836&r2=168837&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/coalesce-subregs.ll (original)
> +++ llvm/trunk/test/CodeGen/ARM/coalesce-subregs.ll Wed Nov 28 18:26:11 2012
> @@ -317,3 +317,44 @@
>   store <2 x i64> %result.2, <2 x i64>* %agg.result, align 128
>   ret void
> }
> +
> +; <rdar://problem/12758887>
> +; RegisterCoalescer::updateRegDefsUses() could visit an instruction more than
> +; once under rare circumstances. When widening a register from QPR to DTriple
> +; with the original virtual register in dsub_1_dsub_2, the double rewrite would
> +; produce an invalid sub-register.
> +;
> +; This is because dsub_1_dsub_2 is not an idempotent sub-register index.
> +; It will translate %vr:dsub_0 -> %vr:dsub_1.
> +define hidden fastcc void @radar12758887() nounwind optsize ssp {
> +entry:
> +  br i1 undef, label %for.body, label %for.end70
> +
> +for.body:                                         ; preds = %for.end, %entry
> +  br i1 undef, label %for.body29, label %for.end
> +
> +for.body29:                                       ; preds = %for.body29, %for.body
> +  %0 = load <2 x double>* null, align 1
> +  %splat40 = shufflevector <2 x double> %0, <2 x double> undef, <2 x i32> zeroinitializer
> +  %mul41 = fmul <2 x double> undef, %splat40
> +  %add42 = fadd <2 x double> undef, %mul41
> +  %splat44 = shufflevector <2 x double> %0, <2 x double> undef, <2 x i32> <i32 1, i32 1>
> +  %mul45 = fmul <2 x double> undef, %splat44
> +  %add46 = fadd <2 x double> undef, %mul45
> +  br i1 undef, label %for.end, label %for.body29
> +
> +for.end:                                          ; preds = %for.body29, %for.body
> +  %accumR2.0.lcssa = phi <2 x double> [ zeroinitializer, %for.body ], [ %add42, %for.body29 ]
> +  %accumI2.0.lcssa = phi <2 x double> [ zeroinitializer, %for.body ], [ %add46, %for.body29 ]
> +  %1 = shufflevector <2 x double> %accumI2.0.lcssa, <2 x double> undef, <2 x i32> <i32 1, i32 0>
> +  %add58 = fadd <2 x double> undef, %1
> +  %mul61 = fmul <2 x double> %add58, undef
> +  %add63 = fadd <2 x double> undef, %mul61
> +  %add64 = fadd <2 x double> undef, %add63
> +  %add67 = fadd <2 x double> undef, %add64
> +  store <2 x double> %add67, <2 x double>* undef, align 1
> +  br i1 undef, label %for.end70, label %for.body
> +
> +for.end70:                                        ; preds = %for.end, %entry
> +  ret void
> +}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20121128/cf2d0ec7/attachment.html>


More information about the llvm-commits mailing list