[llvm-dev] Is the instruction %4 = select i1 %tobool.i, metadata !12, metadata !10 legal?
David Majnemer via llvm-dev
llvm-dev at lists.llvm.org
Fri Dec 2 14:04:00 PST 2016
I cannot reproduce this in LLVM r288194. Your IR seems to be quite
non-typical with intrinsics like "@llvm..fakeload.p0p0i32"...
I'm not sure what you have here but it can be explained if you have
branched off of some older LLVM. Hal fixed a bug that looked just like
this one in r280866:
https://github.com/llvm-mirror/llvm/commit/9e7800b23b43fa5f2ada1be28e71fb81f3f38437
On Fri, Dec 2, 2016 at 11:08 AM, Lin, Jin via llvm-dev <
llvm-dev at lists.llvm.org> wrote:
> To reproduce the issue, please use the command line "opt -simplifycfg
> filename".
>
> target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
> target triple = "x86_64-unknown-linux-gnu"
>
> %struct.G = type { %struct.ordered_index_node*, i32 }
> %struct.ordered_index_node = type { %struct.B, %struct.F }
> %struct.B = type { i32 }
> %struct.F = type { i32*, i32* }
>
> $_ZN1G13final_insert_Ev = comdat any
>
> $_ZN1G7insert_Ev = comdat any
>
> $_ZN1F4leftEv = comdat any
>
> $_ZN1F5rightEv = comdat any
>
> ; Function Attrs: uwtable
> define void @_Z3fn1v() local_unnamed_addr #0 {
> entry:
> %t = alloca %struct.G, align 8
> %0 = bitcast %struct.G* %t to i8*
> call void @llvm.lifetime.start(i64 16, i8* %0) #5
> call void @_ZN1G13final_insert_Ev(%struct.G* nonnull %t)
> call void @llvm.lifetime.end(i64 16, i8* %0) #5
> ret void
> }
>
> ; Function Attrs: argmemonly nounwind
> declare void @llvm.lifetime.start(i64, i8* nocapture) #1
>
> ; Function Attrs: uwtable
> define linkonce_odr void @_ZN1G13final_insert_Ev(%struct.G* %this)
> local_unnamed_addr #0 comdat align 2 {
> entry:
> %call = call dereferenceable(16) %struct.G* @_ZN1G5finalEv(%struct.G*
> %this)
> %link_point_c.i = getelementptr inbounds %struct.G, %struct.G* %call,
> i64 0, i32 1
> %0 = load i32, i32* %link_point_c.i, align 8, !tbaa !1
> %tobool.i = icmp eq i32 %0, 0
> %1 = bitcast %struct.G* %call to i8**
> %2 = load i8*, i8** %1, align 8, !tbaa !7
> br i1 %tobool.i, label %cond.false.i, label %cond.true.i
>
> cond.true.i: ; preds = %entry
> %add.ptr.i = getelementptr inbounds i8, i8* %2, i64 8
> %left_.i.i = bitcast i8* %add.ptr.i to i32**
> %3 = call i32** @llvm..fakeload.p0p0i32(i32** %left_.i.i, metadata !8) #5
> br label %_ZN1G7insert_Ev.exit
>
> cond.false.i: ; preds = %entry
> %right_.i.i = getelementptr inbounds i8, i8* %2, i64 16
> %4 = bitcast i8* %right_.i.i to i32**
> %5 = call i32** @llvm..fakeload.p0p0i32(i32** %4, metadata !11) #5
> br label %_ZN1G7insert_Ev.exit
>
> _ZN1G7insert_Ev.exit: ; preds = %cond.true.i,
> %cond.false.i
> %call4.sink.i = phi i32** [ %5, %cond.false.i ], [ %3, %cond.true.i ]
> %6 = load i32*, i32** %call4.sink.i, align 8, !tbaa !12
> call void @_ZN18ordered_index_node9from_implEPi(i32* %6)
> ret void
> }
>
> ; Function Attrs: argmemonly nounwind
> declare void @llvm.lifetime.end(i64, i8* nocapture) #1
>
> declare dereferenceable(16) %struct.G* @_ZN1G5finalEv(%struct.G*)
> local_unnamed_addr #2
>
> ; Function Attrs: uwtable
> define linkonce_odr void @_ZN1G7insert_Ev(%struct.G* %this)
> local_unnamed_addr #0 comdat align 2 {
> entry:
> %link_point_c = getelementptr inbounds %struct.G, %struct.G* %this, i64
> 0, i32 1
> %0 = load i32, i32* %link_point_c, align 8, !tbaa !1
> %tobool = icmp eq i32 %0, 0
> %1 = bitcast %struct.G* %this to i8**
> %2 = load i8*, i8** %1, align 8, !tbaa !7
> br i1 %tobool, label %cond.false, label %cond.true
>
> cond.true: ; preds = %entry
> %add.ptr = getelementptr inbounds i8, i8* %2, i64 8
> %left_.i = bitcast i8* %add.ptr to i32**
> %3 = call i32** @llvm..fakeload.p0p0i32(i32** %left_.i, metadata !8) #5
> br label %cond.end
>
> cond.false: ; preds = %entry
> %right_.i = getelementptr inbounds i8, i8* %2, i64 16
> %4 = bitcast i8* %right_.i to i32**
> %5 = call i32** @llvm..fakeload.p0p0i32(i32** %4, metadata !11) #5
> br label %cond.end
>
> cond.end: ; preds = %cond.false,
> %cond.true
> %call4.sink = phi i32** [ %5, %cond.false ], [ %3, %cond.true ]
> %6 = load i32*, i32** %call4.sink, align 8, !tbaa !12
> call void @_ZN18ordered_index_node9from_implEPi(i32* %6)
> ret void
> }
>
> declare void @_ZN18ordered_index_node9from_implEPi(i32*)
> local_unnamed_addr #2
>
> ; Function Attrs: nounwind uwtable
> define linkonce_odr dereferenceable(8) i32** @_ZN1F4leftEv(%struct.F*
> %this) local_unnamed_addr #3 comdat align 2 {
> entry:
> %left_ = getelementptr inbounds %struct.F, %struct.F* %this, i64 0, i32 0
> %0 = call i32** @llvm..fakeload.p0p0i32(i32** %left_, metadata !8) #5
> ret i32** %0
> }
>
> ; Function Attrs: nounwind uwtable
> define linkonce_odr dereferenceable(8) i32** @_ZN1F5rightEv(%struct.F*
> %this) local_unnamed_addr #3 comdat align 2 {
> entry:
> %right_ = getelementptr inbounds %struct.F, %struct.F* %this, i64 0, i32
> 1
> %0 = call i32** @llvm..fakeload.p0p0i32(i32** %right_, metadata !11) #5
> ret i32** %0
> }
>
> ; Function Attrs: nounwind readnone
> declare i32** @llvm..fakeload.p0p0i32(i32**, metadata) #4
>
> attributes #0 = { uwtable "correctly-rounded-divide-sqrt-fp-math"="false"
> "disable-tail-calls"="false" "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="false" "no-infs-fp-math"="false"
> "no-jump-tables"="false" "no-nans-fp-math"="false"
> "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8"
> "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87"
> "unsafe-fp-math"="false" "use-soft-float"="false" }
> attributes #1 = { argmemonly nounwind }
> attributes #2 = { "correctly-rounded-divide-sqrt-fp-math"="false"
> "disable-tail-calls"="false" "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="false" "no-infs-fp-math"="false"
> "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false"
> "stack-protector-buffer-size"="8" "target-cpu"="x86-64"
> "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false"
> "use-soft-float"="false" }
> attributes #3 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false"
> "disable-tail-calls"="false" "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="false" "no-infs-fp-math"="false"
> "no-jump-tables"="false" "no-nans-fp-math"="false"
> "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8"
> "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87"
> "unsafe-fp-math"="false" "use-soft-float"="false" }
> attributes #4 = { nounwind readnone }
> attributes #5 = { nounwind }
>
> !llvm.ident = !{!0}
>
> !0 = !{!"clang version 4.0.0 (branches/20501)"}
> !1 = !{!2, !6, i64 8}
> !2 = !{!"struct at _ZTS1G", !3, i64 0, !6, i64 8}
> !3 = !{!"pointer at _ZTSP18ordered_index_node", !4, i64 0}
> !4 = !{!"omnipotent char", !5, i64 0}
> !5 = !{!"Simple C++ TBAA"}
> !6 = !{!"int", !4, i64 0}
> !7 = !{!2, !3, i64 0}
> !8 = !{!9, !10, i64 0}
> !9 = !{!"struct at _ZTS1F", !10, i64 0, !10, i64 8}
> !10 = !{!"pointer at _ZTSPi", !4, i64 0}
> !11 = !{!9, !10, i64 8}
> !12 = !{!10, !10, i64 0}
> -----Original Message-----
> From: Caldarale, Charles R [mailto:Chuck.Caldarale at unisys.com]
> Sent: Friday, December 2, 2016 10:51 AM
> To: Lin, Jin <jin.lin at intel.com>; llvm-dev at lists.llvm.org
> Subject: RE: Is the instruction %4 = select i1 %tobool.i, metadata !12,
> metadata !10 legal?
>
> > From: llvm-dev [mailto:llvm-dev-bounces at lists.llvm.org]
> > On Behalf Of Lin, Jin via llvm-dev
> > Subject: [llvm-dev] Is the instruction %4 = select i1 %tobool.i,
> metadata !12, metadata !10 legal?
>
> > I wonder whether this is valid LLVM IR:
> > %4 = select i1 %tobool.i, metadata !12, metadata !10
>
> > Before CFGSimplify
> > cond.true.i: ; preds = %entry
> > %add.ptr.i = getelementptr inbounds i8, i8* %2, i64 8
> > %left_.i.i = bitcast i8* %add.ptr.i to i32**
> > %3 = call i32** @llvm.fakeload.p0p0i32(i32** %left_.i.i, metadata !8)
> #6 br label %_ZN1G7insert_Ev.exit
> > cond.false.i: ; preds = %entry
> > %right_.i.i = getelementptr inbounds i8, i8* %2, i64 16
> > %4 = bitcast i8* %right_.i.i to i32**
> > %5 = call i32** @llvm.fakeload.p0p0i32(i32** %4, metadata !11) #6
> > br label %_ZN1G7insert_Ev.exit
>
> > After CFGSimplify
> > %4 = select i1 %tobool.i, metadata !12, metadata !10
> > %add.ptr.i = getelementptr inbounds i8, i8* %2, i64 %3
> > %left_.i.i = bitcast i8* %add.ptr.i to i32**
> > %5 = call i32** @llvm.fakeload.p0p0i32(i32** %left_.i.i, metadata %4) #6
> > %6 = load i32*, i32** %5, align 8, !tbaa !8
>
> Is there any more to the original IR? I don't think CFGSimplify would have
> magically created %tobool.i, yet it doesn't appear in the provided before
> snippet.
>
> - Chuck
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20161202/6ed1eae4/attachment.html>
More information about the llvm-dev
mailing list