reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
; RUN: opt %loadPolly -polly-delicm -analyze < %s | FileCheck %s
;
; llvm.org/PR41656
; 
; This test case has an InvalidContext such that part of the predecessors
; of for.body.us.i lie within the invalid context. This causes a
; consistency check withing the invalid context of PR41656 to fail.
;
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
  %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}


; Only write to scalar if call24 >= 3 (i.e. not in invalid context)
; Since it should be never executed otherwise, the condition is not strictly necessary. 
; 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 };