forked from OSchip/llvm-project
97 lines
4.7 KiB
LLVM
97 lines
4.7 KiB
LLVM
; RUN: opt %loadPolly -polly-print-scops -polly-print-delicm -disable-output < %s | FileCheck %s
|
|
;
|
|
; llvm.org/PR48783
|
|
;
|
|
; PHI predecessors of statement instances can only be reliably derived in defined behaviour situations. In this case, the inner loop's counter would overflow when its upper bound (%call24) is lower than its lower bound (2). However, due to the nsw flag, this would be undefined behavior and therefore not added to any runtime-check context, but to the defined-behaviour context.
|
|
;
|
|
; Dereived from test case pr41656.ll
|
|
;
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
|
|
define dso_local void @main() local_unnamed_addr #0 {
|
|
entry:
|
|
%call24 = tail call i32 @av_get_channel_layout_nb_channels() #2
|
|
br label %if.end30
|
|
|
|
if.end30: ; preds = %entry
|
|
br i1 undef, label %if.then40, label %do.body.preheader
|
|
|
|
do.body.preheader: ; preds = %if.end30
|
|
%idx.ext.i = sext i32 %call24 to i64
|
|
%wide.trip.count.i = zext i32 %call24 to i64
|
|
%0 = load double*, double** undef, align 8, !tbaa !1
|
|
br label %for.body.us.preheader.i
|
|
|
|
if.then40: ; preds = %if.end30
|
|
unreachable
|
|
|
|
for.body.us.preheader.i: ; preds = %do.body.preheader
|
|
br i1 false, label %for.body.us.i.us, label %for.body.us.i
|
|
|
|
for.body.us.i.us: ; preds = %for.body.us.preheader.i
|
|
br label %fill_samples.exit
|
|
|
|
for.body.us.i: ; preds = %for.cond2.for.end_crit_edge.us.i, %for.body.us.preheader.i
|
|
%t.1 = phi double [ undef, %for.cond2.for.end_crit_edge.us.i ], [ 0.000000e+00, %for.body.us.preheader.i ]
|
|
%i.05.us.i = phi i32 [ %inc8.us.i, %for.cond2.for.end_crit_edge.us.i ], [ 0, %for.body.us.preheader.i ]
|
|
%dstp.03.us.i = phi double* [ %add.ptr.us.i, %for.cond2.for.end_crit_edge.us.i ], [ %0, %for.body.us.preheader.i ]
|
|
%mul.us.i = fmul nsz double %t.1, 0x40A59933FC6A96C1
|
|
%1 = call nsz double @llvm.sin.f64(double %mul.us.i) #2
|
|
store double %1, double* %dstp.03.us.i, align 8, !tbaa !5
|
|
%2 = bitcast double* %dstp.03.us.i to i64*
|
|
br label %for.body5.us.for.body5.us_crit_edge.i
|
|
|
|
for.body5.us.for.body5.us_crit_edge.i: ; preds = %for.body5.us.for.body5.us_crit_edge.i.for.body5.us.for.body5.us_crit_edge.i_crit_edge, %for.body.us.i
|
|
%indvars.iv.next.i66 = phi i64 [ 2, %for.body.us.i ], [ %indvars.iv.next.i, %for.body5.us.for.body5.us_crit_edge.i.for.body5.us.for.body5.us_crit_edge.i_crit_edge ]
|
|
%indvars.iv.next.i = add nuw nsw i64 %indvars.iv.next.i66, 1
|
|
udiv i64 1, %indvars.iv.next.i
|
|
%exitcond.i = icmp eq i64 %indvars.iv.next.i, %wide.trip.count.i
|
|
br i1 %exitcond.i, label %for.cond2.for.end_crit_edge.us.i, label %for.body5.us.for.body5.us_crit_edge.i.for.body5.us.for.body5.us_crit_edge.i_crit_edge
|
|
|
|
for.body5.us.for.body5.us_crit_edge.i.for.body5.us.for.body5.us_crit_edge.i_crit_edge: ; preds = %for.body5.us.for.body5.us_crit_edge.i
|
|
%.pre10.i.pre = load i64, i64* %2, align 8, !tbaa !5
|
|
br label %for.body5.us.for.body5.us_crit_edge.i
|
|
|
|
for.cond2.for.end_crit_edge.us.i: ; preds = %for.body5.us.for.body5.us_crit_edge.i
|
|
%add.ptr.us.i = getelementptr inbounds double, double* %dstp.03.us.i, i64 %idx.ext.i
|
|
%inc8.us.i = add nuw nsw i32 %i.05.us.i, 1
|
|
%exitcond7.i = icmp eq i32 %inc8.us.i, 1024
|
|
br i1 %exitcond7.i, label %fill_samples.exit, label %for.body.us.i
|
|
|
|
fill_samples.exit: ; preds = %for.cond2.for.end_crit_edge.us.i, %for.body.us.i.us
|
|
ret void
|
|
}
|
|
|
|
declare dso_local i32 @av_get_channel_layout_nb_channels() local_unnamed_addr #0
|
|
|
|
; Function Attrs: nounwind readnone speculatable
|
|
declare double @llvm.sin.f64(double) #1
|
|
|
|
attributes #0 = { "use-soft-float"="false" }
|
|
attributes #1 = { nounwind readnone speculatable }
|
|
attributes #2 = { nounwind }
|
|
|
|
!llvm.ident = !{!0}
|
|
|
|
!0 = !{!"clang version 9.0.0 (https://github.com/llvm/llvm-project.git 2436237895b70ed44cf256f67eb2f74e147eb559)"}
|
|
!1 = !{!2, !2, i64 0}
|
|
!2 = !{!"any pointer", !3, i64 0}
|
|
!3 = !{!"omnipotent char", !4, i64 0}
|
|
!4 = !{!"Simple C/C++ TBAA"}
|
|
!5 = !{!6, !6, i64 0}
|
|
!6 = !{!"double", !3, i64 0}
|
|
|
|
|
|
; CHECK: Invalid Context:
|
|
; CHECK-NEXT: [call24] -> { : false }
|
|
; CHECK: Defined Behavior Context:
|
|
; CHECK-NEXT: [call24] -> { : 3 <= call24 <= 2147483647 }
|
|
|
|
; Only write to scalar if call24 >= 3 (i.e. has defined behavior)
|
|
; Since it should be never executed otherwise, the condition is not strictly necessary.
|
|
; CHECK-LABEL: DeLICM result:
|
|
; CHECK: Stmt_for_body_us_preheader_i
|
|
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
|
|
; CHECK-NEXT: [call24] -> { Stmt_for_body_us_preheader_i[] -> MemRef_t_1__phi[] };
|
|
; CHECK-NEXT: new: [call24] -> { Stmt_for_body_us_preheader_i[] -> MemRef1[0, 0] : call24 >= 3 };
|