|
1 |
| -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
2 |
| -; RUN: opt -passes='require<phi-values>,gvn' -S < %s | FileCheck %s |
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
| 2 | +; RUN: opt -passes='require<phi-values>,gvn' -S < %s | FileCheck %s --check-prefixes=CHECK-MEMDEP |
| 3 | +; RUN: opt -passes='require<phi-values>,gvn<memoryssa>' -S < %s | FileCheck %s --check-prefixes=CHECK-MEMSSA |
3 | 4 |
|
4 | 5 | declare noalias ptr @malloc(i64)
|
5 | 6 |
|
6 | 7 | ; Detecting that %s is fully redundant should let us detect that %w is partially
|
7 | 8 | ; redundant.
|
8 | 9 | define void @fn1(ptr noalias %start, ptr %width, i32 %h) {
|
9 |
| -; CHECK-LABEL: @fn1( |
10 |
| -; CHECK-NEXT: entry: |
11 |
| -; CHECK-NEXT: [[CALL:%.*]] = tail call noalias ptr @malloc(i64 1024) |
12 |
| -; CHECK-NEXT: store ptr [[CALL]], ptr [[START:%.*]], align 8 |
13 |
| -; CHECK-NEXT: br label [[PREHEADER:%.*]] |
14 |
| -; CHECK: preheader: |
15 |
| -; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 1, [[H:%.*]] |
16 |
| -; CHECK-NEXT: br i1 [[CMP]], label [[PREHEADER_BODY_CRIT_EDGE:%.*]], label [[EXIT:%.*]] |
17 |
| -; CHECK: preheader.body_crit_edge: |
18 |
| -; CHECK-NEXT: [[W_PRE:%.*]] = load i32, ptr [[WIDTH:%.*]], align 8 |
19 |
| -; CHECK-NEXT: br label [[BODY:%.*]] |
20 |
| -; CHECK: body: |
21 |
| -; CHECK-NEXT: [[J:%.*]] = phi i32 [ 0, [[PREHEADER_BODY_CRIT_EDGE]] ], [ [[J_NEXT:%.*]], [[BODY]] ] |
22 |
| -; CHECK-NEXT: store i32 0, ptr [[CALL]], align 4 |
23 |
| -; CHECK-NEXT: [[J_NEXT]] = add nuw nsw i32 [[J]], 1 |
24 |
| -; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i32 [[J_NEXT]], [[W_PRE]] |
25 |
| -; CHECK-NEXT: br i1 [[CMP3]], label [[BODY]], label [[PREHEADER]] |
26 |
| -; CHECK: exit: |
27 |
| -; CHECK-NEXT: ret void |
| 10 | +; CHECK-MEMDEP-LABEL: define void @fn1( |
| 11 | +; CHECK-MEMDEP-SAME: ptr noalias [[START:%.*]], ptr [[WIDTH:%.*]], i32 [[H:%.*]]) { |
| 12 | +; CHECK-MEMDEP-NEXT: [[ENTRY:.*:]] |
| 13 | +; CHECK-MEMDEP-NEXT: [[CALL:%.*]] = tail call noalias ptr @malloc(i64 1024) |
| 14 | +; CHECK-MEMDEP-NEXT: store ptr [[CALL]], ptr [[START]], align 8 |
| 15 | +; CHECK-MEMDEP-NEXT: br label %[[PREHEADER:.*]] |
| 16 | +; CHECK-MEMDEP: [[PREHEADER]]: |
| 17 | +; CHECK-MEMDEP-NEXT: [[CMP:%.*]] = icmp slt i32 1, [[H]] |
| 18 | +; CHECK-MEMDEP-NEXT: br i1 [[CMP]], label %[[PREHEADER_BODY_CRIT_EDGE:.*]], label %[[EXIT:.*]] |
| 19 | +; CHECK-MEMDEP: [[PREHEADER_BODY_CRIT_EDGE]]: |
| 20 | +; CHECK-MEMDEP-NEXT: [[W_PRE:%.*]] = load i32, ptr [[WIDTH]], align 8 |
| 21 | +; CHECK-MEMDEP-NEXT: br label %[[BODY:.*]] |
| 22 | +; CHECK-MEMDEP: [[BODY]]: |
| 23 | +; CHECK-MEMDEP-NEXT: [[J:%.*]] = phi i32 [ 0, %[[PREHEADER_BODY_CRIT_EDGE]] ], [ [[J_NEXT:%.*]], %[[BODY]] ] |
| 24 | +; CHECK-MEMDEP-NEXT: store i32 0, ptr [[CALL]], align 4 |
| 25 | +; CHECK-MEMDEP-NEXT: [[J_NEXT]] = add nuw nsw i32 [[J]], 1 |
| 26 | +; CHECK-MEMDEP-NEXT: [[CMP3:%.*]] = icmp slt i32 [[J_NEXT]], [[W_PRE]] |
| 27 | +; CHECK-MEMDEP-NEXT: br i1 [[CMP3]], label %[[BODY]], label %[[PREHEADER]] |
| 28 | +; CHECK-MEMDEP: [[EXIT]]: |
| 29 | +; CHECK-MEMDEP-NEXT: ret void |
| 30 | +; |
| 31 | +; CHECK-MEMSSA-LABEL: define void @fn1( |
| 32 | +; CHECK-MEMSSA-SAME: ptr noalias [[START:%.*]], ptr [[WIDTH:%.*]], i32 [[H:%.*]]) { |
| 33 | +; CHECK-MEMSSA-NEXT: [[ENTRY:.*:]] |
| 34 | +; CHECK-MEMSSA-NEXT: [[CALL:%.*]] = tail call noalias ptr @malloc(i64 1024) |
| 35 | +; CHECK-MEMSSA-NEXT: store ptr [[CALL]], ptr [[START]], align 8 |
| 36 | +; CHECK-MEMSSA-NEXT: br label %[[PREHEADER:.*]] |
| 37 | +; CHECK-MEMSSA: [[PREHEADER]]: |
| 38 | +; CHECK-MEMSSA-NEXT: [[CMP:%.*]] = icmp slt i32 1, [[H]] |
| 39 | +; CHECK-MEMSSA-NEXT: br i1 [[CMP]], label %[[BODY:.*]], label %[[EXIT:.*]] |
| 40 | +; CHECK-MEMSSA: [[BODY]]: |
| 41 | +; CHECK-MEMSSA-NEXT: [[J:%.*]] = phi i32 [ 0, %[[PREHEADER]] ], [ [[J_NEXT:%.*]], %[[BODY]] ] |
| 42 | +; CHECK-MEMSSA-NEXT: [[S:%.*]] = load ptr, ptr [[START]], align 8 |
| 43 | +; CHECK-MEMSSA-NEXT: store i32 0, ptr [[S]], align 4 |
| 44 | +; CHECK-MEMSSA-NEXT: [[J_NEXT]] = add nuw nsw i32 [[J]], 1 |
| 45 | +; CHECK-MEMSSA-NEXT: [[W:%.*]] = load i32, ptr [[WIDTH]], align 8 |
| 46 | +; CHECK-MEMSSA-NEXT: [[CMP3:%.*]] = icmp slt i32 [[J_NEXT]], [[W]] |
| 47 | +; CHECK-MEMSSA-NEXT: br i1 [[CMP3]], label %[[BODY]], label %[[PREHEADER]] |
| 48 | +; CHECK-MEMSSA: [[EXIT]]: |
| 49 | +; CHECK-MEMSSA-NEXT: ret void |
28 | 50 | ;
|
29 | 51 | entry:
|
30 | 52 | %call = tail call noalias ptr @malloc(i64 1024)
|
@@ -52,33 +74,61 @@ exit:
|
52 | 74 | ; %w is partially redundant requires alias analysis that can analyze those
|
53 | 75 | ; values.
|
54 | 76 | define void @fn2(ptr noalias %start, ptr %width, i32 %h, i32 %arg) {
|
55 |
| -; CHECK-LABEL: @fn2( |
56 |
| -; CHECK-NEXT: entry: |
57 |
| -; CHECK-NEXT: [[CALL:%.*]] = tail call noalias ptr @malloc(i64 1024) |
58 |
| -; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[ARG:%.*]], 0 |
59 |
| -; CHECK-NEXT: br i1 [[CMP1]], label [[IF:%.*]], label [[ELSE:%.*]] |
60 |
| -; CHECK: if: |
61 |
| -; CHECK-NEXT: store ptr [[CALL]], ptr [[START:%.*]], align 8 |
62 |
| -; CHECK-NEXT: br label [[PREHEADER:%.*]] |
63 |
| -; CHECK: else: |
64 |
| -; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[CALL]], i32 [[ARG]] |
65 |
| -; CHECK-NEXT: store ptr [[GEP]], ptr [[START]], align 8 |
66 |
| -; CHECK-NEXT: br label [[PREHEADER]] |
67 |
| -; CHECK: preheader: |
68 |
| -; CHECK-NEXT: [[S:%.*]] = phi ptr [ [[S]], [[BODY:%.*]] ], [ [[GEP]], [[ELSE]] ], [ [[CALL]], [[IF]] ] |
69 |
| -; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 1, [[H:%.*]] |
70 |
| -; CHECK-NEXT: br i1 [[CMP]], label [[PREHEADER_BODY_CRIT_EDGE:%.*]], label [[EXIT:%.*]] |
71 |
| -; CHECK: preheader.body_crit_edge: |
72 |
| -; CHECK-NEXT: [[W_PRE:%.*]] = load i32, ptr [[WIDTH:%.*]], align 8 |
73 |
| -; CHECK-NEXT: br label [[BODY]] |
74 |
| -; CHECK: body: |
75 |
| -; CHECK-NEXT: [[J:%.*]] = phi i32 [ 0, [[PREHEADER_BODY_CRIT_EDGE]] ], [ [[J_NEXT:%.*]], [[BODY]] ] |
76 |
| -; CHECK-NEXT: store i32 0, ptr [[S]], align 4 |
77 |
| -; CHECK-NEXT: [[J_NEXT]] = add nuw nsw i32 [[J]], 1 |
78 |
| -; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i32 [[J_NEXT]], [[W_PRE]] |
79 |
| -; CHECK-NEXT: br i1 [[CMP3]], label [[BODY]], label [[PREHEADER]] |
80 |
| -; CHECK: exit: |
81 |
| -; CHECK-NEXT: ret void |
| 77 | +; CHECK-MEMDEP-LABEL: define void @fn2( |
| 78 | +; CHECK-MEMDEP-SAME: ptr noalias [[START:%.*]], ptr [[WIDTH:%.*]], i32 [[H:%.*]], i32 [[ARG:%.*]]) { |
| 79 | +; CHECK-MEMDEP-NEXT: [[ENTRY:.*:]] |
| 80 | +; CHECK-MEMDEP-NEXT: [[CALL:%.*]] = tail call noalias ptr @malloc(i64 1024) |
| 81 | +; CHECK-MEMDEP-NEXT: [[CMP1:%.*]] = icmp slt i32 [[ARG]], 0 |
| 82 | +; CHECK-MEMDEP-NEXT: br i1 [[CMP1]], label %[[IF:.*]], label %[[ELSE:.*]] |
| 83 | +; CHECK-MEMDEP: [[IF]]: |
| 84 | +; CHECK-MEMDEP-NEXT: store ptr [[CALL]], ptr [[START]], align 8 |
| 85 | +; CHECK-MEMDEP-NEXT: br label %[[PREHEADER:.*]] |
| 86 | +; CHECK-MEMDEP: [[ELSE]]: |
| 87 | +; CHECK-MEMDEP-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[CALL]], i32 [[ARG]] |
| 88 | +; CHECK-MEMDEP-NEXT: store ptr [[GEP]], ptr [[START]], align 8 |
| 89 | +; CHECK-MEMDEP-NEXT: br label %[[PREHEADER]] |
| 90 | +; CHECK-MEMDEP: [[PREHEADER]]: |
| 91 | +; CHECK-MEMDEP-NEXT: [[S:%.*]] = phi ptr [ [[S]], %[[BODY:.*]] ], [ [[GEP]], %[[ELSE]] ], [ [[CALL]], %[[IF]] ] |
| 92 | +; CHECK-MEMDEP-NEXT: [[CMP:%.*]] = icmp slt i32 1, [[H]] |
| 93 | +; CHECK-MEMDEP-NEXT: br i1 [[CMP]], label %[[PREHEADER_BODY_CRIT_EDGE:.*]], label %[[EXIT:.*]] |
| 94 | +; CHECK-MEMDEP: [[PREHEADER_BODY_CRIT_EDGE]]: |
| 95 | +; CHECK-MEMDEP-NEXT: [[W_PRE:%.*]] = load i32, ptr [[WIDTH]], align 8 |
| 96 | +; CHECK-MEMDEP-NEXT: br label %[[BODY]] |
| 97 | +; CHECK-MEMDEP: [[BODY]]: |
| 98 | +; CHECK-MEMDEP-NEXT: [[J:%.*]] = phi i32 [ 0, %[[PREHEADER_BODY_CRIT_EDGE]] ], [ [[J_NEXT:%.*]], %[[BODY]] ] |
| 99 | +; CHECK-MEMDEP-NEXT: store i32 0, ptr [[S]], align 4 |
| 100 | +; CHECK-MEMDEP-NEXT: [[J_NEXT]] = add nuw nsw i32 [[J]], 1 |
| 101 | +; CHECK-MEMDEP-NEXT: [[CMP3:%.*]] = icmp slt i32 [[J_NEXT]], [[W_PRE]] |
| 102 | +; CHECK-MEMDEP-NEXT: br i1 [[CMP3]], label %[[BODY]], label %[[PREHEADER]] |
| 103 | +; CHECK-MEMDEP: [[EXIT]]: |
| 104 | +; CHECK-MEMDEP-NEXT: ret void |
| 105 | +; |
| 106 | +; CHECK-MEMSSA-LABEL: define void @fn2( |
| 107 | +; CHECK-MEMSSA-SAME: ptr noalias [[START:%.*]], ptr [[WIDTH:%.*]], i32 [[H:%.*]], i32 [[ARG:%.*]]) { |
| 108 | +; CHECK-MEMSSA-NEXT: [[ENTRY:.*:]] |
| 109 | +; CHECK-MEMSSA-NEXT: [[CALL:%.*]] = tail call noalias ptr @malloc(i64 1024) |
| 110 | +; CHECK-MEMSSA-NEXT: [[CMP1:%.*]] = icmp slt i32 [[ARG]], 0 |
| 111 | +; CHECK-MEMSSA-NEXT: br i1 [[CMP1]], label %[[IF:.*]], label %[[ELSE:.*]] |
| 112 | +; CHECK-MEMSSA: [[IF]]: |
| 113 | +; CHECK-MEMSSA-NEXT: store ptr [[CALL]], ptr [[START]], align 8 |
| 114 | +; CHECK-MEMSSA-NEXT: br label %[[PREHEADER:.*]] |
| 115 | +; CHECK-MEMSSA: [[ELSE]]: |
| 116 | +; CHECK-MEMSSA-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[CALL]], i32 [[ARG]] |
| 117 | +; CHECK-MEMSSA-NEXT: store ptr [[GEP]], ptr [[START]], align 8 |
| 118 | +; CHECK-MEMSSA-NEXT: br label %[[PREHEADER]] |
| 119 | +; CHECK-MEMSSA: [[PREHEADER]]: |
| 120 | +; CHECK-MEMSSA-NEXT: [[CMP:%.*]] = icmp slt i32 1, [[H]] |
| 121 | +; CHECK-MEMSSA-NEXT: br i1 [[CMP]], label %[[BODY:.*]], label %[[EXIT:.*]] |
| 122 | +; CHECK-MEMSSA: [[BODY]]: |
| 123 | +; CHECK-MEMSSA-NEXT: [[J:%.*]] = phi i32 [ 0, %[[PREHEADER]] ], [ [[J_NEXT:%.*]], %[[BODY]] ] |
| 124 | +; CHECK-MEMSSA-NEXT: [[S:%.*]] = load ptr, ptr [[START]], align 8 |
| 125 | +; CHECK-MEMSSA-NEXT: store i32 0, ptr [[S]], align 4 |
| 126 | +; CHECK-MEMSSA-NEXT: [[J_NEXT]] = add nuw nsw i32 [[J]], 1 |
| 127 | +; CHECK-MEMSSA-NEXT: [[W:%.*]] = load i32, ptr [[WIDTH]], align 8 |
| 128 | +; CHECK-MEMSSA-NEXT: [[CMP3:%.*]] = icmp slt i32 [[J_NEXT]], [[W]] |
| 129 | +; CHECK-MEMSSA-NEXT: br i1 [[CMP3]], label %[[BODY]], label %[[PREHEADER]] |
| 130 | +; CHECK-MEMSSA: [[EXIT]]: |
| 131 | +; CHECK-MEMSSA-NEXT: ret void |
82 | 132 | ;
|
83 | 133 | entry:
|
84 | 134 | %call = tail call noalias ptr @malloc(i64 1024)
|
|
0 commit comments