blob: 29eeb1ce4dd28b655e491ade021e5685858923b5 [file] [log] [blame]
; Check that the runtime size computation is generated for Fortran arrays.
; Regular code generation backend:
; RUN: opt %loadPolly -S -polly-detect-fortran-arrays \
; RUN: -polly-codegen < %s | FileCheck %s
; What the input fortran code should look like. NOTE: this is fake, the
; .ll file was hand-written.
;
; MODULE testmod
; USE data_parameters, ONLY : &
; IMPLICIT NONE
;
; INTEGER (KIND=iintegers), ALLOCATABLE, PRIVATE :: &
; arrin(:), arrout(:)
; CONTAINS
;
; SUBROUTINE test()
; INTEGER (KIND=iintegers) :: i
;
; DO i = 1, 100
; arrout(i) = arrin(i) * arrin(i)
; END DO
; END SUBROUTINE test
; END MODULE testmod
target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i32:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"
module asm "\09.ident\09\22GCC: (GNU) 4.6.4 LLVM: 3.3.1\22"
%"struct.array1_real(kind=8)" = type { i8*, i32, i32, [1 x %struct.descriptor_dimension] }
%struct.descriptor_dimension = type { i32, i32, i32 }
@arrin = unnamed_addr global %"struct.array1_real(kind=8)" zeroinitializer, align 32
@arrout = unnamed_addr global %"struct.array1_real(kind=8)" zeroinitializer, align 32
; Function Attrs: nounwind uwtable
define void @__src_soil_MOD_terra1() unnamed_addr #0 {
entry:
br label %entry.split
entry.split: ; preds = %entry
%rawmemin1 = load i32*, i32** bitcast (%"struct.array1_real(kind=8)"* @arrin to i32**), align 32, !tbaa !0
%rawmemout2 = load i32*, i32** bitcast (%"struct.array1_real(kind=8)"* @arrout to i32**), align 32, !tbaa !0
br label %for.body
for.body: ; preds = %entry.split, %for.body
%indvars.iv = phi i64 [ 1, %entry.split ], [ %indvars.iv.next4, %for.body ]
%inslot = getelementptr inbounds i32, i32* %rawmemin1, i64 %indvars.iv
%inval = load i32, i32* %inslot, align 8
%outslot = getelementptr inbounds i32, i32* %rawmemout2, i64 %indvars.iv
%out = mul nsw i32 %inval, %inval
store i32 %out, i32* %outslot, align 8
%indvars.iv.next4 = add nuw nsw i64 %indvars.iv, 1
%exitcond = icmp eq i64 %indvars.iv.next4, 100
br i1 %exitcond, label %return, label %for.body
return: ; preds = %for.body
ret void
}
attributes #0 = { nounwind uwtable }
!0 = !{!1, !1, i32 0}
!1 = !{!"alias set 3: void*", !2}
!2 = distinct !{!2}
; CHECK: %MemRef_rawmemin1_end = load i32, i32* getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @arrin, i64 0, i32 3, i64 0, i32 2)
; CHECK-NEXT: %MemRef_rawmemin1_begin = load i32, i32* getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @arrin, i64 0, i32 3, i64 0, i32 1)
; CHECK-NEXT: %MemRef_rawmemin1_end_begin_delta = sub nsw i32 %MemRef_rawmemin1_end, %MemRef_rawmemin1_begin
; CHECK-NEXT: %MemRef_rawmemin1_size = add nsw i32 %MemRef_rawmemin1_end, 1
; CHECK-NEXT: %MemRef_rawmemout2_end = load i32, i32* getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @arrout, i64 0, i32 3, i64 0, i32 2)
; CHECK-NEXT: %MemRef_rawmemout2_begin = load i32, i32* getelementptr inbounds (%"struct.array1_real(kind=8)", %"struct.array1_real(kind=8)"* @arrout, i64 0, i32 3, i64 0, i32 1)
; CHECK-NEXT: %MemRef_rawmemout2_end_begin_delta = sub nsw i32 %MemRef_rawmemout2_end, %MemRef_rawmemout2_begin
; CHECK-NEXT: %MemRef_rawmemout2_size = add nsw i32 %MemRef_rawmemout2_end, 1