@@ -1933,5 +1933,110 @@ 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 = B.CreateAtomicRMW (
1973
+ AtomicRMWInst::Add, Ptr, Val, MaybeAlign (), AtomicOrdering::Monotonic);
1974
+
1975
+ EXPECT_FALSE (LLVMGetVolatile (wrap (RMW)));
1976
+ LLVMSetVolatile (wrap (RMW), true );
1977
+ EXPECT_TRUE (LLVMGetVolatile (wrap (RMW)));
1978
+ LLVMSetVolatile (wrap (RMW), false );
1979
+ EXPECT_FALSE (LLVMGetVolatile (wrap (RMW)));
1980
+ }
1981
+
1982
+ // MemCpy
1983
+ {
1984
+ CallInst *MemCpy = B.CreateMemCpy (Ptr, MaybeAlign (), Ptr, MaybeAlign (), 4 );
1985
+
1986
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemCpy)));
1987
+ LLVMSetVolatile (wrap (MemCpy), true );
1988
+ EXPECT_TRUE (LLVMGetVolatile (wrap (MemCpy)));
1989
+ LLVMSetVolatile (wrap (MemCpy), false );
1990
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemCpy)));
1991
+ }
1992
+
1993
+ // MemMove
1994
+ {
1995
+ CallInst *MemMove =
1996
+ B.CreateMemMove (Ptr, MaybeAlign (), Ptr, MaybeAlign (), 4 );
1997
+
1998
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemMove)));
1999
+ LLVMSetVolatile (wrap (MemMove), true );
2000
+ EXPECT_TRUE (LLVMGetVolatile (wrap (MemMove)));
2001
+ LLVMSetVolatile (wrap (MemMove), false );
2002
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemMove)));
2003
+ }
2004
+
2005
+ // MemSet
2006
+ {
2007
+ CallInst *MemSet = B.CreateMemSet (Ptr, B.getInt8 (0 ), 1 , Align (1 ));
2008
+
2009
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemSet)));
2010
+ LLVMSetVolatile (wrap (MemSet), true );
2011
+ EXPECT_TRUE (LLVMGetVolatile (wrap (MemSet)));
2012
+ LLVMSetVolatile (wrap (MemSet), false );
2013
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemSet)));
2014
+ }
2015
+
2016
+ // MemSetInline
2017
+ {
2018
+ CallInst *MemSetInline =
2019
+ B.CreateMemSetInline (Ptr, Align (1 ), B.getInt8 (0 ), Val);
2020
+
2021
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemSetInline)));
2022
+ LLVMSetVolatile (wrap (MemSetInline), true );
2023
+ EXPECT_TRUE (LLVMGetVolatile (wrap (MemSetInline)));
2024
+ LLVMSetVolatile (wrap (MemSetInline), false );
2025
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemSetInline)));
2026
+ }
2027
+
2028
+ // MemCpyInline
2029
+ {
2030
+ CallInst *MemCpyInline =
2031
+ B.CreateMemCpyInline (Ptr, MaybeAlign (), Val, MaybeAlign (), Val);
2032
+
2033
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemCpyInline)));
2034
+ LLVMSetVolatile (wrap (MemCpyInline), true );
2035
+ EXPECT_TRUE (LLVMGetVolatile (wrap (MemCpyInline)));
2036
+ LLVMSetVolatile (wrap (MemCpyInline), false );
2037
+ EXPECT_FALSE (LLVMGetVolatile (wrap (MemCpyInline)));
2038
+ }
2039
+ }
2040
+
1936
2041
} // end anonymous namespace
1937
2042
} // end namespace llvm
0 commit comments