[LLVMdev] isel cannot select "adde" with lvm-svn
Heikki Kultala
hkultala at cs.tut.fi
Wed Dec 3 08:17:32 PST 2014
After upgrading to llvm 3.6-svn I keep getting
LLVM ERROR: Cannot select: 0x10d3a88: i32,glue = adde 0x12cf3a8,
0x1d0e708, 0x1c5ee08:1 [ORD=23] [ID=48]
0x12cf3a8: i32,ch = CopyFromReg 0xda2310, 0x1c5f438 [ORD=3] [ID=26]
0x1c5f438: i32 = Register %vreg15 [ID=4]
0x1d0e708: i32 = Constant<0> [ID=6]
0x1c5ee08: i32,glue = addc 0x14211c0, 0x2f599a8 [ORD=23] [ID=41]
0x14211c0: i32,ch = CopyFromReg 0x12cf3a8:1, 0x2f59ed0 [ORD=3] [ID=34]
0x2f59ed0: i32 = Register %vreg16 [ID=5]
0x2f599a8: i32 = Constant<16> [ID=12]
In function: memcpy
on our custom backend.
Setting lowering to expand ADDE's does not seem to help:
setOperationAction(ISD::ADDE, MVT::i32, Expand);
With older llvm versions these ADDE's never appear.
The whole function is here, I don't understand where it could need adde
operation. Pointers are 32-bit in this platform.
; Function Attrs: nounwind
define internal fastcc void @memcpy(i8* %dst0, i8* %src0, i32 %len0) #1 {
entry:
%cmp = icmp ult i32 %len0, 16
br i1 %cmp, label %while.cond17.preheader, label %land.lhs.true
land.lhs.true: ; preds = %entry
%0 = ptrtoint i8* %src0 to i32
%1 = ptrtoint i8* %dst0 to i32
%and43 = or i32 %0, %1
%or = and i32 %and43, 3
%tobool = icmp eq i32 %or, 0
br i1 %tobool, label %while.body.lr.ph, label %while.body19.preheader
while.body.lr.ph: ; preds = %land.lhs.true
%2 = bitcast i8* %dst0 to i32*
%3 = bitcast i8* %src0 to i32*
%4 = add i32 %len0, -16
%5 = and i32 %4, -16
%6 = add i32 %5, 16
%scevgep62 = getelementptr i8* %dst0, i32 %6
br label %while.body
while.cond10.preheader: ; preds = %while.body
%scevgep64 = getelementptr i8* %src0, i32 %6
%7 = sub i32 %4, %5
%scevgep6263 = bitcast i8* %scevgep62 to i32*
%scevgep6465 = bitcast i8* %scevgep64 to i32*
%cmp1148 = icmp ugt i32 %7, 3
br i1 %cmp1148, label %while.body12.lr.ph, label %while.end16
while.body12.lr.ph: ; preds =
%while.cond10.preheader
%8 = add i32 %7, -4
%9 = lshr i32 %8, 2
%10 = add nuw nsw i32 %9, 1
br label %while.body12
while.body: ; preds = %while.body,
%while.body.lr.ph
%len.057 = phi i32 [ %len0, %while.body.lr.ph ], [ %sub, %while.body ]
%aligned_src.056 = phi i32* [ %3, %while.body.lr.ph ], [
%incdec.ptr8, %while.body ]
%aligned_dst.055 = phi i32* [ %2, %while.body.lr.ph ], [
%incdec.ptr9, %while.body ]
%incdec.ptr = getelementptr inbounds i32* %aligned_src.056, i32 1
%11 = load i32* %aligned_src.056, align 4, !tbaa !41
%incdec.ptr3 = getelementptr inbounds i32* %aligned_dst.055, i32 1
store i32 %11, i32* %aligned_dst.055, align 4, !tbaa !41
%incdec.ptr4 = getelementptr inbounds i32* %aligned_src.056, i32 2
%12 = load i32* %incdec.ptr, align 4, !tbaa !41
%incdec.ptr5 = getelementptr inbounds i32* %aligned_dst.055, i32 2
store i32 %12, i32* %incdec.ptr3, align 4, !tbaa !41
%incdec.ptr6 = getelementptr inbounds i32* %aligned_src.056, i32 3
%13 = load i32* %incdec.ptr4, align 4, !tbaa !41
%incdec.ptr7 = getelementptr inbounds i32* %aligned_dst.055, i32 3
store i32 %13, i32* %incdec.ptr5, align 4, !tbaa !41
%incdec.ptr8 = getelementptr inbounds i32* %aligned_src.056, i32 4
%14 = load i32* %incdec.ptr6, align 4, !tbaa !41
%incdec.ptr9 = getelementptr inbounds i32* %aligned_dst.055, i32 4
store i32 %14, i32* %incdec.ptr7, align 4, !tbaa !41
%sub = add i32 %len.057, -16
%cmp2 = icmp ugt i32 %sub, 15
br i1 %cmp2, label %while.body, label %while.cond10.preheader
while.body12: ; preds =
%while.body12, %while.body12.lr.ph
%len.151 = phi i32 [ %7, %while.body12.lr.ph ], [ %sub15, %while.body12 ]
%aligned_src.150 = phi i32* [ %scevgep6465, %while.body12.lr.ph ], [
%incdec.ptr13, %while.body12 ]
%aligned_dst.149 = phi i32* [ %scevgep6263, %while.body12.lr.ph ], [
%incdec.ptr14, %while.body12 ]
%incdec.ptr13 = getelementptr inbounds i32* %aligned_src.150, i32 1
%15 = load i32* %aligned_src.150, align 4, !tbaa !41
%incdec.ptr14 = getelementptr inbounds i32* %aligned_dst.149, i32 1
store i32 %15, i32* %aligned_dst.149, align 4, !tbaa !41
%sub15 = add i32 %len.151, -4
%cmp11 = icmp ugt i32 %sub15, 3
br i1 %cmp11, label %while.body12, label
%while.cond10.while.end16_crit_edge
while.cond10.while.end16_crit_edge: ; preds = %while.body12
%16 = shl nuw i32 %9, 2
%scevgep = getelementptr i32* %scevgep6263, i32 %10
%17 = sub i32 %8, %16
%scevgep61 = getelementptr i32* %scevgep6465, i32 %10
br label %while.end16
while.end16: ; preds =
%while.cond10.while.end16_crit_edge, %while.cond10.preheader
%len.1.lcssa = phi i32 [ %17, %while.cond10.while.end16_crit_edge ],
[ %7, %while.cond10.preheader ]
%aligned_src.1.lcssa = phi i32* [ %scevgep61,
%while.cond10.while.end16_crit_edge ], [ %scevgep6465,
%while.cond10.preheader ]
%aligned_dst.1.lcssa = phi i32* [ %scevgep,
%while.cond10.while.end16_crit_edge ], [ %scevgep6263,
%while.cond10.preheader ]
%18 = bitcast i32* %aligned_dst.1.lcssa to i8*
%19 = bitcast i32* %aligned_src.1.lcssa to i8*
br label %while.cond17.preheader
while.cond17.preheader: ; preds =
%while.end16, %entry
%dst.0.ph = phi i8* [ %dst0, %entry ], [ %18, %while.end16 ]
%src.0.ph = phi i8* [ %src0, %entry ], [ %19, %while.end16 ]
%len.2.ph = phi i32 [ %len0, %entry ], [ %len.1.lcssa, %while.end16 ]
%tobool1844 = icmp eq i32 %len.2.ph, 0
br i1 %tobool1844, label %while.end22, label %while.body19.preheader
while.body19.preheader: ; preds =
%while.cond17.preheader, %land.lhs.true
%len.247.ph = phi i32 [ %len0, %land.lhs.true ], [ %len.2.ph,
%while.cond17.preheader ]
%src.046.ph = phi i8* [ %src0, %land.lhs.true ], [ %src.0.ph,
%while.cond17.preheader ]
%dst.045.ph = phi i8* [ %dst0, %land.lhs.true ], [ %dst.0.ph,
%while.cond17.preheader ]
br label %while.body19
while.body19: ; preds =
%while.body19, %while.body19.preheader
%len.247 = phi i32 [ %dec, %while.body19 ], [ %len.247.ph,
%while.body19.preheader ]
%src.046 = phi i8* [ %incdec.ptr20, %while.body19 ], [ %src.046.ph,
%while.body19.preheader ]
%dst.045 = phi i8* [ %incdec.ptr21, %while.body19 ], [ %dst.045.ph,
%while.body19.preheader ]
%dec = add nsw i32 %len.247, -1
%incdec.ptr20 = getelementptr inbounds i8* %src.046, i32 1
%20 = load i8* %src.046, align 1, !tbaa !8
%incdec.ptr21 = getelementptr inbounds i8* %dst.045, i32 1
store i8 %20, i8* %dst.045, align 1, !tbaa !8
%tobool18 = icmp eq i32 %dec, 0
br i1 %tobool18, label %while.end22.loopexit, label %while.body19
while.end22.loopexit: ; preds = %while.body19
br label %while.end22
while.end22: ; preds =
%while.end22.loopexit, %while.cond17.preheader
ret void
}
More information about the llvm-dev
mailing list