| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 1 | target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64" | 
|  | 2 | ; RUN: opt < %s -alignment-from-assumptions -S | FileCheck %s | 
| Sean Silva | a4c2d15 | 2016-06-15 06:18:01 +0000 | [diff] [blame] | 3 | ; RUN: opt < %s -passes=alignment-from-assumptions -S | FileCheck %s | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 4 |  | 
|  | 5 | define i32 @foo(i32* nocapture %a) nounwind uwtable readonly { | 
|  | 6 | entry: | 
|  | 7 | %ptrint = ptrtoint i32* %a to i64 | 
|  | 8 | %maskedptr = and i64 %ptrint, 31 | 
|  | 9 | %maskcond = icmp eq i64 %maskedptr, 0 | 
|  | 10 | tail call void @llvm.assume(i1 %maskcond) | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 11 | %0 = load i32, i32* %a, align 4 | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 12 | ret i32 %0 | 
|  | 13 |  | 
|  | 14 | ; CHECK-LABEL: @foo | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 15 | ; CHECK: load i32, i32* {{[^,]+}}, align 32 | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 16 | ; CHECK: ret i32 | 
|  | 17 | } | 
|  | 18 |  | 
|  | 19 | define i32 @foo2(i32* nocapture %a) nounwind uwtable readonly { | 
|  | 20 | entry: | 
|  | 21 | %ptrint = ptrtoint i32* %a to i64 | 
|  | 22 | %offsetptr = add i64 %ptrint, 24 | 
|  | 23 | %maskedptr = and i64 %offsetptr, 31 | 
|  | 24 | %maskcond = icmp eq i64 %maskedptr, 0 | 
|  | 25 | tail call void @llvm.assume(i1 %maskcond) | 
| David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 26 | %arrayidx = getelementptr inbounds i32, i32* %a, i64 2 | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 27 | %0 = load i32, i32* %arrayidx, align 4 | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 28 | ret i32 %0 | 
|  | 29 |  | 
|  | 30 | ; CHECK-LABEL: @foo2 | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 31 | ; CHECK: load i32, i32* {{[^,]+}}, align 16 | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 32 | ; CHECK: ret i32 | 
|  | 33 | } | 
|  | 34 |  | 
|  | 35 | define i32 @foo2a(i32* nocapture %a) nounwind uwtable readonly { | 
|  | 36 | entry: | 
|  | 37 | %ptrint = ptrtoint i32* %a to i64 | 
|  | 38 | %offsetptr = add i64 %ptrint, 28 | 
|  | 39 | %maskedptr = and i64 %offsetptr, 31 | 
|  | 40 | %maskcond = icmp eq i64 %maskedptr, 0 | 
|  | 41 | tail call void @llvm.assume(i1 %maskcond) | 
| David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 42 | %arrayidx = getelementptr inbounds i32, i32* %a, i64 -1 | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 43 | %0 = load i32, i32* %arrayidx, align 4 | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 44 | ret i32 %0 | 
|  | 45 |  | 
|  | 46 | ; CHECK-LABEL: @foo2a | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 47 | ; CHECK: load i32, i32* {{[^,]+}}, align 32 | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 48 | ; CHECK: ret i32 | 
|  | 49 | } | 
|  | 50 |  | 
|  | 51 | define i32 @goo(i32* nocapture %a) nounwind uwtable readonly { | 
|  | 52 | entry: | 
|  | 53 | %ptrint = ptrtoint i32* %a to i64 | 
|  | 54 | %maskedptr = and i64 %ptrint, 31 | 
|  | 55 | %maskcond = icmp eq i64 %maskedptr, 0 | 
|  | 56 | tail call void @llvm.assume(i1 %maskcond) | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 57 | %0 = load i32, i32* %a, align 4 | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 58 | ret i32 %0 | 
|  | 59 |  | 
|  | 60 | ; CHECK-LABEL: @goo | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 61 | ; CHECK: load i32, i32* {{[^,]+}}, align 32 | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 62 | ; CHECK: ret i32 | 
|  | 63 | } | 
|  | 64 |  | 
|  | 65 | define i32 @hoo(i32* nocapture %a) nounwind uwtable readonly { | 
|  | 66 | entry: | 
|  | 67 | %ptrint = ptrtoint i32* %a to i64 | 
|  | 68 | %maskedptr = and i64 %ptrint, 31 | 
|  | 69 | %maskcond = icmp eq i64 %maskedptr, 0 | 
|  | 70 | tail call void @llvm.assume(i1 %maskcond) | 
|  | 71 | br label %for.body | 
|  | 72 |  | 
|  | 73 | for.body:                                         ; preds = %entry, %for.body | 
|  | 74 | %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] | 
|  | 75 | %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ] | 
| David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 76 | %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 77 | %0 = load i32, i32* %arrayidx, align 4 | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 78 | %add = add nsw i32 %0, %r.06 | 
|  | 79 | %indvars.iv.next = add i64 %indvars.iv, 8 | 
|  | 80 | %1 = trunc i64 %indvars.iv.next to i32 | 
|  | 81 | %cmp = icmp slt i32 %1, 2048 | 
|  | 82 | br i1 %cmp, label %for.body, label %for.end | 
|  | 83 |  | 
|  | 84 | for.end:                                          ; preds = %for.body | 
|  | 85 | %add.lcssa = phi i32 [ %add, %for.body ] | 
|  | 86 | ret i32 %add.lcssa | 
|  | 87 |  | 
|  | 88 | ; CHECK-LABEL: @hoo | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 89 | ; CHECK: load i32, i32* %arrayidx, align 32 | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 90 | ; CHECK: ret i32 %add.lcssa | 
|  | 91 | } | 
|  | 92 |  | 
|  | 93 | define i32 @joo(i32* nocapture %a) nounwind uwtable readonly { | 
|  | 94 | entry: | 
|  | 95 | %ptrint = ptrtoint i32* %a to i64 | 
|  | 96 | %maskedptr = and i64 %ptrint, 31 | 
|  | 97 | %maskcond = icmp eq i64 %maskedptr, 0 | 
|  | 98 | tail call void @llvm.assume(i1 %maskcond) | 
|  | 99 | br label %for.body | 
|  | 100 |  | 
|  | 101 | for.body:                                         ; preds = %entry, %for.body | 
|  | 102 | %indvars.iv = phi i64 [ 4, %entry ], [ %indvars.iv.next, %for.body ] | 
|  | 103 | %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ] | 
| David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 104 | %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 105 | %0 = load i32, i32* %arrayidx, align 4 | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 106 | %add = add nsw i32 %0, %r.06 | 
|  | 107 | %indvars.iv.next = add i64 %indvars.iv, 8 | 
|  | 108 | %1 = trunc i64 %indvars.iv.next to i32 | 
|  | 109 | %cmp = icmp slt i32 %1, 2048 | 
|  | 110 | br i1 %cmp, label %for.body, label %for.end | 
|  | 111 |  | 
|  | 112 | for.end:                                          ; preds = %for.body | 
|  | 113 | %add.lcssa = phi i32 [ %add, %for.body ] | 
|  | 114 | ret i32 %add.lcssa | 
|  | 115 |  | 
|  | 116 | ; CHECK-LABEL: @joo | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 117 | ; CHECK: load i32, i32* %arrayidx, align 16 | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 118 | ; CHECK: ret i32 %add.lcssa | 
|  | 119 | } | 
|  | 120 |  | 
|  | 121 | define i32 @koo(i32* nocapture %a) nounwind uwtable readonly { | 
|  | 122 | entry: | 
|  | 123 | %ptrint = ptrtoint i32* %a to i64 | 
|  | 124 | %maskedptr = and i64 %ptrint, 31 | 
|  | 125 | %maskcond = icmp eq i64 %maskedptr, 0 | 
|  | 126 | tail call void @llvm.assume(i1 %maskcond) | 
|  | 127 | br label %for.body | 
|  | 128 |  | 
|  | 129 | for.body:                                         ; preds = %entry, %for.body | 
|  | 130 | %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] | 
|  | 131 | %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ] | 
| David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 132 | %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 133 | %0 = load i32, i32* %arrayidx, align 4 | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 134 | %add = add nsw i32 %0, %r.06 | 
|  | 135 | %indvars.iv.next = add i64 %indvars.iv, 4 | 
|  | 136 | %1 = trunc i64 %indvars.iv.next to i32 | 
|  | 137 | %cmp = icmp slt i32 %1, 2048 | 
|  | 138 | br i1 %cmp, label %for.body, label %for.end | 
|  | 139 |  | 
|  | 140 | for.end:                                          ; preds = %for.body | 
|  | 141 | %add.lcssa = phi i32 [ %add, %for.body ] | 
|  | 142 | ret i32 %add.lcssa | 
|  | 143 |  | 
|  | 144 | ; CHECK-LABEL: @koo | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 145 | ; CHECK: load i32, i32* %arrayidx, align 16 | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 146 | ; CHECK: ret i32 %add.lcssa | 
|  | 147 | } | 
|  | 148 |  | 
|  | 149 | define i32 @koo2(i32* nocapture %a) nounwind uwtable readonly { | 
|  | 150 | entry: | 
|  | 151 | %ptrint = ptrtoint i32* %a to i64 | 
|  | 152 | %maskedptr = and i64 %ptrint, 31 | 
|  | 153 | %maskcond = icmp eq i64 %maskedptr, 0 | 
|  | 154 | tail call void @llvm.assume(i1 %maskcond) | 
|  | 155 | br label %for.body | 
|  | 156 |  | 
|  | 157 | for.body:                                         ; preds = %entry, %for.body | 
|  | 158 | %indvars.iv = phi i64 [ -4, %entry ], [ %indvars.iv.next, %for.body ] | 
|  | 159 | %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ] | 
| David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 160 | %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 161 | %0 = load i32, i32* %arrayidx, align 4 | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 162 | %add = add nsw i32 %0, %r.06 | 
|  | 163 | %indvars.iv.next = add i64 %indvars.iv, 4 | 
|  | 164 | %1 = trunc i64 %indvars.iv.next to i32 | 
|  | 165 | %cmp = icmp slt i32 %1, 2048 | 
|  | 166 | br i1 %cmp, label %for.body, label %for.end | 
|  | 167 |  | 
|  | 168 | for.end:                                          ; preds = %for.body | 
|  | 169 | %add.lcssa = phi i32 [ %add, %for.body ] | 
|  | 170 | ret i32 %add.lcssa | 
|  | 171 |  | 
|  | 172 | ; CHECK-LABEL: @koo2 | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 173 | ; CHECK: load i32, i32* %arrayidx, align 16 | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 174 | ; CHECK: ret i32 %add.lcssa | 
|  | 175 | } | 
|  | 176 |  | 
|  | 177 | define i32 @moo(i32* nocapture %a) nounwind uwtable { | 
|  | 178 | entry: | 
|  | 179 | %ptrint = ptrtoint i32* %a to i64 | 
|  | 180 | %maskedptr = and i64 %ptrint, 31 | 
|  | 181 | %maskcond = icmp eq i64 %maskedptr, 0 | 
|  | 182 | tail call void @llvm.assume(i1 %maskcond) | 
|  | 183 | %0 = bitcast i32* %a to i8* | 
| Daniel Neilson | 1e68724 | 2018-01-19 17:13:12 +0000 | [diff] [blame] | 184 | tail call void @llvm.memset.p0i8.i64(i8* align 4 %0, i8 0, i64 64, i1 false) | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 185 | ret i32 undef | 
|  | 186 |  | 
|  | 187 | ; CHECK-LABEL: @moo | 
| Daniel Neilson | 1e68724 | 2018-01-19 17:13:12 +0000 | [diff] [blame] | 188 | ; CHECK: @llvm.memset.p0i8.i64(i8* align 32 %0, i8 0, i64 64, i1 false) | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 189 | ; CHECK: ret i32 undef | 
|  | 190 | } | 
|  | 191 |  | 
|  | 192 | define i32 @moo2(i32* nocapture %a, i32* nocapture %b) nounwind uwtable { | 
|  | 193 | entry: | 
|  | 194 | %ptrint = ptrtoint i32* %a to i64 | 
|  | 195 | %maskedptr = and i64 %ptrint, 31 | 
|  | 196 | %maskcond = icmp eq i64 %maskedptr, 0 | 
|  | 197 | tail call void @llvm.assume(i1 %maskcond) | 
|  | 198 | %ptrint1 = ptrtoint i32* %b to i64 | 
|  | 199 | %maskedptr3 = and i64 %ptrint1, 127 | 
|  | 200 | %maskcond4 = icmp eq i64 %maskedptr3, 0 | 
|  | 201 | tail call void @llvm.assume(i1 %maskcond4) | 
|  | 202 | %0 = bitcast i32* %a to i8* | 
|  | 203 | %1 = bitcast i32* %b to i8* | 
| Daniel Neilson | 1e68724 | 2018-01-19 17:13:12 +0000 | [diff] [blame] | 204 | tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %0, i8* align 4 %1, i64 64, i1 false) | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 205 | ret i32 undef | 
|  | 206 |  | 
|  | 207 | ; CHECK-LABEL: @moo2 | 
| Daniel Neilson | 1e68724 | 2018-01-19 17:13:12 +0000 | [diff] [blame] | 208 | ; CHECK: @llvm.memcpy.p0i8.p0i8.i64(i8* align 32 %0, i8* align 32 %1, i64 64, i1 false) | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 209 | ; CHECK: ret i32 undef | 
|  | 210 | } | 
|  | 211 |  | 
|  | 212 | declare void @llvm.assume(i1) nounwind | 
|  | 213 |  | 
| Daniel Neilson | 1e68724 | 2018-01-19 17:13:12 +0000 | [diff] [blame] | 214 | declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind | 
|  | 215 | declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind | 
| Hal Finkel | f83e1f7 | 2014-09-11 08:40:17 +0000 | [diff] [blame] | 216 |  |