|
1 |
| -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
2 | 1 | ; RUN: opt %s -passes=loop-vectorize -hoist-runtime-checks=false -force-vector-width=4 -force-vector-interleave=1 -S | FileCheck %s
|
3 | 2 |
|
4 | 3 | target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
|
@@ -320,3 +319,61 @@ inner.exit:
|
320 | 319 | outer.exit:
|
321 | 320 | ret void
|
322 | 321 | }
|
| 322 | + |
| 323 | +define void @use_diff_checks_when_retrying_with_rt_checks(i64 %off, ptr %dst, ptr %src) { |
| 324 | +; CHECK-LABEL: @use_diff_checks_when_retrying_with_rt_checks( |
| 325 | +; CHECK-NEXT: entry: |
| 326 | +; CHECK-NEXT: br i1 false, label %scalar.ph, label %vector.memcheck |
| 327 | +; CHECK: vector.memcheck: |
| 328 | +; CHECK-NEXT: [[TMP0:%.*]] = shl i64 %off, 3 |
| 329 | +; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr %dst, i64 [[TMP0]] |
| 330 | +; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[TMP0]], 8000 |
| 331 | +; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr %dst, i64 [[TMP1]] |
| 332 | +; CHECK-NEXT: [[SCEVGEP2:%.*]] = getelementptr i8, ptr %dst, i64 8000 |
| 333 | +; CHECK-NEXT: [[SCEVGEP3:%.*]] = getelementptr i8, ptr %src, i64 8000 |
| 334 | +; CHECK-NEXT: [[SCEVGEP4:%.*]] = getelementptr i8, ptr %src, i64 8 |
| 335 | +; CHECK-NEXT: [[SCEVGEP5:%.*]] = getelementptr i8, ptr %src, i64 8008 |
| 336 | +; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[SCEVGEP]], [[SCEVGEP2]] |
| 337 | +; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr %dst, [[SCEVGEP1]] |
| 338 | +; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]] |
| 339 | +; CHECK-NEXT: [[BOUND06:%.*]] = icmp ult ptr [[SCEVGEP]], [[SCEVGEP3]] |
| 340 | +; CHECK-NEXT: [[BOUND17:%.*]] = icmp ult ptr %src, [[SCEVGEP1]] |
| 341 | +; CHECK-NEXT: [[FOUND_CONFLICT8:%.*]] = and i1 [[BOUND06]], [[BOUND17]] |
| 342 | +; CHECK-NEXT: [[CONFLICT_RDX:%.*]] = or i1 [[FOUND_CONFLICT]], [[FOUND_CONFLICT8]] |
| 343 | +; CHECK-NEXT: [[BOUND09:%.*]] = icmp ult ptr [[SCEVGEP]], [[SCEVGEP5]] |
| 344 | +; CHECK-NEXT: [[BOUND110:%.*]] = icmp ult ptr [[SCEVGEP4]], [[SCEVGEP1]] |
| 345 | +; CHECK-NEXT: [[FOUND_CONFLICT11:%.*]] = and i1 [[BOUND09]], [[BOUND110]] |
| 346 | +; CHECK-NEXT: [[CONFLICT_RDX12:%.*]] = or i1 [[CONFLICT_RDX]], [[FOUND_CONFLICT11]] |
| 347 | +; CHECK-NEXT: [[BOUND013:%.*]] = icmp ult ptr %dst, [[SCEVGEP3]] |
| 348 | +; CHECK-NEXT: [[BOUND114:%.*]] = icmp ult ptr %src, [[SCEVGEP2]] |
| 349 | +; CHECK-NEXT: [[FOUND_CONFLICT15:%.*]] = and i1 [[BOUND013]], [[BOUND114]] |
| 350 | +; CHECK-NEXT: [[CONFLICT_RDX16:%.*]] = or i1 [[CONFLICT_RDX12]], [[FOUND_CONFLICT15]] |
| 351 | +; CHECK-NEXT: [[BOUND017:%.*]] = icmp ult ptr %dst, [[SCEVGEP5]] |
| 352 | +; CHECK-NEXT: [[BOUND118:%.*]] = icmp ult ptr [[SCEVGEP4]], [[SCEVGEP2]] |
| 353 | +; CHECK-NEXT: [[FOUND_CONFLICT19:%.*]] = and i1 [[BOUND017]], [[BOUND118]] |
| 354 | +; CHECK-NEXT: [[CONFLICT_RDX20:%.*]] = or i1 [[CONFLICT_RDX16]], [[FOUND_CONFLICT19]] |
| 355 | +; CHECK-NEXT: br i1 [[CONFLICT_RDX20]], label %scalar.ph, label %vector.ph |
| 356 | +; CHECK: vector.ph: |
| 357 | +; CHECK-NEXT: br label %vector.body |
| 358 | +; |
| 359 | +entry: |
| 360 | + br label %loop |
| 361 | + |
| 362 | +loop: |
| 363 | + %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] |
| 364 | + %iv.off = add i64 %off, %iv |
| 365 | + %gep.src = getelementptr i64, ptr %src, i64 %iv |
| 366 | + %l.0 = load i64, ptr %gep.src, align 8 |
| 367 | + %gep.dst.off = getelementptr i64, ptr %dst, i64 %iv.off |
| 368 | + store i64 %l.0, ptr %gep.dst.off, align 8 |
| 369 | + %gep.src.8 = getelementptr i8, ptr %gep.src, i64 8 |
| 370 | + %l.1 = load i64, ptr %gep.src.8, align 8 |
| 371 | + %gep.dst.iv = getelementptr i64, ptr %dst, i64 %iv |
| 372 | + store i64 %l.1, ptr %gep.dst.iv, align 8 |
| 373 | + %iv.next = add i64 %iv, 1 |
| 374 | + %ec = icmp eq i64 %iv.next, 1000 |
| 375 | + br i1 %ec, label %exit, label %loop |
| 376 | + |
| 377 | +exit: |
| 378 | + ret void |
| 379 | +} |
0 commit comments