@@ -7,8 +7,7 @@ define i64 @test0(i64 %x) {
77; CHECK-NEXT: [[A:%.*]] = icmp eq i64 [[X:%.*]], 0
88; CHECK-NEXT: br i1 [[A]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]]
99; CHECK: non_zero:
10- ; CHECK-NEXT: [[B:%.*]] = icmp eq i64 [[X]], 0
11- ; CHECK-NEXT: br i1 [[B]], label [[UNREACHABLE:%.*]], label [[EXIT]]
10+ ; CHECK-NEXT: br i1 false, label [[UNREACHABLE:%.*]], label [[EXIT]]
1211; CHECK: unreachable:
1312; CHECK-NEXT: br label [[EXIT]]
1413; CHECK: exit:
@@ -37,8 +36,7 @@ define i64 @test1(i64 %x) {
3736; CHECK-NEXT: [[A:%.*]] = icmp eq i64 [[X:%.*]], 0
3837; CHECK-NEXT: br i1 [[A]], label [[EXIT:%.*]], label [[NON_ZERO:%.*]]
3938; CHECK: non_zero:
40- ; CHECK-NEXT: [[B:%.*]] = icmp ugt i64 [[X]], 0
41- ; CHECK-NEXT: br i1 [[B]], label [[EXIT]], label [[UNREACHABLE:%.*]]
39+ ; CHECK-NEXT: br i1 true, label [[EXIT]], label [[UNREACHABLE:%.*]]
4240; CHECK: unreachable:
4341; CHECK-NEXT: br label [[EXIT]]
4442; CHECK: exit:
@@ -73,11 +71,9 @@ define i1 @test2(i64 %x, i1 %y) {
7371; CHECK: two:
7472; CHECK-NEXT: br label [[MAINBLOCK]]
7573; CHECK: mainblock:
76- ; CHECK-NEXT: [[P:%.*]] = phi i64 [ [[X]], [[ONE]] ], [ 42, [[TWO]] ]
77- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[P]], 0
7874; CHECK-NEXT: br label [[EXIT]]
7975; CHECK: exit:
80- ; CHECK-NEXT: [[RES:%.*]] = phi i1 [ [[CMP]] , [[MAINBLOCK]] ], [ true, [[START:%.*]] ]
76+ ; CHECK-NEXT: [[RES:%.*]] = phi i1 [ false , [[MAINBLOCK]] ], [ true, [[START:%.*]] ]
8177; CHECK-NEXT: ret i1 [[RES]]
8278;
8379start:
@@ -102,3 +98,50 @@ exit:
10298 %res = phi i1 [ %cmp , %mainblock ], [ 1 , %start ]
10399 ret i1 %res
104100}
101+
102+
103+ ; The code below exposed a bug similar to the one exposed by D60846, see the commit 6ea477590085.
104+ ; In a nutshell, we should not replace %result.0 with 0 here.
105+
106+ define zeroext i8 @update_phi_query_loc_in_recursive_call (i8* nocapture readonly %p ){
107+ ; CHECK-LABEL: @update_phi_query_loc_in_recursive_call(
108+ ; CHECK-NEXT: entry:
109+ ; CHECK-NEXT: br label [[FOR_COND:%.*]]
110+ ; CHECK: for.cond:
111+ ; CHECK-NEXT: [[RESULT_0:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[CONV2:%.*]], [[FOR_BODY:%.*]] ]
112+ ; CHECK-NEXT: [[SHIFT_0:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ 1, [[FOR_BODY]] ]
113+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[SHIFT_0]], 0
114+ ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_CLEANUP:%.*]]
115+ ; CHECK: for.cond.cleanup:
116+ ; CHECK-NEXT: ret i8 [[RESULT_0]]
117+ ; CHECK: for.body:
118+ ; CHECK-NEXT: [[TMP0:%.*]] = load i8, i8* [[P:%.*]], align 1
119+ ; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[TMP0]] to i32
120+ ; CHECK-NEXT: [[MUL:%.*]] = shl nuw nsw i32 [[SHIFT_0]], 3
121+ ; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i32 [[CONV]], [[MUL]]
122+ ; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[SHL]] to i8
123+ ; CHECK-NEXT: [[CONV2]] = or i8 [[RESULT_0]], [[TMP1]]
124+ ; CHECK-NEXT: br label [[FOR_COND]]
125+ ;
126+ entry:
127+ br label %for.cond
128+
129+ for.cond: ; preds = %for.body, %entry
130+ %result.0 = phi i8 [ 0 , %entry ], [ %conv2 , %for.body ]
131+ %shift.0 = phi i32 [ 0 , %entry ], [ 1 , %for.body ]
132+ %cmp = icmp eq i32 %shift.0 , 0
133+ br i1 %cmp , label %for.body , label %for.cond.cleanup
134+
135+ for.cond.cleanup: ; preds = %for.cond
136+ ret i8 %result.0
137+
138+ for.body: ; preds = %for.cond
139+ %0 = load i8 , i8* %p , align 1
140+ %conv = zext i8 %0 to i32
141+ %mul = shl nuw nsw i32 %shift.0 , 3
142+ %shl = shl nuw nsw i32 %conv , %mul
143+ %1 = trunc i32 %shl to i8
144+ %conv2 = or i8 %result.0 , %1
145+ %inc = add nuw nsw i32 %shift.0 , 1
146+ br label %for.cond
147+ }
0 commit comments