Merged to release_90 in r367525.
On Tue, Jul 30, 2019 at 5:32 PM David Major via cfe-commits <cfe-commits@lists.llvm.org> wrote: > > Author: dmajor > Date: Tue Jul 30 08:32:49 2019 > New Revision: 367323 > > URL: http://llvm.org/viewvc/llvm-project?rev=367323&view=rev > Log: > [COFF][ARM64] Reorder handling of aarch64 MSVC builtins > > In `CodeGenFunction::EmitAArch64BuiltinExpr()`, bulk move all of the aarch64 > MSVC-builtin cases to an earlier point in the function (the `// Handle > non-overloaded intrinsics first` switch block) in order to avoid an > unreachable in `GetNeonType()`. The NEON type-overloading logic is not > appropriate for the Windows builtins. > > Fixes https://llvm.org/pr42775 > > Differential Revision: https://reviews.llvm.org/D65403 > > > Modified: > cfe/trunk/lib/CodeGen/CGBuiltin.cpp > cfe/trunk/test/CodeGen/arm64-microsoft-intrinsics.c > > Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=367323&r1=367322&r2=367323&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Tue Jul 30 08:32:49 2019 > @@ -8014,6 +8014,151 @@ Value *CodeGenFunction::EmitAArch64Built > return Builder.CreateExtractElement(Ops[0], EmitScalarExpr(E->getArg(1)), > "vgetq_lane"); > } > + case AArch64::BI_BitScanForward: > + case AArch64::BI_BitScanForward64: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_BitScanForward, E); > + case AArch64::BI_BitScanReverse: > + case AArch64::BI_BitScanReverse64: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_BitScanReverse, E); > + case AArch64::BI_InterlockedAnd64: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedAnd, E); > + case AArch64::BI_InterlockedExchange64: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchange, E); > + case AArch64::BI_InterlockedExchangeAdd64: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeAdd, E); > + case AArch64::BI_InterlockedExchangeSub64: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeSub, E); > + case AArch64::BI_InterlockedOr64: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedOr, E); > + case AArch64::BI_InterlockedXor64: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedXor, E); > + case AArch64::BI_InterlockedDecrement64: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedDecrement, E); > + case AArch64::BI_InterlockedIncrement64: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedIncrement, E); > + case AArch64::BI_InterlockedExchangeAdd8_acq: > + case AArch64::BI_InterlockedExchangeAdd16_acq: > + case AArch64::BI_InterlockedExchangeAdd_acq: > + case AArch64::BI_InterlockedExchangeAdd64_acq: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeAdd_acq, E); > + case AArch64::BI_InterlockedExchangeAdd8_rel: > + case AArch64::BI_InterlockedExchangeAdd16_rel: > + case AArch64::BI_InterlockedExchangeAdd_rel: > + case AArch64::BI_InterlockedExchangeAdd64_rel: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeAdd_rel, E); > + case AArch64::BI_InterlockedExchangeAdd8_nf: > + case AArch64::BI_InterlockedExchangeAdd16_nf: > + case AArch64::BI_InterlockedExchangeAdd_nf: > + case AArch64::BI_InterlockedExchangeAdd64_nf: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeAdd_nf, E); > + case AArch64::BI_InterlockedExchange8_acq: > + case AArch64::BI_InterlockedExchange16_acq: > + case AArch64::BI_InterlockedExchange_acq: > + case AArch64::BI_InterlockedExchange64_acq: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchange_acq, E); > + case AArch64::BI_InterlockedExchange8_rel: > + case AArch64::BI_InterlockedExchange16_rel: > + case AArch64::BI_InterlockedExchange_rel: > + case AArch64::BI_InterlockedExchange64_rel: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchange_rel, E); > + case AArch64::BI_InterlockedExchange8_nf: > + case AArch64::BI_InterlockedExchange16_nf: > + case AArch64::BI_InterlockedExchange_nf: > + case AArch64::BI_InterlockedExchange64_nf: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchange_nf, E); > + case AArch64::BI_InterlockedCompareExchange8_acq: > + case AArch64::BI_InterlockedCompareExchange16_acq: > + case AArch64::BI_InterlockedCompareExchange_acq: > + case AArch64::BI_InterlockedCompareExchange64_acq: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedCompareExchange_acq, > E); > + case AArch64::BI_InterlockedCompareExchange8_rel: > + case AArch64::BI_InterlockedCompareExchange16_rel: > + case AArch64::BI_InterlockedCompareExchange_rel: > + case AArch64::BI_InterlockedCompareExchange64_rel: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedCompareExchange_rel, > E); > + case AArch64::BI_InterlockedCompareExchange8_nf: > + case AArch64::BI_InterlockedCompareExchange16_nf: > + case AArch64::BI_InterlockedCompareExchange_nf: > + case AArch64::BI_InterlockedCompareExchange64_nf: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedCompareExchange_nf, > E); > + case AArch64::BI_InterlockedOr8_acq: > + case AArch64::BI_InterlockedOr16_acq: > + case AArch64::BI_InterlockedOr_acq: > + case AArch64::BI_InterlockedOr64_acq: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedOr_acq, E); > + case AArch64::BI_InterlockedOr8_rel: > + case AArch64::BI_InterlockedOr16_rel: > + case AArch64::BI_InterlockedOr_rel: > + case AArch64::BI_InterlockedOr64_rel: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedOr_rel, E); > + case AArch64::BI_InterlockedOr8_nf: > + case AArch64::BI_InterlockedOr16_nf: > + case AArch64::BI_InterlockedOr_nf: > + case AArch64::BI_InterlockedOr64_nf: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedOr_nf, E); > + case AArch64::BI_InterlockedXor8_acq: > + case AArch64::BI_InterlockedXor16_acq: > + case AArch64::BI_InterlockedXor_acq: > + case AArch64::BI_InterlockedXor64_acq: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedXor_acq, E); > + case AArch64::BI_InterlockedXor8_rel: > + case AArch64::BI_InterlockedXor16_rel: > + case AArch64::BI_InterlockedXor_rel: > + case AArch64::BI_InterlockedXor64_rel: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedXor_rel, E); > + case AArch64::BI_InterlockedXor8_nf: > + case AArch64::BI_InterlockedXor16_nf: > + case AArch64::BI_InterlockedXor_nf: > + case AArch64::BI_InterlockedXor64_nf: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedXor_nf, E); > + case AArch64::BI_InterlockedAnd8_acq: > + case AArch64::BI_InterlockedAnd16_acq: > + case AArch64::BI_InterlockedAnd_acq: > + case AArch64::BI_InterlockedAnd64_acq: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedAnd_acq, E); > + case AArch64::BI_InterlockedAnd8_rel: > + case AArch64::BI_InterlockedAnd16_rel: > + case AArch64::BI_InterlockedAnd_rel: > + case AArch64::BI_InterlockedAnd64_rel: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedAnd_rel, E); > + case AArch64::BI_InterlockedAnd8_nf: > + case AArch64::BI_InterlockedAnd16_nf: > + case AArch64::BI_InterlockedAnd_nf: > + case AArch64::BI_InterlockedAnd64_nf: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedAnd_nf, E); > + case AArch64::BI_InterlockedIncrement16_acq: > + case AArch64::BI_InterlockedIncrement_acq: > + case AArch64::BI_InterlockedIncrement64_acq: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedIncrement_acq, E); > + case AArch64::BI_InterlockedIncrement16_rel: > + case AArch64::BI_InterlockedIncrement_rel: > + case AArch64::BI_InterlockedIncrement64_rel: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedIncrement_rel, E); > + case AArch64::BI_InterlockedIncrement16_nf: > + case AArch64::BI_InterlockedIncrement_nf: > + case AArch64::BI_InterlockedIncrement64_nf: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedIncrement_nf, E); > + case AArch64::BI_InterlockedDecrement16_acq: > + case AArch64::BI_InterlockedDecrement_acq: > + case AArch64::BI_InterlockedDecrement64_acq: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedDecrement_acq, E); > + case AArch64::BI_InterlockedDecrement16_rel: > + case AArch64::BI_InterlockedDecrement_rel: > + case AArch64::BI_InterlockedDecrement64_rel: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedDecrement_rel, E); > + case AArch64::BI_InterlockedDecrement16_nf: > + case AArch64::BI_InterlockedDecrement_nf: > + case AArch64::BI_InterlockedDecrement64_nf: > + return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedDecrement_nf, E); > + > + case AArch64::BI_InterlockedAdd: { > + Value *Arg0 = EmitScalarExpr(E->getArg(0)); > + Value *Arg1 = EmitScalarExpr(E->getArg(1)); > + AtomicRMWInst *RMWI = Builder.CreateAtomicRMW( > + AtomicRMWInst::Add, Arg0, Arg1, > + llvm::AtomicOrdering::SequentiallyConsistent); > + return Builder.CreateAdd(RMWI, Arg1); > + } > } > > llvm::VectorType *VTy = GetNeonType(this, Type); > @@ -9131,151 +9276,6 @@ Value *CodeGenFunction::EmitAArch64Built > Int = Intrinsic::aarch64_neon_suqadd; > return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vuqadd"); > } > - case AArch64::BI_BitScanForward: > - case AArch64::BI_BitScanForward64: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_BitScanForward, E); > - case AArch64::BI_BitScanReverse: > - case AArch64::BI_BitScanReverse64: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_BitScanReverse, E); > - case AArch64::BI_InterlockedAnd64: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedAnd, E); > - case AArch64::BI_InterlockedExchange64: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchange, E); > - case AArch64::BI_InterlockedExchangeAdd64: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeAdd, E); > - case AArch64::BI_InterlockedExchangeSub64: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeSub, E); > - case AArch64::BI_InterlockedOr64: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedOr, E); > - case AArch64::BI_InterlockedXor64: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedXor, E); > - case AArch64::BI_InterlockedDecrement64: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedDecrement, E); > - case AArch64::BI_InterlockedIncrement64: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedIncrement, E); > - case AArch64::BI_InterlockedExchangeAdd8_acq: > - case AArch64::BI_InterlockedExchangeAdd16_acq: > - case AArch64::BI_InterlockedExchangeAdd_acq: > - case AArch64::BI_InterlockedExchangeAdd64_acq: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeAdd_acq, E); > - case AArch64::BI_InterlockedExchangeAdd8_rel: > - case AArch64::BI_InterlockedExchangeAdd16_rel: > - case AArch64::BI_InterlockedExchangeAdd_rel: > - case AArch64::BI_InterlockedExchangeAdd64_rel: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeAdd_rel, E); > - case AArch64::BI_InterlockedExchangeAdd8_nf: > - case AArch64::BI_InterlockedExchangeAdd16_nf: > - case AArch64::BI_InterlockedExchangeAdd_nf: > - case AArch64::BI_InterlockedExchangeAdd64_nf: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchangeAdd_nf, E); > - case AArch64::BI_InterlockedExchange8_acq: > - case AArch64::BI_InterlockedExchange16_acq: > - case AArch64::BI_InterlockedExchange_acq: > - case AArch64::BI_InterlockedExchange64_acq: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchange_acq, E); > - case AArch64::BI_InterlockedExchange8_rel: > - case AArch64::BI_InterlockedExchange16_rel: > - case AArch64::BI_InterlockedExchange_rel: > - case AArch64::BI_InterlockedExchange64_rel: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchange_rel, E); > - case AArch64::BI_InterlockedExchange8_nf: > - case AArch64::BI_InterlockedExchange16_nf: > - case AArch64::BI_InterlockedExchange_nf: > - case AArch64::BI_InterlockedExchange64_nf: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedExchange_nf, E); > - case AArch64::BI_InterlockedCompareExchange8_acq: > - case AArch64::BI_InterlockedCompareExchange16_acq: > - case AArch64::BI_InterlockedCompareExchange_acq: > - case AArch64::BI_InterlockedCompareExchange64_acq: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedCompareExchange_acq, > E); > - case AArch64::BI_InterlockedCompareExchange8_rel: > - case AArch64::BI_InterlockedCompareExchange16_rel: > - case AArch64::BI_InterlockedCompareExchange_rel: > - case AArch64::BI_InterlockedCompareExchange64_rel: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedCompareExchange_rel, > E); > - case AArch64::BI_InterlockedCompareExchange8_nf: > - case AArch64::BI_InterlockedCompareExchange16_nf: > - case AArch64::BI_InterlockedCompareExchange_nf: > - case AArch64::BI_InterlockedCompareExchange64_nf: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedCompareExchange_nf, > E); > - case AArch64::BI_InterlockedOr8_acq: > - case AArch64::BI_InterlockedOr16_acq: > - case AArch64::BI_InterlockedOr_acq: > - case AArch64::BI_InterlockedOr64_acq: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedOr_acq, E); > - case AArch64::BI_InterlockedOr8_rel: > - case AArch64::BI_InterlockedOr16_rel: > - case AArch64::BI_InterlockedOr_rel: > - case AArch64::BI_InterlockedOr64_rel: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedOr_rel, E); > - case AArch64::BI_InterlockedOr8_nf: > - case AArch64::BI_InterlockedOr16_nf: > - case AArch64::BI_InterlockedOr_nf: > - case AArch64::BI_InterlockedOr64_nf: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedOr_nf, E); > - case AArch64::BI_InterlockedXor8_acq: > - case AArch64::BI_InterlockedXor16_acq: > - case AArch64::BI_InterlockedXor_acq: > - case AArch64::BI_InterlockedXor64_acq: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedXor_acq, E); > - case AArch64::BI_InterlockedXor8_rel: > - case AArch64::BI_InterlockedXor16_rel: > - case AArch64::BI_InterlockedXor_rel: > - case AArch64::BI_InterlockedXor64_rel: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedXor_rel, E); > - case AArch64::BI_InterlockedXor8_nf: > - case AArch64::BI_InterlockedXor16_nf: > - case AArch64::BI_InterlockedXor_nf: > - case AArch64::BI_InterlockedXor64_nf: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedXor_nf, E); > - case AArch64::BI_InterlockedAnd8_acq: > - case AArch64::BI_InterlockedAnd16_acq: > - case AArch64::BI_InterlockedAnd_acq: > - case AArch64::BI_InterlockedAnd64_acq: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedAnd_acq, E); > - case AArch64::BI_InterlockedAnd8_rel: > - case AArch64::BI_InterlockedAnd16_rel: > - case AArch64::BI_InterlockedAnd_rel: > - case AArch64::BI_InterlockedAnd64_rel: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedAnd_rel, E); > - case AArch64::BI_InterlockedAnd8_nf: > - case AArch64::BI_InterlockedAnd16_nf: > - case AArch64::BI_InterlockedAnd_nf: > - case AArch64::BI_InterlockedAnd64_nf: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedAnd_nf, E); > - case AArch64::BI_InterlockedIncrement16_acq: > - case AArch64::BI_InterlockedIncrement_acq: > - case AArch64::BI_InterlockedIncrement64_acq: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedIncrement_acq, E); > - case AArch64::BI_InterlockedIncrement16_rel: > - case AArch64::BI_InterlockedIncrement_rel: > - case AArch64::BI_InterlockedIncrement64_rel: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedIncrement_rel, E); > - case AArch64::BI_InterlockedIncrement16_nf: > - case AArch64::BI_InterlockedIncrement_nf: > - case AArch64::BI_InterlockedIncrement64_nf: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedIncrement_nf, E); > - case AArch64::BI_InterlockedDecrement16_acq: > - case AArch64::BI_InterlockedDecrement_acq: > - case AArch64::BI_InterlockedDecrement64_acq: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedDecrement_acq, E); > - case AArch64::BI_InterlockedDecrement16_rel: > - case AArch64::BI_InterlockedDecrement_rel: > - case AArch64::BI_InterlockedDecrement64_rel: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedDecrement_rel, E); > - case AArch64::BI_InterlockedDecrement16_nf: > - case AArch64::BI_InterlockedDecrement_nf: > - case AArch64::BI_InterlockedDecrement64_nf: > - return EmitMSVCBuiltinExpr(MSVCIntrin::_InterlockedDecrement_nf, E); > - > - case AArch64::BI_InterlockedAdd: { > - Value *Arg0 = EmitScalarExpr(E->getArg(0)); > - Value *Arg1 = EmitScalarExpr(E->getArg(1)); > - AtomicRMWInst *RMWI = Builder.CreateAtomicRMW( > - AtomicRMWInst::Add, Arg0, Arg1, > - llvm::AtomicOrdering::SequentiallyConsistent); > - return Builder.CreateAdd(RMWI, Arg1); > - } > } > } > > > Modified: cfe/trunk/test/CodeGen/arm64-microsoft-intrinsics.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm64-microsoft-intrinsics.c?rev=367323&r1=367322&r2=367323&view=diff > ============================================================================== > --- cfe/trunk/test/CodeGen/arm64-microsoft-intrinsics.c (original) > +++ cfe/trunk/test/CodeGen/arm64-microsoft-intrinsics.c Tue Jul 30 08:32:49 > 2019 > @@ -8,6 +8,10 @@ long test_InterlockedAdd(long volatile * > return _InterlockedAdd(Addend, Value); > } > > +long test_InterlockedAdd_constant(long volatile *Addend) { > + return _InterlockedAdd(Addend, -1); > +} > + > // CHECK-LABEL: define {{.*}} i32 @test_InterlockedAdd(i32* %Addend, i32 > %Value) {{.*}} { > // CHECK-MSVC: %[[OLDVAL:[0-9]+]] = atomicrmw add i32* %1, i32 %2 seq_cst > // CHECK-MSVC: %[[NEWVAL:[0-9]+]] = add i32 %[[OLDVAL:[0-9]+]], %2 > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits