Modifies AtomicExpandPass to transform relaxed loads/RMW/AtomicXchg to acquire
authorPeizhao Ou <peizhaoo@uci.edu>
Wed, 8 Nov 2017 22:49:40 +0000 (14:49 -0800)
committerPeizhao Ou <peizhaoo@uci.edu>
Wed, 8 Nov 2017 22:49:40 +0000 (14:49 -0800)
.clang-format
lib/CodeGen/AtomicExpandPass.cpp
make-tags.sh [new file with mode: 0755]

index 5bead5f..f5e68f4 100644 (file)
@@ -1,2 +1,90 @@
-BasedOnStyle: LLVM
+---
+Language:        Cpp
+# BasedOnStyle:  LLVM
+AccessModifierOffset: -2
+AlignAfterOpenBracket: Align
+AlignConsecutiveAssignments: false
+AlignConsecutiveDeclarations: false
+AlignEscapedNewlinesLeft: false
+AlignOperands:   true
+AlignTrailingComments: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortBlocksOnASingleLine: false
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: All
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLoopsOnASingleLine: false
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: false
+AlwaysBreakTemplateDeclarations: false
+BinPackArguments: true
+BinPackParameters: true
+BraceWrapping:   
+  AfterClass:      false
+  AfterControlStatement: false
+  AfterEnum:       false
+  AfterFunction:   false
+  AfterNamespace:  false
+  AfterObjCDeclaration: false
+  AfterStruct:     false
+  AfterUnion:      false
+  BeforeCatch:     false
+  BeforeElse:      false
+  IndentBraces:    false
+BreakBeforeBinaryOperators: None
+BreakBeforeBraces: Attach
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializersBeforeComma: false
+ColumnLimit:     80
+CommentPragmas:  '^ IWYU pragma:'
+ConstructorInitializerAllOnOneLineOrOnePerLine: false
+ConstructorInitializerIndentWidth: 4
+ContinuationIndentWidth: 4
+Cpp11BracedListStyle: true
+DerivePointerAlignment: false
+DisableFormat:   false
+ExperimentalAutoDetectBinPacking: false
+ForEachMacros:   [ foreach, Q_FOREACH, BOOST_FOREACH ]
+IncludeCategories: 
+  - Regex:           '^"(llvm|llvm-c|clang|clang-c)/'
+    Priority:        2
+  - Regex:           '^(<|"(gtest|isl|json)/)'
+    Priority:        3
+  - Regex:           '.*'
+    Priority:        1
+IndentCaseLabels: true
+IndentWidth:     2
+IndentWrappedFunctionNames: false
+KeepEmptyLinesAtTheStartOfBlocks: true
+MacroBlockBegin: ''
+MacroBlockEnd:   ''
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: None
+ObjCBlockIndentWidth: 2
+ObjCSpaceAfterProperty: false
+ObjCSpaceBeforeProtocolList: true
+PenaltyBreakBeforeFirstCallParameter: 19
+PenaltyBreakComment: 300
+PenaltyBreakFirstLessLess: 120
+PenaltyBreakString: 1000
+PenaltyExcessCharacter: 1000000
+PenaltyReturnTypeOnItsOwnLine: 60
+PointerAlignment: Left
+ReflowComments:  true
+SortIncludes:    true
+SpaceAfterCStyleCast: false
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeParens: ControlStatements
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles:  false
+SpacesInContainerLiterals: true
+SpacesInCStyleCastParentheses: false
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+Standard:        Cpp11
+TabWidth:        8
+UseTab:          Never
+...
 
index d12fdb2..b2134a7 100644 (file)
@@ -86,8 +86,40 @@ bool AtomicExpand::runOnFunction(Function &F) {
   // Changing control-flow while iterating through it is a bad idea, so gather a
   // list of all atomic instructions before we start.
   for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) {
-    if (I->isAtomic())
+    // XXX-update: For relaxed loads, change them to acquire. This includes
+    // relaxed loads, relaxed atomic RMW & relaxed atomic compare exchange.
+    if (I->isAtomic()) {
+      switch (I->getOpcode()) {
+        case Instruction::AtomicCmpXchg: {
+          auto* CmpXchg = dyn_cast<AtomicCmpXchgInst>(&*I);
+          auto SuccOrdering = CmpXchg->getSuccessOrdering();
+          if (SuccOrdering == Monotonic) {
+            CmpXchg->setSuccessOrdering(Acquire);
+          } else if (SuccOrdering == Release) {
+            CmpXchg->setSuccessOrdering(AcquireRelease);
+          }
+          break;
+        }
+        case Instruction::AtomicRMW: {
+          auto* RMW = dyn_cast<AtomicRMWInst>(&*I);
+          if (RMW->getOrdering() == Monotonic) {
+            RMW->setOrdering(Acquire);
+          }
+          break;
+        }
+        case Instruction::Load: {
+          auto* LI = dyn_cast<LoadInst>(&*I);
+          if (LI->getOrdering() == Monotonic) {
+            LI->setOrdering(Acquire);
+          }
+          break;
+        }
+        default: {
+          break;
+        }
+      }
       AtomicInsts.push_back(&*I);
+    }
   }
 
   bool MadeChange = false;
diff --git a/make-tags.sh b/make-tags.sh
new file mode 100755 (executable)
index 0000000..ade6680
--- /dev/null
@@ -0,0 +1,53 @@
+#!/bin/bash -e
+
+SrcDirs=(
+    lib/Analysis/
+    lib/AsmParser/
+    lib/Bitcode/
+    lib/CodeGen/
+    lib/DebugInfo
+    lib/ExecutionEngine
+    lib/Fuzzer
+    lib/IR
+    lib/IRReader
+    lib/LibDriver
+    lib/LineEditor
+    lib/Linker
+    lib/LTO
+    lib/MC
+    lib/Object
+    lib/Option
+    lib/Passes
+    lib/Support
+    lib/TableGen
+    lib/Target/*.cpp
+    lib/Transforms
+    include/llvm
+    lib/Target/AArch64
+    #lib/Target/X86
+)
+
+AllGenDirs=(
+    build/lib/Target/AArch64
+    #build/lib/Target/X86
+)
+
+SrcFiles=src_directory.txt
+echo "" > $SrcFiles
+for dir in ${SrcDirs[@]}; do
+  find $dir -type f -print >> $SrcFiles
+done
+# llvm-tblgen generated code
+for GenDirs in ${AllGenDirs[@]}; do
+  for dir in $GenDirs; do
+    for incFile in $(ls ${GenDirs}/*.inc); do
+      echo $incFile >> $SrcFiles
+    done
+  done
+done
+
+# Make Gtags
+gtags -f $SrcFiles
+
+# Make Ctags
+ctags -R ${SrcDirs[@]}