Please use GitHub pull requests for new patches. Avoid migrating existing patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/Transforms/GVN/PRE/phi-translate-2.ll
Show First 20 Lines • Show All 300 Lines • ▼ Show 20 Lines | while.end: | ||||
ret void | ret void | ||||
} | } | ||||
; Load from arrayidx2 is partially redundant, check that address translation can | ; Load from arrayidx2 is partially redundant, check that address translation can | ||||
; fold sext + trunc across phi node together. | ; fold sext + trunc across phi node together. | ||||
define i32 @test7(ptr noalias %ptr1, ptr noalias %ptr2, i32 %i, i1 %cond) { | define i32 @test7(ptr noalias %ptr1, ptr noalias %ptr2, i32 %i, i1 %cond) { | ||||
; CHECK-LABEL: @test7( | ; CHECK-LABEL: @test7( | ||||
; CHECK-NEXT: entry: | ; CHECK-NEXT: entry: | ||||
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] | ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_THEN:%.*]], label [[ENTRY_IF_END_CRIT_EDGE:%.*]] | ||||
; CHECK: entry.if.end_crit_edge: | |||||
; CHECK-NEXT: [[RES_PRE:%.*]] = load i32, ptr [[PTR1:%.*]], align 4 | |||||
; CHECK-NEXT: br label [[IF_END:%.*]] | |||||
; CHECK: if.then: | ; CHECK: if.then: | ||||
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[PTR1:%.*]], i32 [[I:%.*]] | ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[PTR1]], i32 [[I:%.*]] | ||||
; CHECK-NEXT: [[TMP:%.*]] = load i32, ptr [[ARRAYIDX]], align 4 | ; CHECK-NEXT: [[TMP:%.*]] = load i32, ptr [[ARRAYIDX]], align 4 | ||||
; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR2:%.*]], align 4 | ; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR2:%.*]], align 4 | ||||
; CHECK-NEXT: [[IDX_EXT:%.*]] = sext i32 [[I]] to i64 | ; CHECK-NEXT: [[IDX_EXT:%.*]] = sext i32 [[I]] to i64 | ||||
; CHECK-NEXT: br label [[IF_END]] | ; CHECK-NEXT: br label [[IF_END]] | ||||
; CHECK: if.end: | ; CHECK: if.end: | ||||
; CHECK-NEXT: [[IDX:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IDX_EXT]], [[IF_THEN]] ] | ; CHECK-NEXT: [[RES:%.*]] = phi i32 [ [[RES_PRE]], [[ENTRY_IF_END_CRIT_EDGE]] ], [ [[TMP]], [[IF_THEN]] ] | ||||
; CHECK-NEXT: [[IDX:%.*]] = phi i64 [ 0, [[ENTRY_IF_END_CRIT_EDGE]] ], [ [[IDX_EXT]], [[IF_THEN]] ] | |||||
; CHECK-NEXT: [[IDX_TRUNC:%.*]] = trunc i64 [[IDX]] to i32 | ; CHECK-NEXT: [[IDX_TRUNC:%.*]] = trunc i64 [[IDX]] to i32 | ||||
; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i32, ptr [[PTR1]], i32 [[IDX_TRUNC]] | ; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i32, ptr [[PTR1]], i32 [[IDX_TRUNC]] | ||||
; CHECK-NEXT: [[RES:%.*]] = load i32, ptr [[ARRAYIDX2]], align 4 | |||||
; CHECK-NEXT: ret i32 [[RES]] | ; CHECK-NEXT: ret i32 [[RES]] | ||||
; | ; | ||||
entry: | entry: | ||||
br i1 %cond, label %if.then, label %if.end | br i1 %cond, label %if.then, label %if.end | ||||
if.then: | if.then: | ||||
%arrayidx = getelementptr inbounds i32, ptr %ptr1, i32 %i | %arrayidx = getelementptr inbounds i32, ptr %ptr1, i32 %i | ||||
%tmp = load i32, ptr %arrayidx, align 4 | %tmp = load i32, ptr %arrayidx, align 4 | ||||
Show All 11 Lines |