Skip to content

Commit 4c6289c

Browse files
committed
[InstCombine] Check source element type in gep of phi of gep fold
1 parent 1e77b39 commit 4c6289c

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2280,7 +2280,8 @@ Instruction *InstCombinerImpl::visitGetElementPtrInst(GetElementPtrInst &GEP) {
22802280

22812281
for (auto I = PN->op_begin()+1, E = PN->op_end(); I !=E; ++I) {
22822282
auto *Op2 = dyn_cast<GetElementPtrInst>(*I);
2283-
if (!Op2 || Op1->getNumOperands() != Op2->getNumOperands())
2283+
if (!Op2 || Op1->getNumOperands() != Op2->getNumOperands() ||
2284+
Op1->getSourceElementType() != Op2->getSourceElementType())
22842285
return nullptr;
22852286

22862287
// As for Op1 above, don't try to fold a GEP into itself.

llvm/test/Transforms/InstCombine/opaque-ptr.ll

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,3 +398,62 @@ join:
398398
%phi = phi ptr [ %gep1, %if ], [ %gep2, %else ]
399399
ret ptr %phi
400400
}
401+
402+
define ptr @gep_of_phi_of_gep(i1 %c, ptr %p) {
403+
; CHECK-LABEL: @gep_of_phi_of_gep(
404+
; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
405+
; CHECK: if:
406+
; CHECK-NEXT: br label [[JOIN:%.*]]
407+
; CHECK: else:
408+
; CHECK-NEXT: br label [[JOIN]]
409+
; CHECK: join:
410+
; CHECK-NEXT: [[TMP1:%.*]] = phi i64 [ 1, [[IF]] ], [ 2, [[ELSE]] ]
411+
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[TMP1]]
412+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[TMP2]], i64 1
413+
; CHECK-NEXT: ret ptr [[GEP]]
414+
;
415+
br i1 %c, label %if, label %else
416+
417+
if:
418+
%gep1 = getelementptr i32, ptr %p, i64 1
419+
br label %join
420+
421+
else:
422+
%gep2 = getelementptr i32, ptr %p, i64 2
423+
br label %join
424+
425+
join:
426+
%phi = phi ptr [ %gep1, %if ], [ %gep2, %else ]
427+
%gep = getelementptr i32, ptr %phi, i64 1
428+
ret ptr %gep
429+
}
430+
431+
define ptr @gep_of_phi_of_gep_different_type(i1 %c, ptr %p) {
432+
; CHECK-LABEL: @gep_of_phi_of_gep_different_type(
433+
; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
434+
; CHECK: if:
435+
; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 1
436+
; CHECK-NEXT: br label [[JOIN:%.*]]
437+
; CHECK: else:
438+
; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i64, ptr [[P]], i64 2
439+
; CHECK-NEXT: br label [[JOIN]]
440+
; CHECK: join:
441+
; CHECK-NEXT: [[PHI:%.*]] = phi ptr [ [[GEP1]], [[IF]] ], [ [[GEP2]], [[ELSE]] ]
442+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[PHI]], i64 1
443+
; CHECK-NEXT: ret ptr [[GEP]]
444+
;
445+
br i1 %c, label %if, label %else
446+
447+
if:
448+
%gep1 = getelementptr i32, ptr %p, i64 1
449+
br label %join
450+
451+
else:
452+
%gep2 = getelementptr i64, ptr %p, i64 2
453+
br label %join
454+
455+
join:
456+
%phi = phi ptr [ %gep1, %if ], [ %gep2, %else ]
457+
%gep = getelementptr i32, ptr %phi, i64 1
458+
ret ptr %gep
459+
}

0 commit comments

Comments
 (0)