Clean up a very silly use of first-class aggregates.
llvm-svn: 111777
This commit is contained in:
@@ -234,12 +234,6 @@ ItaniumCXXABI::EmitMemberFunctionPointerConversion(CodeGenFunction &CGF,
|
|||||||
E->path_end());
|
E->path_end());
|
||||||
if (!Adj) return Src;
|
if (!Adj) return Src;
|
||||||
|
|
||||||
llvm::Value *SrcPtr = Builder.CreateExtractValue(Src, 0, "src.ptr");
|
|
||||||
llvm::Value *SrcAdj = Builder.CreateExtractValue(Src, 1, "src.adj");
|
|
||||||
|
|
||||||
llvm::Value *Result = llvm::UndefValue::get(Src->getType());
|
|
||||||
Result = Builder.CreateInsertValue(Result, SrcPtr, 0);
|
|
||||||
|
|
||||||
// The this-adjustment is left-shifted by 1 on ARM.
|
// The this-adjustment is left-shifted by 1 on ARM.
|
||||||
if (IsARM) {
|
if (IsARM) {
|
||||||
uint64_t Offset = cast<llvm::ConstantInt>(Adj)->getZExtValue();
|
uint64_t Offset = cast<llvm::ConstantInt>(Adj)->getZExtValue();
|
||||||
@@ -247,14 +241,14 @@ ItaniumCXXABI::EmitMemberFunctionPointerConversion(CodeGenFunction &CGF,
|
|||||||
Adj = llvm::ConstantInt::get(Adj->getType(), Offset);
|
Adj = llvm::ConstantInt::get(Adj->getType(), Offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
llvm::Value *SrcAdj = Builder.CreateExtractValue(Src, 1, "src.adj");
|
||||||
llvm::Value *DstAdj;
|
llvm::Value *DstAdj;
|
||||||
if (DerivedToBase)
|
if (DerivedToBase)
|
||||||
DstAdj = Builder.CreateSub(SrcAdj, Adj, "adj");
|
DstAdj = Builder.CreateSub(SrcAdj, Adj, "adj");
|
||||||
else
|
else
|
||||||
DstAdj = Builder.CreateAdd(SrcAdj, Adj, "adj");
|
DstAdj = Builder.CreateAdd(SrcAdj, Adj, "adj");
|
||||||
|
|
||||||
Result = Builder.CreateInsertValue(Result, DstAdj, 1);
|
return Builder.CreateInsertValue(Src, DstAdj, 1);
|
||||||
return Result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::Constant *
|
llvm::Constant *
|
||||||
|
|||||||
@@ -37,21 +37,17 @@ void f() {
|
|||||||
vpa = 0;
|
vpa = 0;
|
||||||
|
|
||||||
// CHECK: [[TMP:%.*]] = load %0* @pa, align 8
|
// CHECK: [[TMP:%.*]] = load %0* @pa, align 8
|
||||||
// CHECK: [[TMPPTR:%.*]] = extractvalue %0 [[TMP]], 0
|
|
||||||
// CHECK: [[TMPADJ:%.*]] = extractvalue %0 [[TMP]], 1
|
// CHECK: [[TMPADJ:%.*]] = extractvalue %0 [[TMP]], 1
|
||||||
// CHECK: [[RES0:%.*]] = insertvalue %0 undef, i64 [[TMPPTR]], 0
|
|
||||||
// CHECK: [[ADJ:%.*]] = add i64 [[TMPADJ]], 16
|
// CHECK: [[ADJ:%.*]] = add i64 [[TMPADJ]], 16
|
||||||
// CHECK: [[RES1:%.*]] = insertvalue %0 [[RES0]], i64 [[ADJ]], 1
|
// CHECK: [[RES:%.*]] = insertvalue %0 [[TMP]], i64 [[ADJ]], 1
|
||||||
// CHECK: store %0 [[RES1]], %0* @pc, align 8
|
// CHECK: store %0 [[RES]], %0* @pc, align 8
|
||||||
pc = pa;
|
pc = pa;
|
||||||
|
|
||||||
// CHECK: [[TMP:%.*]] = load %0* @pc, align 8
|
// CHECK: [[TMP:%.*]] = load %0* @pc, align 8
|
||||||
// CHECK: [[TMPPTR:%.*]] = extractvalue %0 [[TMP]], 0
|
|
||||||
// CHECK: [[TMPADJ:%.*]] = extractvalue %0 [[TMP]], 1
|
// CHECK: [[TMPADJ:%.*]] = extractvalue %0 [[TMP]], 1
|
||||||
// CHECK: [[RES0:%.*]] = insertvalue %0 undef, i64 [[TMPPTR]], 0
|
|
||||||
// CHECK: [[ADJ:%.*]] = sub i64 [[TMPADJ]], 16
|
// CHECK: [[ADJ:%.*]] = sub i64 [[TMPADJ]], 16
|
||||||
// CHECK: [[RES1:%.*]] = insertvalue %0 [[RES0]], i64 [[ADJ]], 1
|
// CHECK: [[RES:%.*]] = insertvalue %0 [[TMP]], i64 [[ADJ]], 1
|
||||||
// CHECK: store %0 [[RES1]], %0* @pa, align 8
|
// CHECK: store %0 [[RES]], %0* @pa, align 8
|
||||||
pa = static_cast<void (A::*)()>(pc);
|
pa = static_cast<void (A::*)()>(pc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user