Index: llvm/lib/CodeGen/CodeGenPrepare.cpp =================================================================== --- llvm/lib/CodeGen/CodeGenPrepare.cpp +++ llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -6122,6 +6122,7 @@ SmallVector Worklist; Worklist.push_back(cast(I)); SmallPtrSet PhiNodes; + SmallPtrSet Constants; PhiNodes.insert(I); Visited.insert(I); SmallPtrSet Defs; @@ -6164,9 +6165,10 @@ AnyAnchored |= !isa(OpBC->getOperand(0)) && !isa(OpBC->getOperand(0)); } - } else if (!isa(V)) { + } else if (auto *OpC = dyn_cast(V)) + Constants.insert(OpC); + else return false; - } } } @@ -6208,7 +6210,8 @@ // Create all the new phi nodes of the new type, and bitcast any loads to the // correct type. 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) { if (isa(D)) { ValMap[D] = D->getOperand(0); Index: llvm/test/CodeGen/AArch64/convertphitype.ll =================================================================== --- llvm/test/CodeGen/AArch64/convertphitype.ll +++ llvm/test/CodeGen/AArch64/convertphitype.ll @@ -877,3 +877,111 @@ store atomic i32 %phi, i32 *%d release, align 4 ret void } + +define float @convphi2_zero(i32 *%s, i32 *%d, i32 %n) { +; CHECK-LABEL: @convphi2_zero( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 +; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]] +; CHECK: then: +; CHECK-NEXT: [[LS:%.*]] = load i32, i32* [[S:%.*]], align 4 +; CHECK-NEXT: [[LS_BC:%.*]] = bitcast i32 [[LS]] to float +; CHECK-NEXT: br label [[END]] +; CHECK: end: +; CHECK-NEXT: [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ 0.000000e+00, [[ENTRY:%.*]] ] +; CHECK-NEXT: ret float [[PHI_TC]] +; +entry: + %cmp15 = icmp sgt i32 %n, 0 + br i1 %cmp15, label %then, label %end + +then: + %ls = load i32, i32* %s, align 4 + br label %end + +end: + %phi = phi i32 [ %ls, %then ], [ 0, %entry ] + %b = bitcast i32 %phi to float + ret float %b +} + +define i32 @convphi2f_zero(float *%s, float *%d, i32 %n) { +; CHECK-LABEL: @convphi2f_zero( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 +; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]] +; CHECK: then: +; CHECK-NEXT: [[LS:%.*]] = load float, float* [[S:%.*]], align 4 +; CHECK-NEXT: [[LS_BC:%.*]] = bitcast float [[LS]] to i32 +; CHECK-NEXT: br label [[END]] +; CHECK: end: +; CHECK-NEXT: [[PHI_TC:%.*]] = phi i32 [ [[LS_BC]], [[THEN]] ], [ 0, [[ENTRY:%.*]] ] +; CHECK-NEXT: ret i32 [[PHI_TC]] +; +entry: + %cmp15 = icmp sgt i32 %n, 0 + br i1 %cmp15, label %then, label %end + +then: + %ls = load float, float* %s, align 4 + br label %end + +end: + %phi = phi float [ %ls, %then ], [ 0.0, %entry ] + %b = bitcast float %phi to i32 + ret i32 %b +} + +define float @convphi2_ten(i32 *%s, i32 *%d, i32 %n) { +; CHECK-LABEL: @convphi2_ten( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 +; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]] +; CHECK: then: +; CHECK-NEXT: [[LS:%.*]] = load i32, i32* [[S:%.*]], align 4 +; CHECK-NEXT: [[LS_BC:%.*]] = bitcast i32 [[LS]] to float +; CHECK-NEXT: br label [[END]] +; CHECK: end: +; CHECK-NEXT: [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ 0x36D4000000000000, [[ENTRY:%.*]] ] +; CHECK-NEXT: ret float [[PHI_TC]] +; +entry: + %cmp15 = icmp sgt i32 %n, 0 + br i1 %cmp15, label %then, label %end + +then: + %ls = load i32, i32* %s, align 4 + br label %end + +end: + %phi = phi i32 [ %ls, %then ], [ 10, %entry ] + %b = bitcast i32 %phi to float + ret float %b +} + +define i32 @convphi2f_ten(float *%s, float *%d, i32 %n) { +; CHECK-LABEL: @convphi2f_ten( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 +; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]] +; CHECK: then: +; CHECK-NEXT: [[LS:%.*]] = load float, float* [[S:%.*]], align 4 +; CHECK-NEXT: [[LS_BC:%.*]] = bitcast float [[LS]] to i32 +; CHECK-NEXT: br label [[END]] +; CHECK: end: +; CHECK-NEXT: [[PHI_TC:%.*]] = phi i32 [ [[LS_BC]], [[THEN]] ], [ 1092616192, [[ENTRY:%.*]] ] +; CHECK-NEXT: ret i32 [[PHI_TC]] +; +entry: + %cmp15 = icmp sgt i32 %n, 0 + br i1 %cmp15, label %then, label %end + +then: + %ls = load float, float* %s, align 4 + br label %end + +end: + %phi = phi float [ %ls, %then ], [ 10.0, %entry ] + %b = bitcast float %phi to i32 + ret i32 %b +}