|
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