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
3885if.then:                                          ; preds = %for.body 
3986  %lv2  = load  i16 , ptr  %A , align  1 
@@ -55,66 +102,21 @@ for.end.loopexit:                                 ; preds = %if.end
55102define  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; 
0 commit comments