Lin, Jin via llvm-dev
2016-Dec-02 19:08 UTC
[llvm-dev] Is the instruction %4 = select i1 %tobool.i, metadata !12, metadata !10 legal?
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 !8Is 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
David Majnemer via llvm-dev
2016-Dec-02 22:04 UTC
[llvm-dev] Is the instruction %4 = select i1 %tobool.i, metadata !12, metadata !10 legal?
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>
Lin, Jin via llvm-dev
2016-Dec-02 23:01 UTC
[llvm-dev] Is the instruction %4 = select i1 %tobool.i, metadata !12, metadata !10 legal?
Many thanks for pointing out this. We will see whether the problem will go away once the pull down from the community version is completed. From: David Majnemer [mailto:david.majnemer at gmail.com] Sent: Friday, December 2, 2016 2:04 PM To: Lin, Jin <jin.lin at intel.com> Cc: Caldarale, Charles R <Chuck.Caldarale at unisys.com>; llvm-dev at lists.llvm.org Subject: Re: [llvm-dev] Is the instruction %4 = select i1 %tobool.i, metadata !12, metadata !10 legal? 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<mailto: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<mailto:Chuck.Caldarale at unisys.com>] Sent: Friday, December 2, 2016 10:51 AM To: Lin, Jin <jin.lin at intel.com<mailto:jin.lin at intel.com>>; llvm-dev at lists.llvm.org<mailto: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<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 !8Is 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<mailto: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/2391a580/attachment.html>