xref: /llvm-project/polly/test/ScopInfo/multiple-types-non-affine.ll (revision e1f056f692d869708c1898d9d65a69ac5584a0ed)
1; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-allow-differing-element-types '-passes=print<polly-function-scops>' -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s
2; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-allow-differing-element-types -passes=polly-codegen -polly-allow-nonaffine -disable-output
3;
4;    // Check that accessing one array with different types works,
5;    // even though some accesses are non-affine.
6;    void multiple_types(char *Short, short *Float, char *Double) {
7;      for (long i = 0; i < 100; i++) {
8;        Short[i] = *(short *)&Short[i & 8];
9;        Float[i] = *(float *)&Float[i & 8];
10;        Double[i] = *(double *)&Double[i & 8];
11;      }
12;    }
13;
14; CHECK:    Arrays {
15; CHECK:        i8 MemRef_Short[*]; // Element size 1
16; CHECK:        i16 MemRef_Float[*]; // Element size 2
17; CHECK:        i8 MemRef_Double[*]; // Element size 1
18; CHECK:    }
19;
20; CHECK: Statements {
21; CHECK-NEXT: Stmt_bb2
22; CHECK-NEXT: Domain :=
23; CHECK-NEXT:     { Stmt_bb2[i0] : 0 <= i0 <= 99 };
24; CHECK-NEXT: Schedule :=
25; CHECK-NEXT:     { Stmt_bb2[i0] -> [i0] };
26; CHECK-NEXT: ReadAccess :=       [Reduction Type: NONE] [Scalar: 0]
27; CHECK-NEXT:     { Stmt_bb2[i0] -> MemRef_Short[o0] : 0 <= o0 <= 9 and ((o0 >= 8 and 16*floor((8 + i0)/16) > i0) or (o0 <= 1 and 16*floor((8 + i0)/16) <= i0)) };
28; CHECK-NEXT: MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 0]
29; CHECK-NEXT:     { Stmt_bb2[i0] -> MemRef_Short[i0] };
30; CHECK-NEXT: ReadAccess :=       [Reduction Type: NONE] [Scalar: 0]
31; CHECK-NEXT:     { Stmt_bb2[i0] -> MemRef_Float[o0] : 0 <= o0 <= 9 and ((o0 >= 8 and 16*floor((8 + i0)/16) > i0) or (o0 <= 1 and 16*floor((8 + i0)/16) <= i0)) };
32; CHECK-NEXT: MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 0]
33; CHECK-NEXT:     { Stmt_bb2[i0] -> MemRef_Float[i0] };
34; CHECK-NEXT: ReadAccess :=       [Reduction Type: NONE] [Scalar: 0]
35; CHECK-NEXT:     { Stmt_bb2[i0] -> MemRef_Double[o0] : 0 <= o0 <= 15 and ((o0 >= 8 and 16*floor((8 + i0)/16) > i0) or (o0 <= 7 and 16*floor((8 + i0)/16) <= i0)) };
36; CHECK-NEXT: MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 0]
37; CHECK-NEXT:     { Stmt_bb2[i0] -> MemRef_Double[i0] };
38; CHECK-NEXT: }
39
40target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
41
42define void @multiple_types(ptr noalias %Short, ptr noalias %Float, ptr noalias %Double) {
43bb:
44  br label %bb1
45
46bb1:                                              ; preds = %bb20, %bb
47  %i.0 = phi i64 [ 0, %bb ], [ %tmp21, %bb20 ]
48  %exitcond = icmp ne i64 %i.0, 100
49  br i1 %exitcond, label %bb2, label %bb22
50
51bb2:                                              ; preds = %bb1
52  %quad = and i64 %i.0, 8
53  %tmp3 = getelementptr inbounds i8, ptr %Short, i64 %quad
54  %tmp5 = load i16, ptr %tmp3, align 2
55  %tmp6 = trunc i16 %tmp5 to i8
56  %tmp7 = getelementptr inbounds i8, ptr %Short, i64 %i.0
57  store i8 %tmp6, ptr %tmp7, align 1
58  %tmp9 = getelementptr inbounds i16, ptr %Float, i64 %quad
59  %tmp11 = load float, ptr %tmp9, align 4
60  %tmp12 = fptosi float %tmp11 to i16
61  %tmp13 = getelementptr inbounds i16, ptr %Float, i64 %i.0
62  store i16 %tmp12, ptr %tmp13, align 1
63  %tmp15 = getelementptr inbounds i8, ptr %Double, i64 %quad
64  %tmp17 = load double, ptr %tmp15, align 8
65  %tmp18 = fptosi double %tmp17 to i8
66  %tmp19 = getelementptr inbounds i8, ptr %Double, i64 %i.0
67  store i8 %tmp18, ptr %tmp19, align 1
68  br label %bb20
69
70bb20:                                             ; preds = %bb2
71  %tmp21 = add nuw nsw i64 %i.0, 1
72  br label %bb1
73
74bb22:                                             ; preds = %bb1
75  ret void
76}
77