|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3 |
1 | 2 | ; RUN: opt -S -loop-reduce < %s | FileCheck %s
|
2 | 3 |
|
3 | 4 | target triple = "x86_64-unknown-unknown"
|
4 | 5 | target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
5 | 6 |
|
6 |
| -define void @incorrect_offset_scaling(i64, ptr) { |
| 7 | +define void @incorrect_offset_scaling(i1 %c, i1 %c2, i1 %c3, ptr %p, i64, ptr) { |
| 8 | +; CHECK-LABEL: define void @incorrect_offset_scaling( |
| 9 | +; CHECK-SAME: i1 [[C:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]], ptr [[P:%.*]], i64 [[TMP0:%.*]], ptr [[TMP1:%.*]]) { |
| 10 | +; CHECK-NEXT: top: |
| 11 | +; CHECK-NEXT: br label [[L:%.*]] |
| 12 | +; CHECK: L.loopexit: |
| 13 | +; CHECK-NEXT: br label [[L_BACKEDGE:%.*]] |
| 14 | +; CHECK: L: |
| 15 | +; CHECK-NEXT: br i1 [[C]], label [[L_BACKEDGE]], label [[L1_PREHEADER:%.*]] |
| 16 | +; CHECK: L.backedge: |
| 17 | +; CHECK-NEXT: br label [[L]] |
| 18 | +; CHECK: L1.preheader: |
| 19 | +; CHECK-NEXT: br label [[L1:%.*]] |
| 20 | +; CHECK: L1: |
| 21 | +; CHECK-NEXT: [[LSR_IV:%.*]] = phi i64 [ 0, [[L1_PREHEADER]] ], [ [[LSR_IV_NEXT:%.*]], [[L2:%.*]] ] |
| 22 | +; CHECK-NEXT: br label [[IDXEND_8:%.*]] |
| 23 | +; CHECK: L2: |
| 24 | +; CHECK-NEXT: [[LSR_IV_NEXT]] = add i64 [[LSR_IV]], 1 |
| 25 | +; CHECK-NEXT: br i1 [[C2]], label [[L_LOOPEXIT:%.*]], label [[L1]] |
| 26 | +; CHECK: if6: |
| 27 | +; CHECK-NEXT: [[R2:%.*]] = add i64 [[TMP0]], -1 |
| 28 | +; CHECK-NEXT: [[R3:%.*]] = load i64, ptr [[TMP1]], align 8 |
| 29 | +; CHECK-NEXT: br label [[IB:%.*]] |
| 30 | +; CHECK: idxend.8: |
| 31 | +; CHECK-NEXT: br i1 [[C3]], label [[IF6:%.*]], label [[L2]] |
| 32 | +; CHECK: ib: |
| 33 | +; CHECK-NEXT: [[R4:%.*]] = mul i64 [[R3]], [[LSR_IV]] |
| 34 | +; CHECK-NEXT: [[R5:%.*]] = add i64 [[R2]], [[R4]] |
| 35 | +; CHECK-NEXT: [[R6:%.*]] = icmp ult i64 [[R5]], undef |
| 36 | +; CHECK-NEXT: [[R7:%.*]] = getelementptr i64, ptr [[P]], i64 [[R5]] |
| 37 | +; CHECK-NEXT: store i64 1, ptr [[R7]], align 8 |
| 38 | +; CHECK-NEXT: br label [[L_BACKEDGE]] |
| 39 | +; |
7 | 40 | top:
|
8 | 41 | br label %L
|
9 | 42 |
|
10 | 43 | L: ; preds = %idxend.10, %idxend, %L2, %top
|
11 |
| - br i1 undef, label %L, label %L1 |
| 44 | + br i1 %c, label %L, label %L1 |
12 | 45 |
|
13 | 46 | L1: ; preds = %L1.preheader, %L2
|
14 | 47 | %r13 = phi i64 [ %r1, %L2 ], [ 1, %L ]
|
15 |
| -; CHECK: %lsr.iv = phi i64 [ 0, %L{{[^ ]+}} ], [ %lsr.iv.next, %L2 ] |
16 |
| -; CHECK-NOT: %lsr.iv = phi i64 [ -1, %L{{[^ ]+}} ], [ %lsr.iv.next, %L2 ] |
17 |
| -; CHECK: br |
18 | 48 | %r0 = add i64 %r13, -1
|
19 | 49 | br label %idxend.8
|
20 | 50 |
|
21 | 51 | L2: ; preds = %idxend.8
|
22 | 52 | %r1 = add i64 %r13, 1
|
23 |
| - br i1 undef, label %L, label %L1 |
| 53 | + br i1 %c2, label %L, label %L1 |
24 | 54 |
|
25 | 55 | if6: ; preds = %idxend.8
|
26 | 56 | %r2 = add i64 %0, -1
|
27 | 57 | %r3 = load i64, ptr %1, align 8
|
28 |
| -; CHECK: %r2 = add i64 %0, -1 |
29 |
| -; CHECK: %r3 = load i64 |
30 | 58 | br label %ib
|
31 | 59 |
|
32 | 60 | idxend.8: ; preds = %L1
|
33 |
| - br i1 undef, label %if6, label %L2 |
| 61 | + br i1 %c3, label %if6, label %L2 |
34 | 62 |
|
35 | 63 | ib: ; preds = %if6
|
36 | 64 | %r4 = mul i64 %r3, %r0
|
37 | 65 | %r5 = add i64 %r2, %r4
|
38 | 66 | %r6 = icmp ult i64 %r5, undef
|
39 |
| -; CHECK: %r4 = mul i64 %r3, %lsr.iv |
40 |
| -; CHECK: %r5 = add i64 %r2, %r4 |
41 |
| -; CHECK: %r6 = icmp ult i64 %r5, undef |
42 |
| -; CHECK: %r7 = getelementptr i64, ptr undef, i64 %r5 |
43 |
| - %r7 = getelementptr i64, ptr undef, i64 %r5 |
| 67 | + %r7 = getelementptr i64, ptr %p, i64 %r5 |
44 | 68 | store i64 1, ptr %r7, align 8
|
45 | 69 | br label %L
|
46 | 70 | }
|
0 commit comments