Skip to content

Commit 3a4376b

Browse files
authored
LAA: handle 0 return from getPtrStride correctly (#124539)
getPtrStride returns 0 when the PtrScev is loop-invariant, and this is not an erroneous value: it returns std::nullopt to communicate that it was not able to find a valid pointer stride. In analyzeLoop, we call getPtrStride with a value_or(0) conflating the zero return value with std::nullopt. Fix this, handling loop-invariant loads correctly.
1 parent 3684ec4 commit 3a4376b

File tree

5 files changed

+101
-95
lines changed

5 files changed

+101
-95
lines changed

llvm/lib/Analysis/LoopAccessAnalysis.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1438,7 +1438,7 @@ llvm::getPtrStride(PredicatedScalarEvolution &PSE, Type *AccessTy, Value *Ptr,
14381438
bool Assume, bool ShouldCheckWrap) {
14391439
const SCEV *PtrScev = replaceSymbolicStrideSCEV(PSE, StridesMap, Ptr);
14401440
if (PSE.getSE()->isLoopInvariant(PtrScev, Lp))
1441-
return {0};
1441+
return 0;
14421442

14431443
Type *Ty = Ptr->getType();
14441444
assert(Ty->isPointerTy() && "Unexpected non-ptr");
@@ -2593,7 +2593,7 @@ bool LoopAccessInfo::analyzeLoop(AAResults *AA, const LoopInfo *LI,
25932593
bool IsReadOnlyPtr = false;
25942594
Type *AccessTy = getLoadStoreType(LD);
25952595
if (Seen.insert({Ptr, AccessTy}).second ||
2596-
!getPtrStride(*PSE, LD->getType(), Ptr, TheLoop, SymbolicStrides).value_or(0)) {
2596+
!getPtrStride(*PSE, AccessTy, Ptr, TheLoop, SymbolicStrides)) {
25972597
++NumReads;
25982598
IsReadOnlyPtr = true;
25992599
}

llvm/test/Analysis/LoopAccessAnalysis/pointer-phis.ll

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -501,14 +501,6 @@ define void @phi_load_store_memdep_check(i1 %c, ptr %A, ptr %B, ptr %C) {
501501
; CHECK-NEXT: %lv3 = load i16, ptr %c.sink, align 2 ->
502502
; CHECK-NEXT: store i16 %add, ptr %c.sink, align 1
503503
; CHECK-EMPTY:
504-
; CHECK-NEXT: Unknown:
505-
; CHECK-NEXT: %lv = load i16, ptr %A, align 1 ->
506-
; CHECK-NEXT: store i16 %lv, ptr %A, align 1
507-
; CHECK-EMPTY:
508-
; CHECK-NEXT: Unknown:
509-
; CHECK-NEXT: store i16 %lv, ptr %A, align 1 ->
510-
; CHECK-NEXT: %lv2 = load i16, ptr %A, align 1
511-
; CHECK-EMPTY:
512504
; CHECK-NEXT: Run-time memory checks:
513505
; CHECK-NEXT: Check 0:
514506
; CHECK-NEXT: Comparing group ([[GRP10:0x[0-9a-f]+]]):

llvm/test/Transforms/LoopDistribute/pointer-phi-in-loop.ll

Lines changed: 67 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,73 @@
33

44
; Testcases inspired by PR50296, PR50288.
55

6-
define void @phi_load_store_distribute(i1 %c, ptr %A, ptr %B, ptr %C) {
6+
define void @phi_load_store_distribute(i1 %cond, ptr %A, ptr %B, ptr %C) {
77
; CHECK-LABEL: @phi_load_store_distribute(
88
; CHECK-NEXT: entry:
99
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
10-
; CHECK: for.body:
11-
; CHECK-NEXT: [[IV:%.*]] = phi i16 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[IF_END:%.*]] ]
12-
; CHECK-NEXT: [[LV:%.*]] = load i16, ptr [[A:%.*]], align 1
10+
; CHECK: for.body.lver.check:
11+
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 2
12+
; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[C:%.*]], i64 2
13+
; CHECK-NEXT: [[SCEVGEP2:%.*]] = getelementptr i8, ptr [[B:%.*]], i64 2
14+
; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[A]], [[SCEVGEP1]]
15+
; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[C]], [[SCEVGEP]]
16+
; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
17+
; CHECK-NEXT: [[BOUND03:%.*]] = icmp ult ptr [[A]], [[SCEVGEP2]]
18+
; CHECK-NEXT: [[BOUND14:%.*]] = icmp ult ptr [[B]], [[SCEVGEP]]
19+
; CHECK-NEXT: [[FOUND_CONFLICT5:%.*]] = and i1 [[BOUND03]], [[BOUND14]]
20+
; CHECK-NEXT: [[CONFLICT_RDX:%.*]] = or i1 [[FOUND_CONFLICT]], [[FOUND_CONFLICT5]]
21+
; CHECK-NEXT: br i1 [[CONFLICT_RDX]], label [[ENTRY:%.*]], label [[FOR_BODY_PH_LDIST1:%.*]]
22+
; CHECK: for.body.ph.lver.orig:
23+
; CHECK-NEXT: br label [[FOR_BODY_LVER_ORIG:%.*]]
24+
; CHECK: for.body.lver.orig:
25+
; CHECK-NEXT: [[IV:%.*]] = phi i16 [ 0, [[ENTRY]] ], [ [[IV_NEXT:%.*]], [[IF_END:%.*]] ]
26+
; CHECK-NEXT: [[LV:%.*]] = load i16, ptr [[A]], align 1
1327
; CHECK-NEXT: store i16 [[LV]], ptr [[A]], align 1
14-
; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END]]
15-
; CHECK: if.then:
28+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_THEN:%.*]], label [[IF_END]]
29+
; CHECK: if.then.lver.orig:
1630
; CHECK-NEXT: [[LV2:%.*]] = load i16, ptr [[A]], align 1
1731
; CHECK-NEXT: br label [[IF_END]]
32+
; CHECK: if.end.lver.orig:
33+
; CHECK-NEXT: [[C_SINK_LVER_ORIG:%.*]] = phi ptr [ [[B]], [[IF_THEN]] ], [ [[C]], [[FOR_BODY_LVER_ORIG]] ]
34+
; CHECK-NEXT: [[LV3_LVER_ORIG:%.*]] = load i16, ptr [[C_SINK_LVER_ORIG]], align 2
35+
; CHECK-NEXT: [[ADD_LVER_ORIG:%.*]] = add i16 [[LV3_LVER_ORIG]], 10
36+
; CHECK-NEXT: store i16 [[ADD_LVER_ORIG]], ptr [[C_SINK_LVER_ORIG]], align 1
37+
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i16 [[IV]], 1
38+
; CHECK-NEXT: [[TOBOOL_NOT_LVER_ORIG:%.*]] = icmp eq i16 [[IV_NEXT]], 1000
39+
; CHECK-NEXT: br i1 [[TOBOOL_NOT_LVER_ORIG]], label [[FOR_END_LOOPEXIT_LOOPEXIT:%.*]], label [[FOR_BODY_LVER_ORIG]]
40+
; CHECK: for.body.ph.ldist1:
41+
; CHECK-NEXT: br label [[FOR_BODY_LDIST1:%.*]]
42+
; CHECK: for.body.ldist1:
43+
; CHECK-NEXT: [[IV_LDIST1:%.*]] = phi i16 [ 0, [[FOR_BODY_PH_LDIST1]] ], [ [[IV_NEXT_LDIST1:%.*]], [[IF_END_LDIST1:%.*]] ]
44+
; CHECK-NEXT: [[LV_LDIST1:%.*]] = load i16, ptr [[A]], align 1, !alias.scope [[META0:![0-9]+]], !noalias [[META3:![0-9]+]]
45+
; CHECK-NEXT: store i16 [[LV_LDIST1]], ptr [[A]], align 1, !alias.scope [[META0]], !noalias [[META3]]
46+
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN_LDIST1:%.*]], label [[IF_END_LDIST1]]
47+
; CHECK: if.then.ldist1:
48+
; CHECK-NEXT: [[LV2_LDIST1:%.*]] = load i16, ptr [[A]], align 1, !alias.scope [[META0]], !noalias [[META3]]
49+
; CHECK-NEXT: br label [[IF_END_LDIST1]]
50+
; CHECK: if.end.ldist1:
51+
; CHECK-NEXT: [[IV_NEXT_LDIST1]] = add nuw nsw i16 [[IV_LDIST1]], 1
52+
; CHECK-NEXT: [[TOBOOL_NOT_LDIST1:%.*]] = icmp eq i16 [[IV_NEXT_LDIST1]], 1000
53+
; CHECK-NEXT: br i1 [[TOBOOL_NOT_LDIST1]], label [[FOR_BODY_PH:%.*]], label [[FOR_BODY_LDIST1]]
54+
; CHECK: for.body.ph:
55+
; CHECK-NEXT: br label [[FOR_BODY1:%.*]]
56+
; CHECK: for.body:
57+
; CHECK-NEXT: [[IV1:%.*]] = phi i16 [ 0, [[FOR_BODY_PH]] ], [ [[IV_NEXT1:%.*]], [[IF_END1:%.*]] ]
58+
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN1:%.*]], label [[IF_END1]]
59+
; CHECK: if.then:
60+
; CHECK-NEXT: br label [[IF_END1]]
1861
; CHECK: if.end:
19-
; CHECK-NEXT: [[C_SINK:%.*]] = phi ptr [ [[B:%.*]], [[IF_THEN]] ], [ [[C:%.*]], [[FOR_BODY]] ]
62+
; CHECK-NEXT: [[C_SINK:%.*]] = phi ptr [ [[B]], [[IF_THEN1]] ], [ [[C]], [[FOR_BODY1]] ]
2063
; CHECK-NEXT: [[LV3:%.*]] = load i16, ptr [[C_SINK]], align 2
2164
; CHECK-NEXT: [[ADD:%.*]] = add i16 [[LV3]], 10
2265
; CHECK-NEXT: store i16 [[ADD]], ptr [[C_SINK]], align 1
23-
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i16 [[IV]], 1
24-
; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i16 [[IV_NEXT]], 1000
25-
; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[FOR_END_LOOPEXIT:%.*]], label [[FOR_BODY]]
66+
; CHECK-NEXT: [[IV_NEXT1]] = add nuw nsw i16 [[IV1]], 1
67+
; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i16 [[IV_NEXT1]], 1000
68+
; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[FOR_END_LOOPEXIT_LOOPEXIT6:%.*]], label [[FOR_BODY1]]
69+
; CHECK: for.end.loopexit.loopexit:
70+
; CHECK-NEXT: br label [[FOR_END_LOOPEXIT:%.*]]
71+
; CHECK: for.end.loopexit.loopexit6:
72+
; CHECK-NEXT: br label [[FOR_END_LOOPEXIT]]
2673
; CHECK: for.end.loopexit:
2774
; CHECK-NEXT: ret void
2875
;
@@ -33,7 +80,7 @@ for.body: ; preds = %if.end, %entry
3380
%iv = phi i16 [ 0, %entry ], [ %iv.next, %if.end ]
3481
%lv = load i16, ptr %A, align 1
3582
store i16 %lv, ptr %A, align 1
36-
br i1 %c, label %if.then, label %if.end
83+
br i1 %cond, label %if.then, label %if.end
3784

3885
if.then: ; preds = %for.body
3986
%lv2 = load i16, ptr %A, align 1
@@ -55,66 +102,21 @@ for.end.loopexit: ; preds = %if.end
55102
define void @phi_load_distribute(i1 %cond, ptr %A, ptr %B, ptr %C) {
56103
; CHECK-LABEL: @phi_load_distribute(
57104
; CHECK-NEXT: entry:
58-
; CHECK-NEXT: br label [[FOR_BODY_LVER_CHECK:%.*]]
59-
; CHECK: for.body.lver.check:
60-
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 2
61-
; CHECK-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[C:%.*]], i64 2
62-
; CHECK-NEXT: [[SCEVGEP2:%.*]] = getelementptr i8, ptr [[B:%.*]], i64 2
63-
; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[A]], [[SCEVGEP1]]
64-
; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[C]], [[SCEVGEP]]
65-
; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
66-
; CHECK-NEXT: [[BOUND03:%.*]] = icmp ult ptr [[A]], [[SCEVGEP2]]
67-
; CHECK-NEXT: [[BOUND14:%.*]] = icmp ult ptr [[B]], [[SCEVGEP]]
68-
; CHECK-NEXT: [[FOUND_CONFLICT5:%.*]] = and i1 [[BOUND03]], [[BOUND14]]
69-
; CHECK-NEXT: [[CONFLICT_RDX:%.*]] = or i1 [[FOUND_CONFLICT]], [[FOUND_CONFLICT5]]
70-
; CHECK-NEXT: br i1 [[CONFLICT_RDX]], label [[FOR_BODY_PH_LVER_ORIG:%.*]], label [[FOR_BODY_PH_LDIST1:%.*]]
71-
; CHECK: for.body.ph.lver.orig:
72105
; CHECK-NEXT: br label [[FOR_BODY_LVER_ORIG:%.*]]
73-
; CHECK: for.body.lver.orig:
74-
; CHECK-NEXT: [[IV_LVER_ORIG:%.*]] = phi i16 [ 0, [[FOR_BODY_PH_LVER_ORIG]] ], [ [[IV_NEXT_LVER_ORIG:%.*]], [[IF_END_LVER_ORIG:%.*]] ]
75-
; CHECK-NEXT: [[LV_LVER_ORIG:%.*]] = load i16, ptr [[A]], align 1
106+
; CHECK: for.body:
107+
; CHECK-NEXT: [[IV_LVER_ORIG:%.*]] = phi i16 [ 0, [[FOR_BODY_PH_LVER_ORIG:%.*]] ], [ [[IV_NEXT_LVER_ORIG:%.*]], [[IF_END_LVER_ORIG:%.*]] ]
108+
; CHECK-NEXT: [[LV_LVER_ORIG:%.*]] = load i16, ptr [[A:%.*]], align 1
76109
; CHECK-NEXT: store i16 [[LV_LVER_ORIG]], ptr [[A]], align 1
77110
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_THEN_LVER_ORIG:%.*]], label [[IF_END_LVER_ORIG]]
78-
; CHECK: if.then.lver.orig:
79-
; CHECK-NEXT: [[LV2_LVER_ORIG:%.*]] = load i16, ptr [[A]], align 1
80-
; CHECK-NEXT: br label [[IF_END_LVER_ORIG]]
81-
; CHECK: if.end.lver.orig:
82-
; CHECK-NEXT: [[C_SINK_LVER_ORIG:%.*]] = phi ptr [ [[B]], [[IF_THEN_LVER_ORIG]] ], [ [[C]], [[FOR_BODY_LVER_ORIG]] ]
83-
; CHECK-NEXT: [[LV3_LVER_ORIG:%.*]] = load i16, ptr [[C_SINK_LVER_ORIG]], align 2
84-
; CHECK-NEXT: [[IV_NEXT_LVER_ORIG]] = add nuw nsw i16 [[IV_LVER_ORIG]], 1
85-
; CHECK-NEXT: [[TOBOOL_NOT_LVER_ORIG:%.*]] = icmp eq i16 [[IV_NEXT_LVER_ORIG]], 1000
86-
; CHECK-NEXT: br i1 [[TOBOOL_NOT_LVER_ORIG]], label [[FOR_END_LOOPEXIT_LOOPEXIT:%.*]], label [[FOR_BODY_LVER_ORIG]]
87-
; CHECK: for.body.ph.ldist1:
88-
; CHECK-NEXT: br label [[FOR_BODY_LDIST1:%.*]]
89-
; CHECK: for.body.ldist1:
90-
; CHECK-NEXT: [[IV_LDIST1:%.*]] = phi i16 [ 0, [[FOR_BODY_PH_LDIST1]] ], [ [[IV_NEXT_LDIST1:%.*]], [[IF_END_LDIST1:%.*]] ]
91-
; CHECK-NEXT: [[LV_LDIST1:%.*]] = load i16, ptr [[A]], align 1, !alias.scope [[META0:![0-9]+]], !noalias [[META3:![0-9]+]]
92-
; CHECK-NEXT: store i16 [[LV_LDIST1]], ptr [[A]], align 1, !alias.scope [[META0]], !noalias [[META3]]
93-
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN_LDIST1:%.*]], label [[IF_END_LDIST1]]
94-
; CHECK: if.then.ldist1:
95-
; CHECK-NEXT: [[LV2_LDIST1:%.*]] = load i16, ptr [[A]], align 1, !alias.scope [[META0]], !noalias [[META3]]
96-
; CHECK-NEXT: br label [[IF_END_LDIST1]]
97-
; CHECK: if.end.ldist1:
98-
; CHECK-NEXT: [[IV_NEXT_LDIST1]] = add nuw nsw i16 [[IV_LDIST1]], 1
99-
; CHECK-NEXT: [[TOBOOL_NOT_LDIST1:%.*]] = icmp eq i16 [[IV_NEXT_LDIST1]], 1000
100-
; CHECK-NEXT: br i1 [[TOBOOL_NOT_LDIST1]], label [[FOR_BODY_PH:%.*]], label [[FOR_BODY_LDIST1]]
101-
; CHECK: for.body.ph:
102-
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
103-
; CHECK: for.body:
104-
; CHECK-NEXT: [[IV:%.*]] = phi i16 [ 0, [[FOR_BODY_PH]] ], [ [[IV_NEXT:%.*]], [[IF_END:%.*]] ]
105-
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_END]]
106111
; CHECK: if.then:
107-
; CHECK-NEXT: br label [[IF_END]]
112+
; CHECK-NEXT: [[LV2:%.*]] = load i16, ptr [[A]], align 1
113+
; CHECK-NEXT: br label [[IF_END_LVER_ORIG]]
108114
; CHECK: if.end:
109-
; CHECK-NEXT: [[C_SINK:%.*]] = phi ptr [ [[B]], [[IF_THEN]] ], [ [[C]], [[FOR_BODY]] ]
115+
; CHECK-NEXT: [[C_SINK:%.*]] = phi ptr [ [[B:%.*]], [[IF_THEN_LVER_ORIG]] ], [ [[C:%.*]], [[FOR_BODY_LVER_ORIG]] ]
110116
; CHECK-NEXT: [[LV3:%.*]] = load i16, ptr [[C_SINK]], align 2
111-
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i16 [[IV]], 1
112-
; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i16 [[IV_NEXT]], 1000
113-
; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[FOR_END_LOOPEXIT_LOOPEXIT6:%.*]], label [[FOR_BODY]]
114-
; CHECK: for.end.loopexit.loopexit:
115-
; CHECK-NEXT: br label [[FOR_END_LOOPEXIT:%.*]]
116-
; CHECK: for.end.loopexit.loopexit6:
117-
; CHECK-NEXT: br label [[FOR_END_LOOPEXIT]]
117+
; CHECK-NEXT: [[IV_NEXT_LVER_ORIG]] = add nuw nsw i16 [[IV_LVER_ORIG]], 1
118+
; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i16 [[IV_NEXT_LVER_ORIG]], 1000
119+
; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[FOR_END_LOOPEXIT:%.*]], label [[FOR_BODY_LVER_ORIG]]
118120
; CHECK: for.end.loopexit:
119121
; CHECK-NEXT: ret void
120122
;

llvm/test/tools/UpdateTestChecks/update_analyze_test_checks/Inputs/loop-distribute.ll

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
; RUN: opt -passes=loop-distribute -enable-loop-distribute \
22
; RUN: -debug-only=loop-distribute -disable-output 2>&1 %s | FileCheck %s
33

4-
define void @ldist(i1 %c, ptr %A, ptr %B, ptr %C) {
4+
define void @ldist(i1 %cond, ptr %A, ptr %B, ptr %C) {
55
entry:
66
br label %for.body
77

88
for.body: ; preds = %if.end, %entry
99
%iv = phi i16 [ 0, %entry ], [ %iv.next, %if.end ]
1010
%lv = load i16, ptr %A, align 1
1111
store i16 %lv, ptr %A, align 1
12-
br i1 %c, label %if.then, label %if.end
12+
br i1 %cond, label %if.then, label %if.end
1313

1414
if.then: ; preds = %for.body
1515
%lv2 = load i16, ptr %A, align 1
@@ -18,6 +18,8 @@ if.then: ; preds = %for.body
1818
if.end: ; preds = %if.then, %for.body
1919
%c.sink = phi ptr [ %B, %if.then ], [ %C, %for.body ]
2020
%lv3 = load i16, ptr %c.sink
21+
%add = add i16 %lv3, 10
22+
store i16 %add, ptr %c.sink, align 1
2123
%iv.next = add nuw nsw i16 %iv, 1
2224
%tobool.not = icmp eq i16 %iv.next, 1000
2325
br i1 %tobool.not, label %for.end.loopexit, label %for.body

llvm/test/tools/UpdateTestChecks/update_analyze_test_checks/Inputs/loop-distribute.ll.expected

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,55 @@
22
; RUN: opt -passes=loop-distribute -enable-loop-distribute \
33
; RUN: -debug-only=loop-distribute -disable-output 2>&1 %s | FileCheck %s
44

5-
define void @ldist(i1 %c, ptr %A, ptr %B, ptr %C) {
5+
define void @ldist(i1 %cond, ptr %A, ptr %B, ptr %C) {
66
; CHECK-LABEL: 'ldist'
77
; CHECK-NEXT: LDist: Found a candidate loop: for.body
88
; CHECK-NEXT: LDist: Backward dependences:
99
; CHECK-NEXT: Unknown:
10-
; CHECK-NEXT: %lv = load i16, ptr %A, align 1 ->
11-
; CHECK-NEXT: store i16 %lv, ptr %A, align 1
10+
; CHECK-NEXT: %lv3 = load i16, ptr %c.sink, align 2 ->
11+
; CHECK-NEXT: store i16 %add, ptr %c.sink, align 1
1212
; CHECK-NEXT: Unknown:
13-
; CHECK-NEXT: store i16 %lv, ptr %A, align 1 ->
14-
; CHECK-NEXT: %lv2 = load i16, ptr %A, align 1
13+
; CHECK-NEXT: %lv3 = load i16, ptr %c.sink, align 2 ->
14+
; CHECK-NEXT: store i16 %add, ptr %c.sink, align 1
1515
; CHECK-NEXT: LDist: Seeded partitions:
16-
; CHECK-NEXT: LDist: Partition 0: (cycle)
16+
; CHECK-NEXT: LDist: Partition 0:
1717
; CHECK-NEXT: for.body: %lv = load i16, ptr %A, align 1
18-
; CHECK-NEXT: for.body: store i16 %lv, ptr %A, align 1
19-
; CHECK-NEXT: if.then: %lv2 = load i16, ptr %A, align 1
2018
; CHECK-NEXT: LDist: Partition 1:
21-
; CHECK-NEXT: if.end: %lv3 = load i16, ptr %c.sink, align 2
19+
; CHECK-NEXT: for.body: store i16 %lv, ptr %A, align 1
2220
; CHECK-NEXT: LDist: Partition 2:
21+
; CHECK-NEXT: if.then: %lv2 = load i16, ptr %A, align 1
22+
; CHECK-NEXT: LDist: Partition 3: (cycle)
2323
; CHECK-NEXT: if.end: %lv3 = load i16, ptr %c.sink, align 2
24+
; CHECK-NEXT: if.end: store i16 %add, ptr %c.sink, align 1
2425
; CHECK-NEXT: LDist: Merged partitions:
25-
; CHECK-NEXT: LDist: Partition 0: (cycle)
26+
; CHECK-NEXT: LDist: Partition 0:
2627
; CHECK-NEXT: for.body: %lv = load i16, ptr %A, align 1
2728
; CHECK-NEXT: for.body: store i16 %lv, ptr %A, align 1
2829
; CHECK-NEXT: if.then: %lv2 = load i16, ptr %A, align 1
29-
; CHECK-NEXT: LDist: Partition 1:
30+
; CHECK-NEXT: LDist: Partition 1: (cycle)
3031
; CHECK-NEXT: if.end: %lv3 = load i16, ptr %c.sink, align 2
32+
; CHECK-NEXT: if.end: store i16 %add, ptr %c.sink, align 1
3133
; CHECK-NEXT: LDist: Populated partitions:
32-
; CHECK-NEXT: LDist: Partition 0: (cycle)
34+
; CHECK-NEXT: LDist: Partition 0:
3335
; CHECK-NEXT: for.body: %lv = load i16, ptr %A, align 1
3436
; CHECK-NEXT: for.body: store i16 %lv, ptr %A, align 1
3537
; CHECK-NEXT: if.then: %lv2 = load i16, ptr %A, align 1
36-
; CHECK-NEXT: for.body: br i1 %c, label %if.then, label %if.end
38+
; CHECK-NEXT: for.body: br i1 %cond, label %if.then, label %if.end
3739
; CHECK-NEXT: if.then: br label %if.end
3840
; CHECK-NEXT: if.end: br i1 %tobool.not, label %for.end.loopexit, label %for.body
3941
; CHECK-NEXT: if.end: %tobool.not = icmp eq i16 %iv.next, 1000
4042
; CHECK-NEXT: if.end: %iv.next = add nuw nsw i16 %iv, 1
4143
; CHECK-NEXT: for.body: %iv = phi i16 [ 0, %entry ], [ %iv.next, %if.end ]
42-
; CHECK-NEXT: LDist: Partition 1:
44+
; CHECK-NEXT: LDist: Partition 1: (cycle)
4345
; CHECK-NEXT: if.end: %lv3 = load i16, ptr %c.sink, align 2
44-
; CHECK-NEXT: for.body: br i1 %c, label %if.then, label %if.end
46+
; CHECK-NEXT: if.end: store i16 %add, ptr %c.sink, align 1
47+
; CHECK-NEXT: for.body: br i1 %cond, label %if.then, label %if.end
4548
; CHECK-NEXT: if.then: br label %if.end
4649
; CHECK-NEXT: if.end: br i1 %tobool.not, label %for.end.loopexit, label %for.body
4750
; CHECK-NEXT: if.end: %tobool.not = icmp eq i16 %iv.next, 1000
4851
; CHECK-NEXT: if.end: %iv.next = add nuw nsw i16 %iv, 1
4952
; CHECK-NEXT: for.body: %iv = phi i16 [ 0, %entry ], [ %iv.next, %if.end ]
53+
; CHECK-NEXT: if.end: %add = add i16 %lv3, 10
5054
; CHECK-NEXT: if.end: %c.sink = phi ptr [ %B, %if.then ], [ %C, %for.body ]
5155
; CHECK-NEXT: LDist: Distributing loop: for.body
5256
; CHECK-NEXT: LDist: Pointers:
@@ -56,19 +60,21 @@ define void @ldist(i1 %c, ptr %A, ptr %B, ptr %C) {
5660
; CHECK-NEXT: ptr %A
5761
; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
5862
; CHECK-NEXT: ptr %C
63+
; CHECK-NEXT: ptr %C
5964
; CHECK-NEXT: Check 1:
6065
; CHECK-NEXT: Comparing group ([[GRP1]]):
6166
; CHECK-NEXT: ptr %A
6267
; CHECK-NEXT: ptr %A
6368
; CHECK-NEXT: Against group ([[GRP3:0x[0-9a-f]+]]):
6469
; CHECK-NEXT: ptr %B
70+
; CHECK-NEXT: ptr %B
6571
; CHECK-NEXT: LDist: After removing unused Instrs:
6672
; CHECK-NEXT: LDist: Partition 0:
6773
; CHECK-NEXT: for.body.ldist1: ; preds = %if.end.ldist1, %for.body.ph.ldist1
6874
; CHECK-NEXT: %iv.ldist1 = phi i16 [ 0, %for.body.ph.ldist1 ], [ %iv.next.ldist1, %if.end.ldist1 ]
6975
; CHECK-NEXT: %lv.ldist1 = load i16, ptr %A, align 1, !alias.scope !0, !noalias !3
7076
; CHECK-NEXT: store i16 %lv.ldist1, ptr %A, align 1, !alias.scope !0, !noalias !3
71-
; CHECK-NEXT: br i1 %c, label %if.then.ldist1, label %if.end.ldist1
77+
; CHECK-NEXT: br i1 %cond, label %if.then.ldist1, label %if.end.ldist1
7278
; CHECK-EMPTY:
7379
; CHECK-NEXT: if.then.ldist1: ; preds = %for.body.ldist1
7480
; CHECK-NEXT: %lv2.ldist1 = load i16, ptr %A, align 1, !alias.scope !0, !noalias !3
@@ -81,14 +87,16 @@ define void @ldist(i1 %c, ptr %A, ptr %B, ptr %C) {
8187
; CHECK-NEXT: LDist: Partition 1:
8288
; CHECK-NEXT: for.body: ; preds = %if.end, %for.body.ph
8389
; CHECK-NEXT: %iv = phi i16 [ 0, %for.body.ph ], [ %iv.next, %if.end ]
84-
; CHECK-NEXT: br i1 %c, label %if.then, label %if.end
90+
; CHECK-NEXT: br i1 %cond, label %if.then, label %if.end
8591
; CHECK-EMPTY:
8692
; CHECK-NEXT: if.then: ; preds = %for.body
8793
; CHECK-NEXT: br label %if.end
8894
; CHECK-EMPTY:
8995
; CHECK-NEXT: if.end: ; preds = %if.then, %for.body
9096
; CHECK-NEXT: %c.sink = phi ptr [ %B, %if.then ], [ %C, %for.body ]
9197
; CHECK-NEXT: %lv3 = load i16, ptr %c.sink, align 2
98+
; CHECK-NEXT: %add = add i16 %lv3, 10
99+
; CHECK-NEXT: store i16 %add, ptr %c.sink, align 1
92100
; CHECK-NEXT: %iv.next = add nuw nsw i16 %iv, 1
93101
; CHECK-NEXT: %tobool.not = icmp eq i16 %iv.next, 1000
94102
; CHECK-NEXT: br i1 %tobool.not, label %for.end.loopexit.loopexit6, label %for.body
@@ -100,7 +108,7 @@ for.body: ; preds = %if.end, %entry
100108
%iv = phi i16 [ 0, %entry ], [ %iv.next, %if.end ]
101109
%lv = load i16, ptr %A, align 1
102110
store i16 %lv, ptr %A, align 1
103-
br i1 %c, label %if.then, label %if.end
111+
br i1 %cond, label %if.then, label %if.end
104112

105113
if.then: ; preds = %for.body
106114
%lv2 = load i16, ptr %A, align 1
@@ -109,6 +117,8 @@ if.then: ; preds = %for.body
109117
if.end: ; preds = %if.then, %for.body
110118
%c.sink = phi ptr [ %B, %if.then ], [ %C, %for.body ]
111119
%lv3 = load i16, ptr %c.sink
120+
%add = add i16 %lv3, 10
121+
store i16 %add, ptr %c.sink, align 1
112122
%iv.next = add nuw nsw i16 %iv, 1
113123
%tobool.not = icmp eq i16 %iv.next, 1000
114124
br i1 %tobool.not, label %for.end.loopexit, label %for.body

0 commit comments

Comments
 (0)