3
3
4
4
; Testcases inspired by PR50296, PR50288.
5
5
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 ) {
7
7
; CHECK-LABEL: @phi_load_store_distribute(
8
8
; CHECK-NEXT: entry:
9
9
; 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
13
27
; 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 :
16
30
; CHECK-NEXT: [[LV2:%.*]] = load i16, ptr [[A]], align 1
17
31
; 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]]
18
61
; 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 ]] ]
20
63
; CHECK-NEXT: [[LV3:%.*]] = load i16, ptr [[C_SINK]], align 2
21
64
; CHECK-NEXT: [[ADD:%.*]] = add i16 [[LV3]], 10
22
65
; 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]]
26
73
; CHECK: for.end.loopexit:
27
74
; CHECK-NEXT: ret void
28
75
;
@@ -33,7 +80,7 @@ for.body: ; preds = %if.end, %entry
33
80
%iv = phi i16 [ 0 , %entry ], [ %iv.next , %if.end ]
34
81
%lv = load i16 , ptr %A , align 1
35
82
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
37
84
38
85
if.then: ; preds = %for.body
39
86
%lv2 = load i16 , ptr %A , align 1
@@ -55,66 +102,21 @@ for.end.loopexit: ; preds = %if.end
55
102
define void @phi_load_distribute (i1 %cond , ptr %A , ptr %B , ptr %C ) {
56
103
; CHECK-LABEL: @phi_load_distribute(
57
104
; 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:
72
105
; 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
76
109
; CHECK-NEXT: store i16 [[LV_LVER_ORIG]], ptr [[A]], align 1
77
110
; 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]]
106
111
; 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]]
108
114
; 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 ]] ]
110
116
; 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]]
118
120
; CHECK: for.end.loopexit:
119
121
; CHECK-NEXT: ret void
120
122
;
0 commit comments