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