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
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
  150
  151
  152
  153
  154
  155
  156
  157
  158
  159
  160
  161
  162
  163
  164
  165
  166
  167
  168
  169
  170
  171
  172
  173
  174
  175
  176
  177
  178
  179
; RUN: opt %loadPolly -polly-codegen -S \
; RUN: -polly-codegen-add-debug-printing \
; RUN: -polly-ignore-aliasing < %s | FileCheck %s

;    #define N 10
;    void foo(float A[restrict], double B[restrict], char C[restrict],
;             int D[restrict], long E[restrict]) {
;      for (long i = 0; i < N; i++)
;        A[i] += B[i] + C[i] + D[i] + E[i];
;    }
;
;    int main() {
;      float A[N];
;      double B[N];
;      char C[N];
;      int D[N];
;      long E[N];
;
;      for (long i = 0; i < N; i++) {
;        __sync_synchronize();
;        A[i] = B[i] = C[i] = D[i] = E[i] = 42;
;      }
;
;      foo(A, B, C, D, E);
;
;      return A[8];
;    }

; CHECK: @0 = private unnamed_addr addrspace(4) constant [11 x i8] c"Load from \00"
; CHECK: @1 = private unnamed_addr addrspace(4) constant [3 x i8] c": \00"
; CHECK: @2 = private unnamed_addr addrspace(4) constant [2 x i8] c"\0A\00"
; CHECK: @3 = private unnamed_addr constant [12 x i8] c"%s%ld%s%f%s\00"
; CHECK: @4 = private unnamed_addr addrspace(4) constant [11 x i8] c"Load from \00"
; CHECK: @5 = private unnamed_addr addrspace(4) constant [3 x i8] c": \00"
; CHECK: @6 = private unnamed_addr addrspace(4) constant [2 x i8] c"\0A\00"
; CHECK: @7 = private unnamed_addr constant [13 x i8] c"%s%ld%s%ld%s\00"
; CHECK: @8 = private unnamed_addr addrspace(4) constant [11 x i8] c"Load from \00"
; CHECK: @9 = private unnamed_addr addrspace(4) constant [3 x i8] c": \00"
; CHECK: @10 = private unnamed_addr addrspace(4) constant [2 x i8] c"\0A\00"
; CHECK: @11 = private unnamed_addr constant [13 x i8] c"%s%ld%s%ld%s\00"
; CHECK: @12 = private unnamed_addr addrspace(4) constant [11 x i8] c"Load from \00"
; CHECK: @13 = private unnamed_addr addrspace(4) constant [3 x i8] c": \00"
; CHECK: @14 = private unnamed_addr addrspace(4) constant [2 x i8] c"\0A\00"
; CHECK: @15 = private unnamed_addr constant [13 x i8] c"%s%ld%s%ld%s\00"
; CHECK: @16 = private unnamed_addr addrspace(4) constant [11 x i8] c"Load from \00"
; CHECK: @17 = private unnamed_addr addrspace(4) constant [3 x i8] c": \00"
; CHECK: @18 = private unnamed_addr addrspace(4) constant [2 x i8] c"\0A\00"
; CHECK: @19 = private unnamed_addr constant [12 x i8] c"%s%ld%s%f%s\00"
; CHECK: @20 = private unnamed_addr addrspace(4) constant [11 x i8] c"Store to  \00"
; CHECK: @21 = private unnamed_addr addrspace(4) constant [3 x i8] c": \00"
; CHECK: @22 = private unnamed_addr addrspace(4) constant [2 x i8] c"\0A\00"
; CHECK: @23 = private unnamed_addr constant [12 x i8] c"%s%ld%s%f%s\00"

; CHECK: %0 = ptrtoint double* %scevgep to i64
; CHECK: %1 = call i32 (...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @3, i32 0, i32 0), i8 addrspace(4)* getelementptr inbounds ([11 x i8], [11 x i8] addrspace(4)* @0, i32 0, i32 0), i64 %0, i8 addrspace(4)* getelementptr inbounds ([3 x i8], [3 x i8] addrspace(4)* @1, i32 0, i32 0), double %tmp3_p_scalar_, i8 addrspace(4)* getelementptr inbounds ([2 x i8], [2 x i8] addrspace(4)* @2, i32 0, i32 0))
; CHECK: %2 = call i32 @fflush(i8* null)
; CHECK: %scevgep1 = getelementptr i8, i8* %C, i64 %polly.indvar
; CHECK: %tmp5_p_scalar_ = load i8, i8* %scevgep1
; CHECK: %3 = ptrtoint i8* %scevgep1 to i64
; CHECK: %4 = sext i8 %tmp5_p_scalar_ to i64
; CHECK: %5 = call i32 (...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @7, i32 0, i32 0), i8 addrspace(4)* getelementptr inbounds ([11 x i8], [11 x i8] addrspace(4)* @4, i32 0, i32 0), i64 %3, i8 addrspace(4)* getelementptr inbounds ([3 x i8], [3 x i8] addrspace(4)* @5, i32 0, i32 0), i64 %4, i8 addrspace(4)* getelementptr inbounds ([2 x i8], [2 x i8] addrspace(4)* @6, i32 0, i32 0))
; CHECK: %6 = call i32 @fflush(i8* null)
; CHECK: %p_tmp6 = sitofp i8 %tmp5_p_scalar_ to double
; CHECK: %p_tmp7 = fadd double %tmp3_p_scalar_, %p_tmp6
; CHECK: %scevgep2 = getelementptr i32, i32* %D, i64 %polly.indvar
; CHECK: %tmp9_p_scalar_ = load i32, i32* %scevgep2
; CHECK: %7 = ptrtoint i32* %scevgep2 to i64
; CHECK: %8 = sext i32 %tmp9_p_scalar_ to i64
; CHECK: %9 = call i32 (...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @11, i32 0, i32 0), i8 addrspace(4)* getelementptr inbounds ([11 x i8], [11 x i8] addrspace(4)* @8, i32 0, i32 0), i64 %7, i8 addrspace(4)* getelementptr inbounds ([3 x i8], [3 x i8] addrspace(4)* @9, i32 0, i32 0), i64 %8, i8 addrspace(4)* getelementptr inbounds ([2 x i8], [2 x i8] addrspace(4)* @10, i32 0, i32 0))
; CHECK: %10 = call i32 @fflush(i8* null)
; CHECK: %p_tmp10 = sitofp i32 %tmp9_p_scalar_ to double
; CHECK: %p_tmp11 = fadd double %p_tmp7, %p_tmp10
; CHECK: %scevgep3 = getelementptr i64, i64* %E, i64 %polly.indvar
; CHECK: %tmp13_p_scalar_ = load i64, i64* %scevgep3
; CHECK: %11 = ptrtoint i64* %scevgep3 to i64
; CHECK: %12 = call i32 (...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @15, i32 0, i32 0), i8 addrspace(4)* getelementptr inbounds ([11 x i8], [11 x i8] addrspace(4)* @12, i32 0, i32 0), i64 %11, i8 addrspace(4)* getelementptr inbounds ([3 x i8], [3 x i8] addrspace(4)* @13, i32 0, i32 0), i64 %tmp13_p_scalar_, i8 addrspace(4)* getelementptr inbounds ([2 x i8], [2 x i8] addrspace(4)* @14, i32 0, i32 0))
; CHECK: %13 = call i32 @fflush(i8* null)
; CHECK: %p_tmp14 = sitofp i64 %tmp13_p_scalar_ to double
; CHECK: %p_tmp15 = fadd double %p_tmp11, %p_tmp14
; CHECK: %scevgep4 = getelementptr float, float* %A, i64 %polly.indvar
; CHECK: %tmp17_p_scalar_ = load float, float* %scevgep4
; CHECK: %14 = ptrtoint float* %scevgep4 to i64
; CHECK: %15 = fpext float %tmp17_p_scalar_ to double
; CHECK: %16 = call i32 (...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @19, i32 0, i32 0), i8 addrspace(4)* getelementptr inbounds ([11 x i8], [11 x i8] addrspace(4)* @16, i32 0, i32 0), i64 %14, i8 addrspace(4)* getelementptr inbounds ([3 x i8], [3 x i8] addrspace(4)* @17, i32 0, i32 0), double %15, i8 addrspace(4)* getelementptr inbounds ([2 x i8], [2 x i8] addrspace(4)* @18, i32 0, i32 0))
; CHECK: %17 = call i32 @fflush(i8* null)
; CHECK: %p_tmp18 = fpext float %tmp17_p_scalar_ to double
; CHECK: %p_tmp19 = fadd double %p_tmp18, %p_tmp15
; CHECK: %p_tmp20 = fptrunc double %p_tmp19 to float
; CHECK: %18 = ptrtoint float* %scevgep4 to i64
; CHECK: %19 = fpext float %p_tmp20 to double
; CHECK: %20 = call i32 (...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @23, i32 0, i32 0), i8 addrspace(4)* getelementptr inbounds ([11 x i8], [11 x i8] addrspace(4)* @20, i32 0, i32 0), i64 %18, i8 addrspace(4)* getelementptr inbounds ([3 x i8], [3 x i8] addrspace(4)* @21, i32 0, i32 0), double %19, i8 addrspace(4)* getelementptr inbounds ([2 x i8], [2 x i8] addrspace(4)* @22, i32 0, i32 0))
; CHECK: %21 = call i32 @fflush(i8* null)

target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"

define void @foo(float* noalias %A, double* noalias %B, i8* noalias %C, i32* noalias %D, i64* noalias %E) {
bb:
  br label %bb1

bb1:                                              ; preds = %bb21, %bb
  %i.0 = phi i64 [ 0, %bb ], [ %tmp22, %bb21 ]
  %exitcond = icmp ne i64 %i.0, 10
  br i1 %exitcond, label %bb2, label %bb23

bb2:                                              ; preds = %bb1
  %tmp = getelementptr inbounds double, double* %B, i64 %i.0
  %tmp3 = load double, double* %tmp, align 8
  %tmp4 = getelementptr inbounds i8, i8* %C, i64 %i.0
  %tmp5 = load i8, i8* %tmp4, align 1
  %tmp6 = sitofp i8 %tmp5 to double
  %tmp7 = fadd double %tmp3, %tmp6
  %tmp8 = getelementptr inbounds i32, i32* %D, i64 %i.0
  %tmp9 = load i32, i32* %tmp8, align 4
  %tmp10 = sitofp i32 %tmp9 to double
  %tmp11 = fadd double %tmp7, %tmp10
  %tmp12 = getelementptr inbounds i64, i64* %E, i64 %i.0
  %tmp13 = load i64, i64* %tmp12, align 8
  %tmp14 = sitofp i64 %tmp13 to double
  %tmp15 = fadd double %tmp11, %tmp14
  %tmp16 = getelementptr inbounds float, float* %A, i64 %i.0
  %tmp17 = load float, float* %tmp16, align 4
  %tmp18 = fpext float %tmp17 to double
  %tmp19 = fadd double %tmp18, %tmp15
  %tmp20 = fptrunc double %tmp19 to float
  store float %tmp20, float* %tmp16, align 4
  br label %bb21

bb21:                                             ; preds = %bb2
  %tmp22 = add nsw i64 %i.0, 1
  br label %bb1

bb23:                                             ; preds = %bb1
  ret void
}

define i32 @main() {
bb:
  %A = alloca [10 x float], align 16
  %B = alloca [10 x double], align 16
  %C = alloca [10 x i8], align 1
  %D = alloca [10 x i32], align 16
  %E = alloca [10 x i64], align 16
  br label %bb1

bb1:                                              ; preds = %bb7, %bb
  %i.0 = phi i64 [ 0, %bb ], [ %tmp8, %bb7 ]
  %exitcond = icmp ne i64 %i.0, 10
  br i1 %exitcond, label %bb2, label %bb9

bb2:                                              ; preds = %bb1
  fence seq_cst
  %tmp = getelementptr inbounds [10 x i64], [10 x i64]* %E, i64 0, i64 %i.0
  store i64 42, i64* %tmp, align 8
  %tmp3 = getelementptr inbounds [10 x i32], [10 x i32]* %D, i64 0, i64 %i.0
  store i32 42, i32* %tmp3, align 4
  %tmp4 = getelementptr inbounds [10 x i8], [10 x i8]* %C, i64 0, i64 %i.0
  store i8 42, i8* %tmp4, align 1
  %tmp5 = getelementptr inbounds [10 x double], [10 x double]* %B, i64 0, i64 %i.0
  store double 4.200000e+01, double* %tmp5, align 8
  %tmp6 = getelementptr inbounds [10 x float], [10 x float]* %A, i64 0, i64 %i.0
  store float 4.200000e+01, float* %tmp6, align 4
  br label %bb7

bb7:                                              ; preds = %bb2
  %tmp8 = add nsw i64 %i.0, 1
  br label %bb1

bb9:                                              ; preds = %bb1
  %tmp10 = getelementptr inbounds [10 x float], [10 x float]* %A, i64 0, i64 0
  %tmp11 = getelementptr inbounds [10 x double], [10 x double]* %B, i64 0, i64 0
  %tmp12 = getelementptr inbounds [10 x i8], [10 x i8]* %C, i64 0, i64 0
  %tmp13 = getelementptr inbounds [10 x i32], [10 x i32]* %D, i64 0, i64 0
  %tmp14 = getelementptr inbounds [10 x i64], [10 x i64]* %E, i64 0, i64 0
  call void @foo(float* %tmp10, double* %tmp11, i8* %tmp12, i32* %tmp13, i64* %tmp14)
  %tmp15 = getelementptr inbounds [10 x float], [10 x float]* %A, i64 0, i64 8
  %tmp16 = load float, float* %tmp15, align 16
  %tmp17 = fptosi float %tmp16 to i32
  ret i32 %tmp17
}