@@ -1933,5 +1933,112 @@ TEST(InstructionsTest, StripAndAccumulateConstantOffset) {
1933
1933
EXPECT_TRUE (Offset.isZero ());
1934
1934
}
1935
1935
1936
+ TEST (InstructionsTest, LLVMGetSetVolatile) {
1937
+ LLVMContext Ctx;
1938
+ Module M (" M" , Ctx);
1939
+ FunctionType *FT = FunctionType::get (Type::getVoidTy (Ctx), {}, false );
1940
+ Function *F = Function::Create (FT, Function::ExternalLinkage, " F" , M);
1941
+ BasicBlock *BB = BasicBlock::Create (Ctx, " entry" , F);
1942
+ IRBuilder<> B (BB);
1943
+
1944
+ Type *Int32Ty = Type::getInt32Ty (Ctx);
1945
+ Value *Val = B.getInt32 (1 );
1946
+ Value* Ptr = B.CreateAlloca (Int32Ty);
1947
+
1948
+ // LoadInst
1949
+ {
1950
+ LoadInst *Load = B.CreateLoad (Int32Ty, Ptr, " " );
1951
+
1952
+ EXPECT_FALSE (LLVMGetVolatile (wrap (Load)));
1953
+ LLVMSetVolatile (wrap (Load), true );
1954
+ EXPECT_TRUE (LLVMGetVolatile (wrap (Load)));
1955
+ LLVMSetVolatile (wrap (Load), false );
1956
+ EXPECT_FALSE (LLVMGetVolatile (wrap (Load)));
1957
+ }
1958
+
1959
+ // StoreInst
1960
+ {
1961
+ StoreInst *Store = B.CreateStore (Val, Ptr);
1962
+
1963
+ EXPECT_FALSE (LLVMGetVolatile (wrap (Store)));
1964
+ LLVMSetVolatile (wrap (Store), true );
1965
+ EXPECT_TRUE (LLVMGetVolatile (wrap (Store)));
1966
+ LLVMSetVolatile (wrap (Store), false );
1967
+ EXPECT_FALSE (LLVMGetVolatile (wrap (Store)));
1968
+ }
1969
+
1970
+ // AtomicRMWInst
1971
+ {
1972
+ AtomicRMWInst *RMW =
1973
+ B.CreateAtomicRMW (AtomicRMWInst::Add, Ptr, Val,
1974
+ MaybeAlign (), AtomicOrdering::Monotonic);
1975
+
1976
+ EXPECT_FALSE (LLVMGetVolatile (wrap (RMW)));
1977
+ LLVMSetVolatile (wrap (RMW), true );
1978
+ EXPECT_TRUE (LLVMGetVolatile (wrap (RMW)));
1979
+ LLVMSetVolatile (wrap (RMW), false );
1980
+ EXPECT_FALSE (LLVMGetVolatile (wrap (RMW)));
1981
+ }
1982
+
1983
+ // MemCpy
1984
+ {
1985
+ CallInst *MemCpy =
1986
+ B.CreateMemCpy (Ptr, MaybeAlign (), Ptr, MaybeAlign (), 4 );
1987
+
1988
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemCpy)));
1989
+ LLVMSetVolatile (wrap (MemCpy), true );
1990
+ EXPECT_TRUE (LLVMGetVolatile (wrap (MemCpy)));
1991
+ LLVMSetVolatile (wrap (MemCpy), false );
1992
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemCpy)));
1993
+ }
1994
+
1995
+ // MemMove
1996
+ {
1997
+ CallInst *MemMove =
1998
+ B.CreateMemMove (Ptr, MaybeAlign (), Ptr, MaybeAlign (), 4 );
1999
+
2000
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemMove)));
2001
+ LLVMSetVolatile (wrap (MemMove), true );
2002
+ EXPECT_TRUE (LLVMGetVolatile (wrap (MemMove)));
2003
+ LLVMSetVolatile (wrap (MemMove), false );
2004
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemMove)));
2005
+ }
2006
+
2007
+ // MemSet
2008
+ {
2009
+ CallInst *MemSet = B.CreateMemSet (Ptr, B.getInt8 (0 ), 1 , Align (1 ));
2010
+
2011
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemSet)));
2012
+ LLVMSetVolatile (wrap (MemSet), true );
2013
+ EXPECT_TRUE (LLVMGetVolatile (wrap (MemSet)));
2014
+ LLVMSetVolatile (wrap (MemSet), false );
2015
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemSet)));
2016
+ }
2017
+
2018
+ // MemSetInline
2019
+ {
2020
+ CallInst *MemSetInline =
2021
+ B.CreateMemSetInline (Ptr, Align (1 ), B.getInt8 (0 ), Val);
2022
+
2023
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemSetInline)));
2024
+ LLVMSetVolatile (wrap (MemSetInline), true );
2025
+ EXPECT_TRUE (LLVMGetVolatile (wrap (MemSetInline)));
2026
+ LLVMSetVolatile (wrap (MemSetInline), false );
2027
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemSetInline)));
2028
+ }
2029
+
2030
+ // MemCpyInline
2031
+ {
2032
+ CallInst *MemCpyInline = B.CreateMemCpyInline (
2033
+ Ptr, MaybeAlign (), Val, MaybeAlign (), Val);
2034
+
2035
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemCpyInline)));
2036
+ LLVMSetVolatile (wrap (MemCpyInline), true );
2037
+ EXPECT_TRUE (LLVMGetVolatile (wrap (MemCpyInline)));
2038
+ LLVMSetVolatile (wrap (MemCpyInline), false );
2039
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemCpyInline)));
2040
+ }
2041
+ }
2042
+
1936
2043
} // end anonymous namespace
1937
2044
} // end namespace llvm
0 commit comments