forked from OSchip/llvm-project
[CodeGenPrep] Handle constants in ConvertPhiType
This is a simple addition to the convertPhiTypes in CodeGenPrepare to consider and convert constants as it converts the phi type. Someone fixed the bug in the motivating example, so the undef is now a constant 0. This does mean converting between integer and floating point constants, which may have different materialization. Differential Revision: https://reviews.llvm.org/D135561
This commit is contained in:
parent
d8cab3f407
commit
16e4e4ab87
|
@ -6122,6 +6122,7 @@ bool CodeGenPrepare::optimizePhiType(
|
||||||
SmallVector<Instruction *, 4> Worklist;
|
SmallVector<Instruction *, 4> Worklist;
|
||||||
Worklist.push_back(cast<Instruction>(I));
|
Worklist.push_back(cast<Instruction>(I));
|
||||||
SmallPtrSet<PHINode *, 4> PhiNodes;
|
SmallPtrSet<PHINode *, 4> PhiNodes;
|
||||||
|
SmallPtrSet<ConstantData *, 4> Constants;
|
||||||
PhiNodes.insert(I);
|
PhiNodes.insert(I);
|
||||||
Visited.insert(I);
|
Visited.insert(I);
|
||||||
SmallPtrSet<Instruction *, 4> Defs;
|
SmallPtrSet<Instruction *, 4> Defs;
|
||||||
|
@ -6164,9 +6165,10 @@ bool CodeGenPrepare::optimizePhiType(
|
||||||
AnyAnchored |= !isa<LoadInst>(OpBC->getOperand(0)) &&
|
AnyAnchored |= !isa<LoadInst>(OpBC->getOperand(0)) &&
|
||||||
!isa<ExtractElementInst>(OpBC->getOperand(0));
|
!isa<ExtractElementInst>(OpBC->getOperand(0));
|
||||||
}
|
}
|
||||||
} else if (!isa<UndefValue>(V)) {
|
} else if (auto *OpC = dyn_cast<ConstantData>(V))
|
||||||
|
Constants.insert(OpC);
|
||||||
|
else
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6208,7 +6210,8 @@ bool CodeGenPrepare::optimizePhiType(
|
||||||
// Create all the new phi nodes of the new type, and bitcast any loads to the
|
// Create all the new phi nodes of the new type, and bitcast any loads to the
|
||||||
// correct type.
|
// correct type.
|
||||||
ValueToValueMap ValMap;
|
ValueToValueMap ValMap;
|
||||||
ValMap[UndefValue::get(PhiTy)] = UndefValue::get(ConvertTy);
|
for (ConstantData *C : Constants)
|
||||||
|
ValMap[C] = ConstantExpr::getCast(Instruction::BitCast, C, ConvertTy);
|
||||||
for (Instruction *D : Defs) {
|
for (Instruction *D : Defs) {
|
||||||
if (isa<BitCastInst>(D)) {
|
if (isa<BitCastInst>(D)) {
|
||||||
ValMap[D] = D->getOperand(0);
|
ValMap[D] = D->getOperand(0);
|
||||||
|
|
|
@ -881,11 +881,11 @@ define float @convphi2_zero(i32 *%s, i32 *%d, i32 %n) {
|
||||||
; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
|
; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
|
||||||
; CHECK: then:
|
; CHECK: then:
|
||||||
; CHECK-NEXT: [[LS:%.*]] = load i32, i32* [[S:%.*]], align 4
|
; CHECK-NEXT: [[LS:%.*]] = load i32, i32* [[S:%.*]], align 4
|
||||||
|
; CHECK-NEXT: [[LS_BC:%.*]] = bitcast i32 [[LS]] to float
|
||||||
; CHECK-NEXT: br label [[END]]
|
; CHECK-NEXT: br label [[END]]
|
||||||
; CHECK: end:
|
; CHECK: end:
|
||||||
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ 0, [[ENTRY:%.*]] ]
|
; CHECK-NEXT: [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ 0.000000e+00, [[ENTRY:%.*]] ]
|
||||||
; CHECK-NEXT: [[B:%.*]] = bitcast i32 [[PHI]] to float
|
; CHECK-NEXT: ret float [[PHI_TC]]
|
||||||
; CHECK-NEXT: ret float [[B]]
|
|
||||||
;
|
;
|
||||||
entry:
|
entry:
|
||||||
%cmp15 = icmp sgt i32 %n, 0
|
%cmp15 = icmp sgt i32 %n, 0
|
||||||
|
@ -908,11 +908,11 @@ define i32 @convphi2f_zero(float *%s, float *%d, i32 %n) {
|
||||||
; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
|
; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
|
||||||
; CHECK: then:
|
; CHECK: then:
|
||||||
; CHECK-NEXT: [[LS:%.*]] = load float, float* [[S:%.*]], align 4
|
; CHECK-NEXT: [[LS:%.*]] = load float, float* [[S:%.*]], align 4
|
||||||
|
; CHECK-NEXT: [[LS_BC:%.*]] = bitcast float [[LS]] to i32
|
||||||
; CHECK-NEXT: br label [[END]]
|
; CHECK-NEXT: br label [[END]]
|
||||||
; CHECK: end:
|
; CHECK: end:
|
||||||
; CHECK-NEXT: [[PHI:%.*]] = phi float [ [[LS]], [[THEN]] ], [ 0.000000e+00, [[ENTRY:%.*]] ]
|
; CHECK-NEXT: [[PHI_TC:%.*]] = phi i32 [ [[LS_BC]], [[THEN]] ], [ 0, [[ENTRY:%.*]] ]
|
||||||
; CHECK-NEXT: [[B:%.*]] = bitcast float [[PHI]] to i32
|
; CHECK-NEXT: ret i32 [[PHI_TC]]
|
||||||
; CHECK-NEXT: ret i32 [[B]]
|
|
||||||
;
|
;
|
||||||
entry:
|
entry:
|
||||||
%cmp15 = icmp sgt i32 %n, 0
|
%cmp15 = icmp sgt i32 %n, 0
|
||||||
|
@ -935,11 +935,11 @@ define float @convphi2_ten(i32 *%s, i32 *%d, i32 %n) {
|
||||||
; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
|
; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
|
||||||
; CHECK: then:
|
; CHECK: then:
|
||||||
; CHECK-NEXT: [[LS:%.*]] = load i32, i32* [[S:%.*]], align 4
|
; CHECK-NEXT: [[LS:%.*]] = load i32, i32* [[S:%.*]], align 4
|
||||||
|
; CHECK-NEXT: [[LS_BC:%.*]] = bitcast i32 [[LS]] to float
|
||||||
; CHECK-NEXT: br label [[END]]
|
; CHECK-NEXT: br label [[END]]
|
||||||
; CHECK: end:
|
; CHECK: end:
|
||||||
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ 10, [[ENTRY:%.*]] ]
|
; CHECK-NEXT: [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ 0x36D4000000000000, [[ENTRY:%.*]] ]
|
||||||
; CHECK-NEXT: [[B:%.*]] = bitcast i32 [[PHI]] to float
|
; CHECK-NEXT: ret float [[PHI_TC]]
|
||||||
; CHECK-NEXT: ret float [[B]]
|
|
||||||
;
|
;
|
||||||
entry:
|
entry:
|
||||||
%cmp15 = icmp sgt i32 %n, 0
|
%cmp15 = icmp sgt i32 %n, 0
|
||||||
|
@ -962,11 +962,11 @@ define i32 @convphi2f_ten(float *%s, float *%d, i32 %n) {
|
||||||
; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
|
; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]]
|
||||||
; CHECK: then:
|
; CHECK: then:
|
||||||
; CHECK-NEXT: [[LS:%.*]] = load float, float* [[S:%.*]], align 4
|
; CHECK-NEXT: [[LS:%.*]] = load float, float* [[S:%.*]], align 4
|
||||||
|
; CHECK-NEXT: [[LS_BC:%.*]] = bitcast float [[LS]] to i32
|
||||||
; CHECK-NEXT: br label [[END]]
|
; CHECK-NEXT: br label [[END]]
|
||||||
; CHECK: end:
|
; CHECK: end:
|
||||||
; CHECK-NEXT: [[PHI:%.*]] = phi float [ [[LS]], [[THEN]] ], [ 1.000000e+01, [[ENTRY:%.*]] ]
|
; CHECK-NEXT: [[PHI_TC:%.*]] = phi i32 [ [[LS_BC]], [[THEN]] ], [ 1092616192, [[ENTRY:%.*]] ]
|
||||||
; CHECK-NEXT: [[B:%.*]] = bitcast float [[PHI]] to i32
|
; CHECK-NEXT: ret i32 [[PHI_TC]]
|
||||||
; CHECK-NEXT: ret i32 [[B]]
|
|
||||||
;
|
;
|
||||||
entry:
|
entry:
|
||||||
%cmp15 = icmp sgt i32 %n, 0
|
%cmp15 = icmp sgt i32 %n, 0
|
||||||
|
|
Loading…
Reference in New Issue