[LLVMdev] i64 OR instruction elimination
Mark Schimmel
Mark.Schimmel at synopsys.com
Tue Apr 1 16:16:29 PDT 2014
for.body: ; preds = %for.body.lr.ph, %for.body
%ACC.sroa.0.013 = phi i64 [ 0, %for.body.lr.ph ], [ %phitmp9, %for.body ]
%ACC.sroa.4.012 = phi i64 [ 0, %for.body.lr.ph ], [ %tmp.sroa.2.0.extract.shift, %for.body ]
%i.011 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ]
%arrayidx = getelementptr inbounds i16* %ary, i32 %i.011
%0 = load i16* %arrayidx, align 2, !tbaa !1
%add = add i32 %i.011, 8
%arrayidx1 = getelementptr inbounds i16* %ary, i32 %add
%1 = load i16* %arrayidx1, align 2, !tbaa !1
%2 = tail call i64 @llvm.arc.ACC40.GUARD.MUL.SQ15.SQ15(i16 %0, i16 %1) #1
%L.sroa.0.0.insert.insert.i = or i64 %ACC.sroa.0.013, %ACC.sroa.4.012
%3 = tail call i64 @llvm.arc.ADD.ACC40(i64 %L.sroa.0.0.insert.insert.i, i64 %2) #1
%tmp.sroa.2.0.extract.shift = and i64 %3, -4294967296
%inc = add i32 %i.011, 1
%phitmp9 = and i64 %3, 4294967295
%cmp = icmp ult i32 %inc, %limit
br i1 %cmp, label %for.body, label %for.cond.for.end_crit_edge
The value of the OR is simply the PHI of %3 and 0. Nobody detects this and it generates pretty ugly code in a loop. Can you tell me what phase should handle this simple transform? That is, what phase does this kind of transformation belong in?
Thanks
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140401/6114708e/attachment.html>
More information about the llvm-dev
mailing list