diff --git a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp --- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp +++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp @@ -161,7 +161,7 @@ class OpenMPIRBuilderTest : public testing::Test { protected: void SetUp() override { - Ctx.setOpaquePointers(false); // TODO: Update tests for opaque pointers. + Ctx.setOpaquePointers(true); M.reset(new Module("MyModule", Ctx)); FunctionType *FTy = FunctionType::get(Type::getVoidTy(Ctx), {Type::getInt32Ty(Ctx)}, @@ -680,8 +680,8 @@ EXPECT_EQ(&OutlinedFn->getEntryBlock(), PrivAI->getParent()); EXPECT_EQ(OutlinedFn->getNumUses(), 1U); User *Usr = OutlinedFn->user_back(); - ASSERT_TRUE(isa(Usr)); - CallInst *ForkCI = dyn_cast(Usr->user_back()); + ASSERT_TRUE(isa(Usr)); + CallInst *ForkCI = dyn_cast(Usr); ASSERT_NE(ForkCI, nullptr); EXPECT_EQ(ForkCI->getCalledFunction()->getName(), "__kmpc_fork_call"); @@ -689,7 +689,7 @@ EXPECT_TRUE(isa(ForkCI->getArgOperand(0))); EXPECT_EQ(ForkCI->getArgOperand(1), ConstantInt::get(Type::getInt32Ty(Ctx), 1U)); - EXPECT_EQ(ForkCI->getArgOperand(2), Usr); + EXPECT_EQ(ForkCI, Usr); Value *StoredValue = findStoredValueInAggregateAt(Ctx, ForkCI->getArgOperand(3), 0); EXPECT_EQ(StoredValue, F->arg_begin()); @@ -776,8 +776,8 @@ EXPECT_EQ(OutlinedFn.getNumUses(), 1U); User *Usr = OutlinedFn.user_back(); - ASSERT_TRUE(isa(Usr)); - CallInst *ForkCI = dyn_cast(Usr->user_back()); + ASSERT_TRUE(isa(Usr)); + CallInst *ForkCI = dyn_cast(Usr); ASSERT_NE(ForkCI, nullptr); EXPECT_EQ(ForkCI->getCalledFunction()->getName(), "__kmpc_fork_call"); @@ -785,7 +785,7 @@ EXPECT_TRUE(isa(ForkCI->getArgOperand(0))); EXPECT_EQ(ForkCI->getArgOperand(1), ConstantInt::get(Type::getInt32Ty(Ctx), 0U)); - EXPECT_EQ(ForkCI->getArgOperand(2), Usr); + EXPECT_EQ(ForkCI, Usr); } } @@ -885,8 +885,8 @@ EXPECT_EQ(OutlinedFn.getNumUses(), 1U); User *Usr = OutlinedFn.user_back(); - ASSERT_TRUE(isa(Usr)); - CallInst *ForkCI = dyn_cast(Usr->user_back()); + ASSERT_TRUE(isa(Usr)); + CallInst *ForkCI = dyn_cast(Usr); ASSERT_NE(ForkCI, nullptr); EXPECT_EQ(ForkCI->getCalledFunction()->getName(), "__kmpc_fork_call"); @@ -894,7 +894,7 @@ EXPECT_TRUE(isa(ForkCI->getArgOperand(0))); EXPECT_EQ(ForkCI->getArgOperand(1), ConstantInt::get(Type::getInt32Ty(Ctx), 0U)); - EXPECT_EQ(ForkCI->getArgOperand(2), Usr); + EXPECT_EQ(ForkCI, Usr); } } @@ -990,10 +990,8 @@ CallInst *ForkCI = nullptr; for (User *Usr : OutlinedFn->users()) { - ASSERT_TRUE(isa(Usr)); - ASSERT_EQ(Usr->getNumUses(), 1U); - ASSERT_TRUE(isa(Usr->user_back())); - ForkCI = cast(Usr->user_back()); + ASSERT_TRUE(isa(Usr)); + ForkCI = cast(Usr); } EXPECT_EQ(ForkCI->getCalledFunction()->getName(), "__kmpc_fork_call_if"); @@ -3298,14 +3296,9 @@ IntegerType *IntCastTy = IntegerType::get(M->getContext(), Float32->getScalarSizeInBits()); - BitCastInst *CastFrmFlt = cast(VVal->getNextNode()); - EXPECT_EQ(CastFrmFlt->getSrcTy(), Float32->getPointerTo()); - EXPECT_EQ(CastFrmFlt->getDestTy(), IntCastTy->getPointerTo()); - EXPECT_EQ(CastFrmFlt->getOperand(0), XVal); - - LoadInst *AtomicLoad = cast(CastFrmFlt->getNextNode()); + LoadInst *AtomicLoad = cast(VVal->getNextNode()); EXPECT_TRUE(AtomicLoad->isAtomic()); - EXPECT_EQ(AtomicLoad->getPointerOperand(), CastFrmFlt); + EXPECT_EQ(AtomicLoad->getPointerOperand(), XVal); BitCastInst *CastToFlt = cast(AtomicLoad->getNextNode()); EXPECT_EQ(CastToFlt->getSrcTy(), IntCastTy); @@ -3391,16 +3384,11 @@ IntegerType *IntCastTy = IntegerType::get(M->getContext(), Float32->getScalarSizeInBits()); - BitCastInst *CastFrmFlt = cast(XVal->getNextNode()); - EXPECT_EQ(CastFrmFlt->getSrcTy(), Float32->getPointerTo()); - EXPECT_EQ(CastFrmFlt->getDestTy(), IntCastTy->getPointerTo()); - EXPECT_EQ(CastFrmFlt->getOperand(0), XVal); - Value *ExprCast = Builder.CreateBitCast(ValToWrite, IntCastTy); - StoreInst *StoreofAtomic = cast(CastFrmFlt->getNextNode()); + StoreInst *StoreofAtomic = cast(XVal->getNextNode()); EXPECT_EQ(StoreofAtomic->getValueOperand(), ExprCast); - EXPECT_EQ(StoreofAtomic->getPointerOperand(), CastFrmFlt); + EXPECT_EQ(StoreofAtomic->getPointerOperand(), XVal); EXPECT_TRUE(StoreofAtomic->isAtomic()); Builder.CreateRetVoid(); @@ -3569,19 +3557,13 @@ AtomicCmpXchgInst *CmpExchg = dyn_cast(ExVI1->getAggregateOperand()); EXPECT_NE(CmpExchg, nullptr); - BitCastInst *BitCastNew = - dyn_cast(CmpExchg->getPointerOperand()); - EXPECT_NE(BitCastNew, nullptr); - EXPECT_EQ(BitCastNew->getOperand(0), XVal); + EXPECT_EQ(CmpExchg->getPointerOperand(), XVal); EXPECT_EQ(CmpExchg->getCompareOperand(), Phi); EXPECT_EQ(CmpExchg->getSuccessOrdering(), AtomicOrdering::Monotonic); LoadInst *Ld = dyn_cast(CmpExchg->getNewValOperand()); EXPECT_NE(Ld, nullptr); - BitCastInst *BitCastOld = dyn_cast(Ld->getPointerOperand()); - EXPECT_NE(BitCastOld, nullptr); - EXPECT_EQ(UpdateTemp, BitCastOld->getOperand(0)); - + EXPECT_EQ(UpdateTemp, Ld->getPointerOperand()); Builder.CreateRetVoid(); OMPBuilder.finalize(); EXPECT_FALSE(verifyModule(*M, &errs())); @@ -4024,8 +4006,14 @@ auto *Inst = dyn_cast(U); if (!Inst || Inst->getParent() != BB) continue; - if (Result) - return nullptr; + if (Result) { + if (auto *SI = dyn_cast(Inst)) { + if (V == SI->getValueOperand()) + continue; + } else { + return nullptr; + } + } Result = Inst; } return Result; @@ -4250,7 +4238,7 @@ findCalls(F, omp::RuntimeFunction::OMPRTL___kmpc_fork_call, OMPBuilder, ForkCalls); ASSERT_EQ(ForkCalls.size(), 1u); - Value *CalleeVal = cast(ForkCalls[0]->getOperand(2))->getOperand(0); + Value *CalleeVal = ForkCalls[0]->getOperand(2); Function *Outlined = dyn_cast(CalleeVal); EXPECT_NE(Outlined, nullptr); @@ -4294,9 +4282,7 @@ // Check that the local array is passed to the function. ASSERT_NE(LocalArrayPtr, nullptr); - BitCastInst *BitCast = dyn_cast(LocalArrayPtr); - ASSERT_NE(BitCast, nullptr); - EXPECT_EQ(BitCast->getOperand(0), LocalArray); + EXPECT_EQ(LocalArrayPtr, LocalArray); // Find the GEP instructions preceding stores to the local array. Value *FirstArrayElemPtr = nullptr; @@ -4307,18 +4293,17 @@ // Check that the values stored into the local array are privatized reduction // variables. - auto *FirstStored = dyn_cast_or_null( + auto *FirstPrivatized = dyn_cast_or_null( findStoredValue(FirstArrayElemPtr)); - auto *SecondStored = dyn_cast_or_null( + auto *SecondPrivatized = dyn_cast_or_null( findStoredValue(SecondArrayElemPtr)); - ASSERT_NE(FirstStored, nullptr); - ASSERT_NE(SecondStored, nullptr); - Value *FirstPrivatized = FirstStored->getOperand(0); - Value *SecondPrivatized = SecondStored->getOperand(0); - EXPECT_TRUE( - isSimpleBinaryReduction(FirstPrivatized, FirstStored->getParent())); - EXPECT_TRUE( - isSimpleBinaryReduction(SecondPrivatized, SecondStored->getParent())); + ASSERT_NE(FirstPrivatized, nullptr); + ASSERT_NE(SecondPrivatized, nullptr); + ASSERT_TRUE(isa(FirstArrayElemPtr)); + EXPECT_TRUE(isSimpleBinaryReduction( + FirstPrivatized, cast(FirstArrayElemPtr)->getParent())); + EXPECT_TRUE(isSimpleBinaryReduction( + SecondPrivatized, cast(FirstArrayElemPtr)->getParent())); // Check that the result of the runtime reduction call is used for further // dispatch. @@ -4355,27 +4340,20 @@ // reductions after extracting reduction variables from its arguments. Function *ReductionFn = cast(ReductionFnVal); BasicBlock *FnReductionBB = &ReductionFn->getEntryBlock(); - auto *Bitcast = - findSingleUserInBlock(ReductionFn->getArg(0), FnReductionBB); Value *FirstLHSPtr; Value *SecondLHSPtr; - ASSERT_TRUE(findGEPZeroOne(Bitcast, FirstLHSPtr, SecondLHSPtr)); + ASSERT_TRUE( + findGEPZeroOne(ReductionFn->getArg(0), FirstLHSPtr, SecondLHSPtr)); Value *Opaque = findSingleUserInBlock(FirstLHSPtr, FnReductionBB); ASSERT_NE(Opaque, nullptr); - Bitcast = findSingleUserInBlock(Opaque, FnReductionBB); - ASSERT_NE(Bitcast, nullptr); - EXPECT_TRUE(isSimpleBinaryReduction(Bitcast, FnReductionBB)); + EXPECT_TRUE(isSimpleBinaryReduction(Opaque, FnReductionBB)); Opaque = findSingleUserInBlock(SecondLHSPtr, FnReductionBB); ASSERT_NE(Opaque, nullptr); - Bitcast = findSingleUserInBlock(Opaque, FnReductionBB); - ASSERT_NE(Bitcast, nullptr); - EXPECT_TRUE(isSimpleBinaryReduction(Bitcast, FnReductionBB)); + EXPECT_TRUE(isSimpleBinaryReduction(Opaque, FnReductionBB)); - Bitcast = - findSingleUserInBlock(ReductionFn->getArg(1), FnReductionBB); Value *FirstRHS; Value *SecondRHS; - EXPECT_TRUE(findGEPZeroOne(Bitcast, FirstRHS, SecondRHS)); + EXPECT_TRUE(findGEPZeroOne(ReductionFn->getArg(1), FirstRHS, SecondRHS)); } TEST_F(OpenMPIRBuilderTest, CreateTwoReductions) { @@ -4511,9 +4489,9 @@ findCalls(F, omp::RuntimeFunction::OMPRTL___kmpc_fork_call, OMPBuilder, ForkCalls); ASSERT_EQ(ForkCalls.size(), 2u); - Value *CalleeVal = cast(ForkCalls[0]->getOperand(2))->getOperand(0); + Value *CalleeVal = ForkCalls[0]->getOperand(2); Function *FirstCallee = cast(CalleeVal); - CalleeVal = cast(ForkCalls[1]->getOperand(2))->getOperand(0); + CalleeVal = ForkCalls[1]->getOperand(2); Function *SecondCallee = cast(CalleeVal); EXPECT_NE(FirstCallee, SecondCallee); @@ -4531,32 +4509,22 @@ // Each reduction function does its own kind of reduction. BasicBlock *FnReductionBB = &AddReduction->getEntryBlock(); - auto *Bitcast = findSingleUserInBlock(AddReduction->getArg(0), - FnReductionBB); - ASSERT_NE(Bitcast, nullptr); - Value *FirstLHSPtr = - findSingleUserInBlock(Bitcast, FnReductionBB); + Value *FirstLHSPtr = findSingleUserInBlock( + AddReduction->getArg(0), FnReductionBB); ASSERT_NE(FirstLHSPtr, nullptr); Value *Opaque = findSingleUserInBlock(FirstLHSPtr, FnReductionBB); ASSERT_NE(Opaque, nullptr); - Bitcast = findSingleUserInBlock(Opaque, FnReductionBB); - ASSERT_NE(Bitcast, nullptr); Instruction::BinaryOps Opcode = Instruction::FAdd; - EXPECT_TRUE(isSimpleBinaryReduction(Bitcast, FnReductionBB, &Opcode)); + EXPECT_TRUE(isSimpleBinaryReduction(Opaque, FnReductionBB, &Opcode)); FnReductionBB = &XorReduction->getEntryBlock(); - Bitcast = findSingleUserInBlock(XorReduction->getArg(0), - FnReductionBB); - ASSERT_NE(Bitcast, nullptr); - Value *SecondLHSPtr = - findSingleUserInBlock(Bitcast, FnReductionBB); + Value *SecondLHSPtr = findSingleUserInBlock( + XorReduction->getArg(0), FnReductionBB); ASSERT_NE(FirstLHSPtr, nullptr); Opaque = findSingleUserInBlock(SecondLHSPtr, FnReductionBB); ASSERT_NE(Opaque, nullptr); - Bitcast = findSingleUserInBlock(Opaque, FnReductionBB); - ASSERT_NE(Bitcast, nullptr); Opcode = Instruction::Xor; - EXPECT_TRUE(isSimpleBinaryReduction(Bitcast, FnReductionBB, &Opcode)); + EXPECT_TRUE(isSimpleBinaryReduction(Opaque, FnReductionBB, &Opcode)); } TEST_F(OpenMPIRBuilderTest, CreateSectionsSimple) { @@ -5352,13 +5320,9 @@ EXPECT_EQ(NumDeps->getZExtValue(), 1U); // Check for the `DepInfo` array argument - BitCastInst *DepArrayPtr = - dyn_cast(TaskAllocCall->getOperand(4)); - ASSERT_NE(DepArrayPtr, nullptr); - AllocaInst *DepArray = dyn_cast(DepArrayPtr->getOperand(0)); + AllocaInst *DepArray = dyn_cast(TaskAllocCall->getOperand(4)); ASSERT_NE(DepArray, nullptr); Value::user_iterator DepArrayI = DepArray->user_begin(); - EXPECT_EQ(*DepArrayI, DepArrayPtr); ++DepArrayI; Value::user_iterator DepInfoI = DepArrayI->user_begin(); // Check for the `DependKind` flag in the `DepInfo` array