[llvm] 5b4dda5 - [dfsan] Add full fast8 support
George Balatsouras via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 7 17:21:39 PDT 2021
Author: George Balatsouras
Date: 2021-06-07T17:20:54-07:00
New Revision: 5b4dda550ece353bd9dca703067a740e3dbf6ceb
URL: https://github.com/llvm/llvm-project/commit/5b4dda550ece353bd9dca703067a740e3dbf6ceb
DIFF: https://github.com/llvm/llvm-project/commit/5b4dda550ece353bd9dca703067a740e3dbf6ceb.diff
LOG: [dfsan] Add full fast8 support
Complete support for fast8:
- amend shadow size and mapping in runtime
- remove fast16 mode and -dfsan-fast-16-labels flag
- remove legacy mode and make fast8 mode the default
- remove dfsan-fast-8-labels flag
- remove functions in dfsan interface only applicable to legacy
- remove legacy-related instrumentation code and tests
- update documentation.
Reviewed By: stephan.yichao.zhao, browneee
Differential Revision: https://reviews.llvm.org/D103745
Added:
compiler-rt/test/dfsan/fast8labels.c
Modified:
clang/docs/DataFlowSanitizer.rst
clang/docs/DataFlowSanitizerDesign.rst
compiler-rt/include/sanitizer/dfsan_interface.h
compiler-rt/lib/dfsan/dfsan.cpp
compiler-rt/lib/dfsan/dfsan.h
compiler-rt/lib/dfsan/dfsan_flags.inc
compiler-rt/lib/dfsan/dfsan_platform.h
compiler-rt/lib/fuzzer/dataflow/DataFlow.cpp
compiler-rt/test/dfsan/atomic.cpp
compiler-rt/test/dfsan/basic.c
compiler-rt/test/dfsan/custom.cpp
compiler-rt/test/dfsan/event_callbacks.c
compiler-rt/test/dfsan/flags.c
compiler-rt/test/dfsan/flush.c
compiler-rt/test/dfsan/fncall.c
compiler-rt/test/dfsan/fork.cpp
compiler-rt/test/dfsan/interceptors.c
compiler-rt/test/dfsan/origin_add_label.c
compiler-rt/test/dfsan/origin_branch.c
compiler-rt/test/dfsan/origin_disabled.c
compiler-rt/test/dfsan/origin_invalid.c
compiler-rt/test/dfsan/origin_ld_lost.c
compiler-rt/test/dfsan/origin_ldst.c
compiler-rt/test/dfsan/origin_limit.c
compiler-rt/test/dfsan/origin_memcpy.c
compiler-rt/test/dfsan/origin_memmove.c
compiler-rt/test/dfsan/origin_memset.c
compiler-rt/test/dfsan/origin_overlapped.c
compiler-rt/test/dfsan/origin_set_label.c
compiler-rt/test/dfsan/origin_stack_trace.c
compiler-rt/test/dfsan/origin_track_ld.c
compiler-rt/test/dfsan/origin_unaligned_memtrans.c
compiler-rt/test/dfsan/origin_untainted.c
compiler-rt/test/dfsan/origin_with_sigactions.c
compiler-rt/test/dfsan/origin_with_signals.cpp
compiler-rt/test/dfsan/pair.cpp
compiler-rt/test/dfsan/propagate.c
compiler-rt/test/dfsan/pthread.c
compiler-rt/test/dfsan/release_shadow_space.c
compiler-rt/test/dfsan/sigaction.c
compiler-rt/test/dfsan/sigaction_stress_test.c
compiler-rt/test/dfsan/struct.c
compiler-rt/test/fuzzer/dataflow.test
compiler-rt/test/fuzzer/only-some-bytes-fork.test
compiler-rt/test/fuzzer/only-some-bytes.test
llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
llvm/test/Instrumentation/DataFlowSanitizer/abilist.ll
llvm/test/Instrumentation/DataFlowSanitizer/abilist_aggregate.ll
llvm/test/Instrumentation/DataFlowSanitizer/arith.ll
llvm/test/Instrumentation/DataFlowSanitizer/array.ll
llvm/test/Instrumentation/DataFlowSanitizer/atomics.ll
llvm/test/Instrumentation/DataFlowSanitizer/basic.ll
llvm/test/Instrumentation/DataFlowSanitizer/call.ll
llvm/test/Instrumentation/DataFlowSanitizer/dont_combine_offset_labels_on_gep.ll
llvm/test/Instrumentation/DataFlowSanitizer/external_mask.ll
llvm/test/Instrumentation/DataFlowSanitizer/load.ll
llvm/test/Instrumentation/DataFlowSanitizer/musttailcall.ll
llvm/test/Instrumentation/DataFlowSanitizer/origin_abilist.ll
llvm/test/Instrumentation/DataFlowSanitizer/origin_cached_shadows.ll
llvm/test/Instrumentation/DataFlowSanitizer/origin_call.ll
llvm/test/Instrumentation/DataFlowSanitizer/origin_load.ll
llvm/test/Instrumentation/DataFlowSanitizer/origin_mem_intrinsic.ll
llvm/test/Instrumentation/DataFlowSanitizer/origin_other_ops.ll
llvm/test/Instrumentation/DataFlowSanitizer/origin_phi.ll
llvm/test/Instrumentation/DataFlowSanitizer/origin_select.ll
llvm/test/Instrumentation/DataFlowSanitizer/origin_store.ll
llvm/test/Instrumentation/DataFlowSanitizer/origin_store_threshold.ll
llvm/test/Instrumentation/DataFlowSanitizer/origin_track_load.ll
llvm/test/Instrumentation/DataFlowSanitizer/phi.ll
llvm/test/Instrumentation/DataFlowSanitizer/select.ll
llvm/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll
llvm/test/Instrumentation/DataFlowSanitizer/store.ll
llvm/test/Instrumentation/DataFlowSanitizer/struct.ll
llvm/test/Instrumentation/DataFlowSanitizer/union.ll
llvm/test/Instrumentation/DataFlowSanitizer/vector.ll
Removed:
compiler-rt/test/dfsan/dump_labels.c
compiler-rt/test/dfsan/fast16labels.c
compiler-rt/test/dfsan/label_count.c
llvm/test/Instrumentation/DataFlowSanitizer/fast16labels.ll
llvm/test/Instrumentation/DataFlowSanitizer/union-large.ll
################################################################################
diff --git a/clang/docs/DataFlowSanitizer.rst b/clang/docs/DataFlowSanitizer.rst
index 6b5c1e14e134f..8bbc2534ad4db 100644
--- a/clang/docs/DataFlowSanitizer.rst
+++ b/clang/docs/DataFlowSanitizer.rst
@@ -140,59 +140,14 @@ For example:
Example
=======
+DataFlowSanitizer supports up to 8 labels, to achieve low CPU and code
+size overhead. Base labels are simply 8-bit unsigned integers that are
+powers of 2 (i.e. 1, 2, 4, 8, ..., 128), and union labels are created
+by ORing base labels.
+
The following program demonstrates label propagation by checking that
the correct labels are propagated.
-.. code-block:: c++
-
- #include <sanitizer/dfsan_interface.h>
- #include <assert.h>
-
- int main(void) {
- int i = 1;
- dfsan_label i_label = dfsan_create_label("i", 0);
- dfsan_set_label(i_label, &i, sizeof(i));
-
- int j = 2;
- dfsan_label j_label = dfsan_create_label("j", 0);
- dfsan_set_label(j_label, &j, sizeof(j));
-
- int k = 3;
- dfsan_label k_label = dfsan_create_label("k", 0);
- dfsan_set_label(k_label, &k, sizeof(k));
-
- dfsan_label ij_label = dfsan_get_label(i + j);
- assert(dfsan_has_label(ij_label, i_label));
- assert(dfsan_has_label(ij_label, j_label));
- assert(!dfsan_has_label(ij_label, k_label));
-
- dfsan_label ijk_label = dfsan_get_label(i + j + k);
- assert(dfsan_has_label(ijk_label, i_label));
- assert(dfsan_has_label(ijk_label, j_label));
- assert(dfsan_has_label(ijk_label, k_label));
-
- return 0;
- }
-
-fast16labels mode
-=================
-
-If you need 16 or fewer labels, you can use fast16labels instrumentation for
-less CPU and code size overhead. To use fast16labels instrumentation, you'll
-need to specify `-fsanitize=dataflow -mllvm -dfsan-fast-16-labels` in your
-compile and link commands and use a modified API for creating and managing
-labels.
-
-In fast16labels mode, base labels are simply 16-bit unsigned integers that are
-powers of 2 (i.e. 1, 2, 4, 8, ..., 32768), and union labels are created by ORing
-base labels. In this mode DFSan does not manage any label metadata, so the
-functions `dfsan_create_label`, `dfsan_union`, `dfsan_get_label_info`,
-`dfsan_has_label`, `dfsan_has_label_with_desc`, `dfsan_get_label_count`, and
-`dfsan_dump_labels` are unsupported. Instead of using them, the user should
-maintain any necessary metadata about base labels themselves.
-
-For example:
-
.. code-block:: c++
#include <sanitizer/dfsan_interface.h>
@@ -216,6 +171,11 @@ For example:
assert(!(ij_label & k_label)); // ij_label doesn't have k_label
assert(ij_label == 3); // Verifies all of the above
+ // Or, equivalently:
+ assert(dfsan_has_label(ij_label, i_label));
+ assert(dfsan_has_label(ij_label, j_label));
+ assert(!dfsan_has_label(ij_label, k_label));
+
dfsan_label ijk_label = dfsan_get_label(i + j + k);
assert(ijk_label & i_label); // ijk_label has i_label
@@ -223,6 +183,11 @@ For example:
assert(ijk_label & k_label); // ijk_label has k_label
assert(ijk_label == 7); // Verifies all of the above
+ // Or, equivalently:
+ assert(dfsan_has_label(ijk_label, i_label));
+ assert(dfsan_has_label(ijk_label, j_label));
+ assert(dfsan_has_label(ijk_label, k_label));
+
return 0;
}
diff --git a/clang/docs/DataFlowSanitizerDesign.rst b/clang/docs/DataFlowSanitizerDesign.rst
index 32db88bda2690..0a7674b99ea45 100644
--- a/clang/docs/DataFlowSanitizerDesign.rst
+++ b/clang/docs/DataFlowSanitizerDesign.rst
@@ -12,9 +12,7 @@ DataFlowSanitizer is a program instrumentation which can associate
a number of taint labels with any data stored in any memory region
accessible by the program. The analysis is dynamic, which means that
it operates on a running program, and tracks how the labels propagate
-through that program. The tool shall support a large (>100) number
-of labels, such that programs which operate on large numbers of data
-items may be analysed with each data item being tracked separately.
+through that program.
Use Cases
---------
@@ -28,16 +26,13 @@ ensure it isn't exiting the program anywhere it shouldn't be.
Interface
---------
-A number of functions are provided which will create taint labels,
-attach labels to memory regions and extract the set of labels
-associated with a specific memory region. These functions are declared
-in the header file ``sanitizer/dfsan_interface.h``.
+A number of functions are provided which will attach taint labels to
+memory regions and extract the set of labels associated with a
+specific memory region. These functions are declared in the header
+file ``sanitizer/dfsan_interface.h``.
.. code-block:: c
- /// Creates and returns a base label with the given description and user data.
- dfsan_label dfsan_create_label(const char *desc, void *userdata);
-
/// Sets the label for each address in [addr,addr+size) to \c label.
void dfsan_set_label(dfsan_label label, void *addr, size_t size);
@@ -53,93 +48,57 @@ in the header file ``sanitizer/dfsan_interface.h``.
/// value.
dfsan_label dfsan_get_label(long data);
- /// Retrieves a pointer to the dfsan_label_info struct for the given label.
- const struct dfsan_label_info *dfsan_get_label_info(dfsan_label label);
-
/// Returns whether the given label label contains the label elem.
int dfsan_has_label(dfsan_label label, dfsan_label elem);
- /// If the given label label contains a label with the description desc, returns
- /// that label, else returns 0.
- dfsan_label dfsan_has_label_with_desc(dfsan_label label, const char *desc);
+ /// Computes the union of \c l1 and \c l2, resulting in a union label.
+ dfsan_label dfsan_union(dfsan_label l1, dfsan_label l2);
Taint label representation
--------------------------
-As stated above, the tool must track a large number of taint
-labels. This poses an implementation challenge, as most multiple-label
-tainting systems assign one label per bit to shadow storage, and
-union taint labels using a bitwise or operation. This will not scale
-to clients which use hundreds or thousands of taint labels, as the
-label union operation becomes O(n) in the number of supported labels,
-and data associated with it will quickly dominate the live variable
-set, causing register spills and hampering performance.
-
-Instead, a low overhead approach is proposed which is best-case O(log\
-:sub:`2` n) during execution. The underlying assumption is that
-the required space of label unions is sparse, which is a reasonable
-assumption to make given that we are optimizing for the case where
-applications mostly copy data from one place to another, without often
-invoking the need for an actual union operation. The representation
-of a taint label is a 16-bit integer, and new labels are allocated
-sequentially from a pool. The label identifier 0 is special, and means
-that the data item is unlabelled.
-
-When a label union operation is requested at a join point (any
-arithmetic or logical operation with two or more operands, such as
-addition), the code checks whether a union is required, whether the
-same union has been requested before, and whether one union label
-subsumes the other. If so, it returns the previously allocated union
-label. If not, it allocates a new union label from the same pool used
-for new labels.
-
-Specifically, the instrumentation pass will insert code like this
-to decide the union label ``lu`` for a pair of labels ``l1``
-and ``l2``:
-
-.. code-block:: c
-
- if (l1 == l2)
- lu = l1;
- else
- lu = __dfsan_union(l1, l2);
-
-The equality comparison is outlined, to provide an early exit in
-the common cases where the program is processing unlabelled data, or
-where the two data items have the same label. ``__dfsan_union`` is
-a runtime library function which performs all other union computation.
+We use an 8-bit unsigned integer for the representation of a
+label. The label identifier 0 is special, and means that the data item
+is unlabelled. This is optimizing for low CPU and code size overhead
+of the instrumentation. When a label union operation is requested at a
+join point (any arithmetic or logical operation with two or more
+operands, such as addition), we can simply OR the two labels in O(1).
-Further optimizations are possible, for example if ``l1`` is known
-at compile time to be zero (e.g. it is derived from a constant),
-``l2`` can be used for ``lu``, and vice versa.
+Users are responsible for managing the 8 integer labels (i.e., keeping
+track of what labels they have used so far, picking one that is yet
+unused, etc).
Memory layout and label management
----------------------------------
-The following is the current memory layout for Linux/x86\_64:
+The following is the memory layout for Linux/x86\_64:
+---------------+---------------+--------------------+
| Start | End | Use |
+===============+===============+====================+
| 0x700000008000|0x800000000000 | application memory |
+---------------+---------------+--------------------+
-| 0x200200000000|0x700000008000 | unused |
+| 0x300000000000|0x700000008000 | unused |
++---------------+---------------+--------------------+
+| 0x200000008000|0x300000000000 | origin |
++---------------+---------------+--------------------+
+| 0x200000000000|0x200000008000 | unused |
+---------------+---------------+--------------------+
-| 0x200000000000|0x200200000000 | union table |
+| 0x100000008000|0x200000000000 | shadow memory |
+---------------+---------------+--------------------+
-| 0x000000010000|0x200000000000 | shadow memory |
+| 0x000000010000|0x100000008000 | unused |
+---------------+---------------+--------------------+
| 0x000000000000|0x000000010000 | reserved by kernel |
+---------------+---------------+--------------------+
-Each byte of application memory corresponds to two bytes of shadow
-memory, which are used to store its taint label. As for LLVM SSA
+Each byte of application memory corresponds to a single byte of shadow
+memory, which is used to store its taint label. As for LLVM SSA
registers, we have not found it necessary to associate a label with
each byte or bit of data, as some other tools do. Instead, labels are
associated directly with registers. Loads will result in a union of
-all shadow labels corresponding to bytes loaded (which most of the
-time will be short circuited by the initial comparison) and stores will
-result in a copy of the label to the shadow of all bytes stored to.
+all shadow labels corresponding to bytes loaded, and stores will
+result in a copy of the label of the stored value to the shadow of all
+bytes stored to.
Propagating labels through arguments
------------------------------------
diff --git a/compiler-rt/include/sanitizer/dfsan_interface.h b/compiler-rt/include/sanitizer/dfsan_interface.h
index 34b0b6378d653..57bd37625419b 100644
--- a/compiler-rt/include/sanitizer/dfsan_interface.h
+++ b/compiler-rt/include/sanitizer/dfsan_interface.h
@@ -21,34 +21,15 @@
extern "C" {
#endif
-typedef uint16_t dfsan_label;
+typedef uint8_t dfsan_label;
typedef uint32_t dfsan_origin;
-/// Stores information associated with a specific label identifier. A label
-/// may be a base label created using dfsan_create_label, with associated
-/// text description and user data, or an automatically created union label,
-/// which represents the union of two label identifiers (which may themselves
-/// be base or union labels).
-struct dfsan_label_info {
- // Fields for union labels, set to 0 for base labels.
- dfsan_label l1;
- dfsan_label l2;
-
- // Fields for base labels.
- const char *desc;
- void *userdata;
-};
-
/// Signature of the callback argument to dfsan_set_write_callback().
typedef void (*dfsan_write_callback_t)(int fd, const void *buf, size_t count);
-/// Computes the union of \c l1 and \c l2, possibly creating a union label in
-/// the process.
+/// Computes the union of \c l1 and \c l2, resulting in a union label.
dfsan_label dfsan_union(dfsan_label l1, dfsan_label l2);
-/// Creates and returns a base label with the given description and user data.
-dfsan_label dfsan_create_label(const char *desc, void *userdata);
-
/// Sets the label for each address in [addr,addr+size) to \c label.
void dfsan_set_label(dfsan_label label, void *addr, size_t size);
@@ -73,19 +54,9 @@ dfsan_origin dfsan_get_origin(long data);
/// Retrieves the label associated with the data at the given address.
dfsan_label dfsan_read_label(const void *addr, size_t size);
-/// Retrieves a pointer to the dfsan_label_info struct for the given label.
-const struct dfsan_label_info *dfsan_get_label_info(dfsan_label label);
-
/// Returns whether the given label label contains the label elem.
int dfsan_has_label(dfsan_label label, dfsan_label elem);
-/// If the given label label contains a label with the description desc, returns
-/// that label, else returns 0.
-dfsan_label dfsan_has_label_with_desc(dfsan_label label, const char *desc);
-
-/// Returns the number of labels allocated.
-size_t dfsan_get_label_count(void);
-
/// Flushes the DFSan shadow, i.e. forgets about all labels currently associated
/// with the application memory. Use this call to start over the taint tracking
/// within the same process.
@@ -99,12 +70,6 @@ void dfsan_flush(void);
/// callback executes. Pass in NULL to remove any callback.
void dfsan_set_write_callback(dfsan_write_callback_t labeled_write_callback);
-/// Writes the labels currently used by the program to the given file
-/// descriptor. The lines of the output have the following format:
-///
-/// <label> <parent label 1> <parent label 2> <label description if any>
-void dfsan_dump_labels(int fd);
-
/// Interceptor hooks.
/// Whenever a dfsan's custom function is called the corresponding
/// hook is called it non-zero. The hooks should be defined by the user.
diff --git a/compiler-rt/lib/dfsan/dfsan.cpp b/compiler-rt/lib/dfsan/dfsan.cpp
index 438abe66429a3..e31177c38f5e7 100644
--- a/compiler-rt/lib/dfsan/dfsan.cpp
+++ b/compiler-rt/lib/dfsan/dfsan.cpp
@@ -36,14 +36,6 @@
using namespace __dfsan;
-typedef atomic_uint16_t atomic_dfsan_label;
-static const dfsan_label kInitializingLabel = -1;
-
-static const uptr kNumLabels = 1 << (sizeof(dfsan_label) * 8);
-
-static atomic_dfsan_label __dfsan_last_label;
-static dfsan_label_info __dfsan_label_info[kNumLabels];
-
Flags __dfsan::flags_data;
// The size of TLS variables. These constants must be kept in sync with the ones
@@ -80,22 +72,22 @@ int __dfsan_get_track_origins() {
// | |
// | unused |
// | |
-// +--------------------+ 0x300200000000 (kUnusedAddr)
-// | union table |
-// +--------------------+ 0x300000000000 (kUnionTableAddr)
+// +--------------------+ 0x300000000000 (kUnusedAddr)
// | origin |
-// +--------------------+ 0x200000000000 (kOriginAddr)
+// +--------------------+ 0x200000008000 (kOriginAddr)
+// | unused |
+// +--------------------+ 0x200000000000
// | shadow memory |
-// +--------------------+ 0x000000010000 (kShadowAddr)
+// +--------------------+ 0x100000008000 (kShadowAddr)
+// | unused |
+// +--------------------+ 0x000000010000
// | reserved by kernel |
// +--------------------+ 0x000000000000
//
-// To derive a shadow memory address from an application memory address,
-// bits 44-46 are cleared to bring the address into the range
-// [0x000000008000,0x100000000000). Then the address is shifted left by 1 to
-// account for the double byte representation of shadow labels and move the
-// address into the shadow memory range. See the function shadow_for below.
-
+// To derive a shadow memory address from an application memory address, bits
+// 45-46 are cleared to bring the address into the range
+// [0x100000008000,0x200000000000). See the function shadow_for below.
+//
// On Linux/MIPS64, memory is laid out as follows:
//
// +--------------------+ 0x10000000000 (top of memory)
@@ -104,11 +96,11 @@ int __dfsan_get_track_origins() {
// | |
// | unused |
// | |
-// +--------------------+ 0x2200000000 (kUnusedAddr)
-// | union table |
-// +--------------------+ 0x2000000000 (kUnionTableAddr)
+// +--------------------+ 0x2000000000 (kUnusedAddr)
// | shadow memory |
-// +--------------------+ 0x0000010000 (kShadowAddr)
+// +--------------------+ 0x1000008000 (kShadowAddr)
+// | unused |
+// +--------------------+ 0x0000010000
// | reserved by kernel |
// +--------------------+ 0x0000000000
@@ -120,9 +112,7 @@ int __dfsan_get_track_origins() {
// | |
// | unused |
// | |
-// +--------------------+ 0x1200000000 (kUnusedAddr)
-// | union table |
-// +--------------------+ 0x1000000000 (kUnionTableAddr)
+// +--------------------+ 0x1000000000 (kUnusedAddr)
// | shadow memory |
// +--------------------+ 0x0000010000 (kShadowAddr)
// | reserved by kernel |
@@ -136,9 +126,7 @@ int __dfsan_get_track_origins() {
// | |
// | unused |
// | |
-// +--------------------+ 0x1200000000 (kUnusedAddr)
-// | union table |
-// +--------------------+ 0x8000000000 (kUnionTableAddr)
+// +--------------------+ 0x8000000000 (kUnusedAddr)
// | shadow memory |
// +--------------------+ 0x0000010000 (kShadowAddr)
// | reserved by kernel |
@@ -156,102 +144,19 @@ int __dfsan_get_track_origins() {
// | |
// | unused |
// | |
-// +--------------------+ 0x1200000000 (kUnusedAddr)
-// | union table |
-// +--------------------+ 0x8000000000 (kUnionTableAddr)
+// +--------------------+ 0x8000000000 (kUnusedAddr)
// | shadow memory |
// +--------------------+ 0x0000010000 (kShadowAddr)
// | reserved by kernel |
// +--------------------+ 0x0000000000
-typedef atomic_dfsan_label dfsan_union_table_t[kNumLabels][kNumLabels];
-
#ifdef DFSAN_RUNTIME_VMA
// Runtime detected VMA size.
int __dfsan::vmaSize;
#endif
-static uptr UnusedAddr() {
- return UnionTableAddr() + sizeof(dfsan_union_table_t);
-}
-
-static atomic_dfsan_label *union_table(dfsan_label l1, dfsan_label l2) {
- return &(*(dfsan_union_table_t *) UnionTableAddr())[l1][l2];
-}
-
-// Checks we do not run out of labels.
-static void dfsan_check_label(dfsan_label label) {
- if (label == kInitializingLabel) {
- Report("FATAL: DataFlowSanitizer: out of labels\n");
- Die();
- }
-}
-
-// Resolves the union of two unequal labels. Nonequality is a precondition for
-// this function (the instrumentation pass inlines the equality test).
-extern "C" SANITIZER_INTERFACE_ATTRIBUTE
-dfsan_label __dfsan_union(dfsan_label l1, dfsan_label l2) {
- DCHECK_NE(l1, l2);
-
- if (l1 == 0)
- return l2;
- if (l2 == 0)
- return l1;
-
- // If no labels have been created, yet l1 and l2 are non-zero, we are using
- // fast16labels mode.
- if (atomic_load(&__dfsan_last_label, memory_order_relaxed) == 0)
- return l1 | l2;
-
- if (l1 > l2)
- Swap(l1, l2);
-
- atomic_dfsan_label *table_ent = union_table(l1, l2);
- // We need to deal with the case where two threads concurrently request
- // a union of the same pair of labels. If the table entry is uninitialized,
- // (i.e. 0) use a compare-exchange to set the entry to kInitializingLabel
- // (i.e. -1) to mark that we are initializing it.
- dfsan_label label = 0;
- if (atomic_compare_exchange_strong(table_ent, &label, kInitializingLabel,
- memory_order_acquire)) {
- // Check whether l2 subsumes l1. We don't need to check whether l1
- // subsumes l2 because we are guaranteed here that l1 < l2, and (at least
- // in the cases we are interested in) a label may only subsume labels
- // created earlier (i.e. with a lower numerical value).
- if (__dfsan_label_info[l2].l1 == l1 ||
- __dfsan_label_info[l2].l2 == l1) {
- label = l2;
- } else {
- label =
- atomic_fetch_add(&__dfsan_last_label, 1, memory_order_relaxed) + 1;
- dfsan_check_label(label);
- __dfsan_label_info[label].l1 = l1;
- __dfsan_label_info[label].l2 = l2;
- }
- atomic_store(table_ent, label, memory_order_release);
- } else if (label == kInitializingLabel) {
- // Another thread is initializing the entry. Wait until it is finished.
- do {
- internal_sched_yield();
- label = atomic_load(table_ent, memory_order_acquire);
- } while (label == kInitializingLabel);
- }
- return label;
-}
-
extern "C" SANITIZER_INTERFACE_ATTRIBUTE
dfsan_label __dfsan_union_load(const dfsan_label *ls, uptr n) {
- dfsan_label label = ls[0];
- for (uptr i = 1; i != n; ++i) {
- dfsan_label next_label = ls[i];
- if (label != next_label)
- label = __dfsan_union(label, next_label);
- }
- return label;
-}
-
-extern "C" SANITIZER_INTERFACE_ATTRIBUTE
-dfsan_label __dfsan_union_load_fast16labels(const dfsan_label *ls, uptr n) {
dfsan_label label = ls[0];
for (uptr i = 1; i != n; ++i)
label |= ls[i];
@@ -301,24 +206,10 @@ __dfsan_vararg_wrapper(const char *fname) {
Die();
}
-// Like __dfsan_union, but for use from the client or custom functions. Hence
-// the equality comparison is done here before calling __dfsan_union.
+// Resolves the union of two labels.
SANITIZER_INTERFACE_ATTRIBUTE dfsan_label
dfsan_union(dfsan_label l1, dfsan_label l2) {
- if (l1 == l2)
- return l1;
- return __dfsan_union(l1, l2);
-}
-
-extern "C" SANITIZER_INTERFACE_ATTRIBUTE
-dfsan_label dfsan_create_label(const char *desc, void *userdata) {
- dfsan_label label =
- atomic_fetch_add(&__dfsan_last_label, 1, memory_order_relaxed) + 1;
- dfsan_check_label(label);
- __dfsan_label_info[label].l1 = __dfsan_label_info[label].l2 = 0;
- __dfsan_label_info[label].desc = desc;
- __dfsan_label_info[label].userdata = userdata;
- return label;
+ return l1 | l2;
}
// Return the origin of the first taint byte in the size bytes from the address
@@ -429,7 +320,7 @@ static void CopyOrigin(const void *dst, const void *src, uptr size,
// Align src up.
uptr s = AlignUp((uptr)src);
dfsan_origin *src_o = (dfsan_origin *)origin_for((void *)s);
- u64 *src_s = (u64 *)shadow_for((void *)s);
+ u32 *src_s = (u32 *)shadow_for((void *)s);
dfsan_origin *src_end = (dfsan_origin *)origin_for((void *)(s + (end - beg)));
dfsan_origin *dst_o = (dfsan_origin *)origin_for((void *)beg);
dfsan_origin last_src_o = 0;
@@ -465,7 +356,7 @@ static void ReverseCopyOrigin(const void *dst, const void *src, uptr size,
uptr s = AlignUp((uptr)src);
dfsan_origin *src =
(dfsan_origin *)origin_for((void *)(s + end - beg - kOriginAlign));
- u64 *src_s = (u64 *)shadow_for((void *)(s + end - beg - kOriginAlign));
+ u32 *src_s = (u32 *)shadow_for((void *)(s + end - beg - kOriginAlign));
dfsan_origin *src_begin = (dfsan_origin *)origin_for((void *)s);
dfsan_origin *dst =
(dfsan_origin *)origin_for((void *)(end - kOriginAlign));
@@ -628,7 +519,7 @@ void dfsan_copy_memory(void *dst, const void *src, uptr size) {
// origin chain with the previous ID o and the current stack trace. This is
// used by instrumentation to reduce code size when too much code is inserted.
extern "C" SANITIZER_INTERFACE_ATTRIBUTE void __dfsan_maybe_store_origin(
- u16 s, void *p, uptr size, dfsan_origin o) {
+ dfsan_label s, void *p, uptr size, dfsan_origin o) {
if (UNLIKELY(s)) {
GET_CALLER_PC_BP_SP;
(void)sp;
@@ -726,8 +617,7 @@ void dfsan_add_label(dfsan_label label, void *addr, uptr size) {
}
for (dfsan_label *labelp = shadow_for(addr); size != 0; --size, ++labelp)
- if (*labelp != label)
- *labelp = __dfsan_union(*labelp, label);
+ *labelp |= label;
}
// Unlike the other dfsan interface functions the behavior of this function
@@ -783,57 +673,9 @@ SANITIZER_INTERFACE_ATTRIBUTE void dfsan_set_label_origin(dfsan_label label,
__dfsan_set_label(label, origin, addr, size);
}
-extern "C" SANITIZER_INTERFACE_ATTRIBUTE
-const struct dfsan_label_info *dfsan_get_label_info(dfsan_label label) {
- return &__dfsan_label_info[label];
-}
-
extern "C" SANITIZER_INTERFACE_ATTRIBUTE int
dfsan_has_label(dfsan_label label, dfsan_label elem) {
- if (label == elem)
- return true;
- const dfsan_label_info *info = dfsan_get_label_info(label);
- if (info->l1 != 0) {
- return dfsan_has_label(info->l1, elem) || dfsan_has_label(info->l2, elem);
- } else {
- return false;
- }
-}
-
-extern "C" SANITIZER_INTERFACE_ATTRIBUTE dfsan_label
-dfsan_has_label_with_desc(dfsan_label label, const char *desc) {
- const dfsan_label_info *info = dfsan_get_label_info(label);
- if (info->l1 != 0) {
- return dfsan_has_label_with_desc(info->l1, desc) ||
- dfsan_has_label_with_desc(info->l2, desc);
- } else {
- return internal_strcmp(desc, info->desc) == 0;
- }
-}
-
-extern "C" SANITIZER_INTERFACE_ATTRIBUTE uptr
-dfsan_get_label_count(void) {
- dfsan_label max_label_allocated =
- atomic_load(&__dfsan_last_label, memory_order_relaxed);
-
- return static_cast<uptr>(max_label_allocated);
-}
-
-extern "C" SANITIZER_INTERFACE_ATTRIBUTE void
-dfsan_dump_labels(int fd) {
- dfsan_label last_label =
- atomic_load(&__dfsan_last_label, memory_order_relaxed);
- for (uptr l = 1; l <= last_label; ++l) {
- char buf[64];
- internal_snprintf(buf, sizeof(buf), "%u %u %u ", l,
- __dfsan_label_info[l].l1, __dfsan_label_info[l].l2);
- WriteToFile(fd, buf, internal_strlen(buf));
- if (__dfsan_label_info[l].l1 == 0 && __dfsan_label_info[l].desc) {
- WriteToFile(fd, __dfsan_label_info[l].desc,
- internal_strlen(__dfsan_label_info[l].desc));
- }
- WriteToFile(fd, "\n", 1);
- }
+ return (label & elem) == elem;
}
class Decorator : public __sanitizer::SanitizerCommonDecorator {
@@ -1068,22 +910,6 @@ static void InitializePlatformEarly() {
#endif
}
-static void dfsan_fini() {
- if (internal_strcmp(flags().dump_labels_at_exit, "") != 0) {
- fd_t fd = OpenFile(flags().dump_labels_at_exit, WrOnly);
- if (fd == kInvalidFd) {
- Report("WARNING: DataFlowSanitizer: unable to open output file %s\n",
- flags().dump_labels_at_exit);
- return;
- }
-
- Report("INFO: DataFlowSanitizer: dumping labels to %s\n",
- flags().dump_labels_at_exit);
- dfsan_dump_labels(fd);
- CloseFile(fd);
- }
-}
-
extern "C" void dfsan_flush() {
if (!MmapFixedSuperNoReserve(ShadowAddr(), UnusedAddr() - ShadowAddr()))
Die();
@@ -1115,11 +941,6 @@ static void DFsanInit(int argc, char **argv, char **envp) {
initialize_interceptors();
- // Register the fini callback to run when the program terminates successfully
- // or it is killed by the runtime.
- Atexit(dfsan_fini);
- AddDieCallback(dfsan_fini);
-
// Set up threads
DFsanTSDInit(DFsanTSDDtor);
@@ -1129,8 +950,6 @@ static void DFsanInit(int argc, char **argv, char **envp) {
SetCurrentThread(main_thread);
main_thread->ThreadStart();
- __dfsan_label_info[kInitializingLabel].desc = "<init label>";
-
dfsan_init_is_running = false;
dfsan_inited = true;
}
diff --git a/compiler-rt/lib/dfsan/dfsan.h b/compiler-rt/lib/dfsan/dfsan.h
index 2b3a209d9fb2e..43dfb008b564a 100644
--- a/compiler-rt/lib/dfsan/dfsan.h
+++ b/compiler-rt/lib/dfsan/dfsan.h
@@ -18,21 +18,14 @@
#include "dfsan_platform.h"
-using __sanitizer::u16;
using __sanitizer::u32;
+using __sanitizer::u8;
using __sanitizer::uptr;
// Copy declarations from public sanitizer/dfsan_interface.h header here.
-typedef u16 dfsan_label;
+typedef u8 dfsan_label;
typedef u32 dfsan_origin;
-struct dfsan_label_info {
- dfsan_label l1;
- dfsan_label l2;
- const char *desc;
- void *userdata;
-};
-
extern "C" {
void dfsan_add_label(dfsan_label label, void *addr, uptr size);
void dfsan_set_label(dfsan_label label, void *addr, uptr size);
@@ -68,7 +61,7 @@ extern bool dfsan_init_is_running;
void initialize_interceptors();
inline dfsan_label *shadow_for(void *ptr) {
- return (dfsan_label *) ((((uptr) ptr) & ShadowMask()) << 1);
+ return (dfsan_label *)(((uptr)ptr) & ShadowMask());
}
inline const dfsan_label *shadow_for(const void *ptr) {
@@ -76,7 +69,7 @@ inline const dfsan_label *shadow_for(const void *ptr) {
}
inline uptr unaligned_origin_for(uptr ptr) {
- return OriginAddr() + (ptr & ShadowMask());
+ return OriginAddr() - ShadowAddr() + (ptr & ShadowMask());
}
inline dfsan_origin *origin_for(void *ptr) {
@@ -98,6 +91,15 @@ inline bool has_valid_shadow_addr(const void *ptr) {
return is_shadow_addr_valid((uptr)ptr_s);
}
+inline bool is_origin_addr_valid(uptr origin_addr) {
+ return (uptr)origin_addr >= OriginAddr() && (uptr)origin_addr < UnusedAddr();
+}
+
+inline bool has_valid_origin_addr(const void *ptr) {
+ const dfsan_origin *ptr_orig = origin_for(ptr);
+ return is_origin_addr_valid((uptr)ptr_orig);
+}
+
void dfsan_copy_memory(void *dst, const void *src, uptr size);
void dfsan_allocator_init();
diff --git a/compiler-rt/lib/dfsan/dfsan_flags.inc b/compiler-rt/lib/dfsan/dfsan_flags.inc
index f27228a647fc8..6363e8c5adb17 100644
--- a/compiler-rt/lib/dfsan/dfsan_flags.inc
+++ b/compiler-rt/lib/dfsan/dfsan_flags.inc
@@ -26,9 +26,6 @@ DFSAN_FLAG(
"(e.g., when comparing strings, ignore the fact that the output of the"
"comparison might be data-dependent on the content of the strings). This"
"applies only to the custom functions defined in 'custom.c'.")
-DFSAN_FLAG(const char *, dump_labels_at_exit, "", "The path of the file where "
- "to dump the labels when the "
- "program terminates.")
DFSAN_FLAG(
int, origin_history_size, Origin::kMaxDepth,
"The limit of origin chain length. Non-positive values mean unlimited.")
diff --git a/compiler-rt/lib/dfsan/dfsan_platform.h b/compiler-rt/lib/dfsan/dfsan_platform.h
index f37cc5b1b35c7..8f64227c98593 100644
--- a/compiler-rt/lib/dfsan/dfsan_platform.h
+++ b/compiler-rt/lib/dfsan/dfsan_platform.h
@@ -14,41 +14,45 @@
#ifndef DFSAN_PLATFORM_H
#define DFSAN_PLATFORM_H
+#include "sanitizer_common/sanitizer_common.h"
+
namespace __dfsan {
+using __sanitizer::uptr;
+
#if defined(__x86_64__)
struct Mapping {
- static const uptr kShadowAddr = 0x10000;
- static const uptr kOriginAddr = 0x200000000000;
- static const uptr kUnionTableAddr = 0x300000000000;
+ static const uptr kShadowAddr = 0x100000008000;
+ static const uptr kOriginAddr = 0x200000008000;
+ static const uptr kUnusedAddr = 0x300000000000;
static const uptr kAppAddr = 0x700000008000;
- static const uptr kShadowMask = ~0x700000000000;
+ static const uptr kShadowMask = ~0x600000000000;
};
#elif defined(__mips64)
struct Mapping {
- static const uptr kShadowAddr = 0x10000;
- static const uptr kUnionTableAddr = 0x2000000000;
+ static const uptr kShadowAddr = 0x1000008000;
+ static const uptr kUnusedAddr = 0x2000000000;
static const uptr kAppAddr = 0xF000008000;
- static const uptr kShadowMask = ~0xF000000000;
+ static const uptr kShadowMask = ~0xE000000000;
};
#elif defined(__aarch64__)
struct Mapping39 {
static const uptr kShadowAddr = 0x10000;
- static const uptr kUnionTableAddr = 0x1000000000;
+ static const uptr kUnusedAddr = 0x1000000000;
static const uptr kAppAddr = 0x7000008000;
static const uptr kShadowMask = ~0x7800000000;
};
struct Mapping42 {
static const uptr kShadowAddr = 0x10000;
- static const uptr kUnionTableAddr = 0x8000000000;
+ static const uptr kUnusedAddr = 0x8000000000;
static const uptr kAppAddr = 0x3ff00008000;
static const uptr kShadowMask = ~0x3c000000000;
};
struct Mapping48 {
static const uptr kShadowAddr = 0x10000;
- static const uptr kUnionTableAddr = 0x8000000000;
+ static const uptr kUnusedAddr = 0x8000000000;
static const uptr kAppAddr = 0xffff00008000;
static const uptr kShadowMask = ~0xfffff0000000;
};
@@ -64,7 +68,7 @@ enum MappingType {
#if defined(__x86_64__)
MAPPING_ORIGIN_ADDR,
#endif
- MAPPING_UNION_TABLE_ADDR,
+ MAPPING_UNUSED_ADDR,
MAPPING_APP_ADDR,
MAPPING_SHADOW_MASK
};
@@ -77,7 +81,8 @@ uptr MappingImpl(void) {
case MAPPING_ORIGIN_ADDR:
return Mapping::kOriginAddr;
#endif
- case MAPPING_UNION_TABLE_ADDR: return Mapping::kUnionTableAddr;
+ case MAPPING_UNUSED_ADDR:
+ return Mapping::kUnusedAddr;
case MAPPING_APP_ADDR: return Mapping::kAppAddr;
case MAPPING_SHADOW_MASK: return Mapping::kShadowMask;
}
@@ -113,9 +118,7 @@ uptr OriginAddr() {
}
ALWAYS_INLINE
-uptr UnionTableAddr() {
- return MappingArchImpl<MAPPING_UNION_TABLE_ADDR>();
-}
+uptr UnusedAddr() { return MappingArchImpl<MAPPING_UNUSED_ADDR>(); }
ALWAYS_INLINE
uptr AppAddr() {
diff --git a/compiler-rt/lib/fuzzer/dataflow/DataFlow.cpp b/compiler-rt/lib/fuzzer/dataflow/DataFlow.cpp
index 78b3f9abd5cf5..3af48e28282b1 100644
--- a/compiler-rt/lib/fuzzer/dataflow/DataFlow.cpp
+++ b/compiler-rt/lib/fuzzer/dataflow/DataFlow.cpp
@@ -17,11 +17,9 @@
// and also provides basic-block coverage for every input.
//
// Build:
-// 1. Compile this file (DataFlow.cpp) with -fsanitize=dataflow -mllvm
-// -dfsan-fast-16-labels and -O2.
+// 1. Compile this file (DataFlow.cpp) with -fsanitize=dataflow and -O2.
// 2. Compile DataFlowCallbacks.cpp with -O2 -fPIC.
// 3. Build the fuzz target with -g -fsanitize=dataflow
-// -mllvm -dfsan-fast-16-labels
// -fsanitize-coverage=trace-pc-guard,pc-table,bb,trace-cmp
// 4. Link those together with -fsanitize=dataflow
//
@@ -82,7 +80,7 @@ static inline bool BlockIsEntry(size_t BlockIdx) {
return __dft.PCsBeg[BlockIdx * 2 + 1] & PCFLAG_FUNC_ENTRY;
}
-const int kNumLabels = 16;
+const int kNumLabels = 8;
// Prints all instrumented functions.
static int PrintFunctions() {
diff --git a/compiler-rt/test/dfsan/atomic.cpp b/compiler-rt/test/dfsan/atomic.cpp
index 459bf31075e5b..973c605b6178f 100644
--- a/compiler-rt/test/dfsan/atomic.cpp
+++ b/compiler-rt/test/dfsan/atomic.cpp
@@ -1,5 +1,5 @@
-// RUN: %clangxx_dfsan -mllvm -dfsan-fast-16-labels=true %s -fno-exceptions -o %t && %run %t
-// RUN: %clangxx_dfsan -DORIGIN_TRACKING -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -fno-exceptions -o %t && %run %t
+// RUN: %clangxx_dfsan %s -fno-exceptions -o %t && %run %t
+// RUN: %clangxx_dfsan -DORIGIN_TRACKING -mllvm -dfsan-track-origins=1 %s -fno-exceptions -o %t && %run %t
//
// REQUIRES: x86_64-target-arch
//
diff --git a/compiler-rt/test/dfsan/basic.c b/compiler-rt/test/dfsan/basic.c
index edd4aca83c0f4..2daa871e79d1b 100644
--- a/compiler-rt/test/dfsan/basic.c
+++ b/compiler-rt/test/dfsan/basic.c
@@ -10,7 +10,7 @@
int main(void) {
int i = 1;
- dfsan_label i_label = dfsan_create_label("i", 0);
+ dfsan_label i_label = 1;
dfsan_set_label(i_label, &i, sizeof(i));
dfsan_label new_label = dfsan_get_label(i);
@@ -19,7 +19,7 @@ int main(void) {
dfsan_label read_label = dfsan_read_label(&i, sizeof(i));
assert(i_label == read_label);
- dfsan_label j_label = dfsan_create_label("j", 0);
+ dfsan_label j_label = 2;
dfsan_add_label(j_label, &i, sizeof(i));
read_label = dfsan_read_label(&i, sizeof(i));
diff --git a/compiler-rt/test/dfsan/custom.cpp b/compiler-rt/test/dfsan/custom.cpp
index 705ee5c5c02fe..99450a6c1e71a 100644
--- a/compiler-rt/test/dfsan/custom.cpp
+++ b/compiler-rt/test/dfsan/custom.cpp
@@ -1,10 +1,10 @@
// RUN: %clang_dfsan %s -o %t && DFSAN_OPTIONS="strict_data_dependencies=0" %run %t
// RUN: %clang_dfsan -mllvm -dfsan-args-abi %s -o %t && DFSAN_OPTIONS="strict_data_dependencies=0" %run %t
-// RUN: %clang_dfsan -DFAST_16_LABELS -mllvm -dfsan-fast-16-labels %s -o %t && DFSAN_OPTIONS="strict_data_dependencies=0" %run %t
+// RUN: %clang_dfsan %s -o %t && DFSAN_OPTIONS="strict_data_dependencies=0" %run %t
// RUN: %clang_dfsan -DSTRICT_DATA_DEPENDENCIES %s -o %t && %run %t
// RUN: %clang_dfsan -DSTRICT_DATA_DEPENDENCIES -mllvm -dfsan-args-abi %s -o %t && %run %t
-// RUN: %clang_dfsan -DFAST_16_LABELS -DORIGIN_TRACKING -mllvm -dfsan-fast-16-labels -mllvm -dfsan-track-origins=1 -mllvm -dfsan-combine-pointer-labels-on-load=false -DSTRICT_DATA_DEPENDENCIES %s -o %t && %run %t
-// RUN: %clang_dfsan -DFAST_16_LABELS -DORIGIN_TRACKING -mllvm -dfsan-fast-16-labels -mllvm -dfsan-track-origins=1 -mllvm -dfsan-combine-pointer-labels-on-load=false %s -o %t && DFSAN_OPTIONS="strict_data_dependencies=0" %run %t
+// RUN: %clang_dfsan -DORIGIN_TRACKING -mllvm -dfsan-track-origins=1 -mllvm -dfsan-combine-pointer-labels-on-load=false -DSTRICT_DATA_DEPENDENCIES %s -o %t && %run %t
+// RUN: %clang_dfsan -DORIGIN_TRACKING -mllvm -dfsan-track-origins=1 -mllvm -dfsan-combine-pointer-labels-on-load=false %s -o %t && DFSAN_OPTIONS="strict_data_dependencies=0" %run %t
//
// Tests custom implementations of various glibc functions.
//
@@ -1944,19 +1944,11 @@ void test_snprintf() {
void test_fork() {}
int main(void) {
-#ifdef FAST_16_LABELS
i_label = 1;
j_label = 2;
k_label = 4;
m_label = 8;
n_label = 16;
-#else
- i_label = dfsan_create_label("i", 0);
- j_label = dfsan_create_label("j", 0);
- k_label = dfsan_create_label("k", 0);
- m_label = dfsan_create_label("m", 0);
- n_label = dfsan_create_label("n", 0);
-#endif
i_j_label = dfsan_union(i_label, j_label);
assert(i_j_label != i_label);
assert(i_j_label != j_label);
diff --git a/compiler-rt/test/dfsan/dump_labels.c b/compiler-rt/test/dfsan/dump_labels.c
deleted file mode 100644
index 28464d1d7b5d3..0000000000000
--- a/compiler-rt/test/dfsan/dump_labels.c
+++ /dev/null
@@ -1,71 +0,0 @@
-// RUN: %clang_dfsan %s -o %t
-// RUN: DFSAN_OPTIONS=dump_labels_at_exit=/dev/stdout %run %t 2>&1 | FileCheck %s
-// RUN: DFSAN_OPTIONS=dump_labels_at_exit=/dev/stdout not %run %t c 2>&1 | FileCheck %s --check-prefix=CHECK-OOL
-// RUN: DFSAN_OPTIONS=dump_labels_at_exit=/dev/stdout not %run %t u 2>&1 | FileCheck %s --check-prefix=CHECK-OOL
-//
-// REQUIRES: x86_64-target-arch
-
-// Tests that labels are properly dumped at program termination.
-
-#include <sanitizer/dfsan_interface.h>
-#include <assert.h>
-#include <stdio.h>
-
-int main(int argc, char** argv) {
- int i = 1;
- dfsan_label i_label = dfsan_create_label("i", 0);
- dfsan_set_label(i_label, &i, sizeof(i));
-
- int j = 2;
- dfsan_label j_label = dfsan_create_label("j", 0);
- dfsan_set_label(j_label, &j, sizeof(j));
-
- int k = 3;
- dfsan_label k_label = dfsan_create_label("k", 0);
- dfsan_set_label(k_label, &k, sizeof(k));
-
- dfsan_label ij_label = dfsan_get_label(i + j);
- dfsan_label ijk_label = dfsan_get_label(i + j + k);
-
- fprintf(stderr, "i %d j %d k %d ij %d ijk %d\n", i_label, j_label, k_label,
- ij_label, ijk_label);
-
- // CHECK: 1 0 0 i
- // CHECK: 2 0 0 j
- // CHECK: 3 0 0 k
- // CHECK: 4 1 2
- // CHECK: 5 3 4
-
- if (argc > 1) {
- // Exhaust the labels.
- unsigned long num_labels = 1 << (sizeof(dfsan_label) * 8);
- for (unsigned long i = ijk_label + 1; i < num_labels - 2; ++i) {
- dfsan_label l = dfsan_create_label("l", 0);
- assert(l == i);
- }
-
- // Consume the last available label.
- dfsan_label l = dfsan_union(5, 6);
- assert(l == num_labels - 2);
-
- // Try to allocate another label (either explicitly or by unioning two
- // existing labels), but expect a crash.
- if (argv[1][0] == 'c') {
- l = dfsan_create_label("l", 0);
- } else {
- l = dfsan_union(6, 7);
- }
-
- // CHECK-OOL: FATAL: DataFlowSanitizer: out of labels
- // CHECK-OOL: 1 0 0 i
- // CHECK-OOL: 2 0 0 j
- // CHECK-OOL: 3 0 0 k
- // CHECK-OOL: 4 1 2
- // CHECK-OOL: 5 3 4
- // CHECK-OOL: 6 0 0
- // CHECK-OOL: 65534 5 6
- // CHECK-OOL: 65535 0 0 <init label>
- }
-
- return 0;
-}
diff --git a/compiler-rt/test/dfsan/event_callbacks.c b/compiler-rt/test/dfsan/event_callbacks.c
index 6a920f7f3dc4d..d85c9e3795586 100644
--- a/compiler-rt/test/dfsan/event_callbacks.c
+++ b/compiler-rt/test/dfsan/event_callbacks.c
@@ -81,9 +81,9 @@ int main(int Argc, char *Argv[]) {
assert(Argc == 2);
int I = 1, J = 2;
- LabelI = dfsan_create_label("I", 0);
+ LabelI = 1;
dfsan_set_label(LabelI, &I, sizeof(I));
- LabelJ = dfsan_create_label("J", 0);
+ LabelJ = 2;
dfsan_set_label(LabelJ, &J, sizeof(J));
LabelIJ = dfsan_union(LabelI, LabelJ);
@@ -113,7 +113,7 @@ int main(int Argc, char *Argv[]) {
assert(I != J);
LenArgv = strlen(Argv[1]);
- LabelArgv = dfsan_create_label("Argv", 0);
+ LabelArgv = 4;
dfsan_set_label(LabelArgv, Argv[1], LenArgv);
char Buf[64];
diff --git a/compiler-rt/test/dfsan/fast16labels.c b/compiler-rt/test/dfsan/fast8labels.c
similarity index 72%
rename from compiler-rt/test/dfsan/fast16labels.c
rename to compiler-rt/test/dfsan/fast8labels.c
index 9236d77939b08..0fa26caf654a1 100644
--- a/compiler-rt/test/dfsan/fast16labels.c
+++ b/compiler-rt/test/dfsan/fast8labels.c
@@ -1,10 +1,8 @@
-// RUN: %clang_dfsan %s -mllvm -dfsan-fast-16-labels -o %t
+// RUN: %clang_dfsan %s -o %t
// RUN: %run %t
//
// REQUIRES: x86_64-target-arch
//
-// Tests fast16labels mode.
-
#include <sanitizer/dfsan_interface.h>
#include <assert.h>
@@ -19,11 +17,11 @@ int main(int argc, char *argv[]) {
int a = 10;
int b = 20;
dfsan_set_label(8, &a, sizeof(a));
- dfsan_set_label(512, &b, sizeof(b));
+ dfsan_set_label(128, &b, sizeof(b));
int c = foo(a, b);
printf("A: 0x%x\n", dfsan_get_label(a));
printf("B: 0x%x\n", dfsan_get_label(b));
dfsan_label l = dfsan_get_label(c);
printf("C: 0x%x\n", l);
- assert(l == 520); // OR of the other two labels.
+ assert(l == 136); // OR of the other two labels.
}
diff --git a/compiler-rt/test/dfsan/flags.c b/compiler-rt/test/dfsan/flags.c
index 1123d154d31e5..b99feab5805c4 100644
--- a/compiler-rt/test/dfsan/flags.c
+++ b/compiler-rt/test/dfsan/flags.c
@@ -14,7 +14,7 @@ int f(int i) {
int main(void) {
int i = 1;
- dfsan_label i_label = dfsan_create_label("i", 0);
+ dfsan_label i_label = 2;
dfsan_set_label(i_label, &i, sizeof(i));
// CHECK: WARNING: DataFlowSanitizer: call to uninstrumented function f
diff --git a/compiler-rt/test/dfsan/flush.c b/compiler-rt/test/dfsan/flush.c
index 1a71c22471dec..6c74ce5eb35ef 100644
--- a/compiler-rt/test/dfsan/flush.c
+++ b/compiler-rt/test/dfsan/flush.c
@@ -1,6 +1,6 @@
// Tests dfsan_flush().
// RUN: %clang_dfsan %s -o %t && %run %t
-// RUN: %clang_dfsan -DORIGIN_TRACKING -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && %run %t
+// RUN: %clang_dfsan -DORIGIN_TRACKING -mllvm -dfsan-track-origins=1 %s -o %t && %run %t
//
// REQUIRES: x86_64-target-arch
diff --git a/compiler-rt/test/dfsan/fncall.c b/compiler-rt/test/dfsan/fncall.c
index 7650529536a14..6cd60af76cbb7 100644
--- a/compiler-rt/test/dfsan/fncall.c
+++ b/compiler-rt/test/dfsan/fncall.c
@@ -10,19 +10,22 @@
int f(int x) {
int j = 2;
- dfsan_label j_label = dfsan_create_label("j", 0);
+ dfsan_label j_label = 2;
dfsan_set_label(j_label, &j, sizeof(j));
return x + j;
}
int main(void) {
int i = 1;
- dfsan_label i_label = dfsan_create_label("i", 0);
+ dfsan_label i_label = 4;
dfsan_set_label(i_label, &i, sizeof(i));
dfsan_label ij_label = dfsan_get_label(f(i));
assert(dfsan_has_label(ij_label, i_label));
- assert(dfsan_has_label_with_desc(ij_label, "j"));
+
+ /* Must be consistent with the one in f(). */
+ dfsan_label j_label = 2;
+ assert(dfsan_has_label(ij_label, 2));
return 0;
}
diff --git a/compiler-rt/test/dfsan/fork.cpp b/compiler-rt/test/dfsan/fork.cpp
index cd9b641eefc3f..15016c5b201a3 100644
--- a/compiler-rt/test/dfsan/fork.cpp
+++ b/compiler-rt/test/dfsan/fork.cpp
@@ -2,10 +2,10 @@
// Run a number of threads that create new chained origins, then fork
// and verify that origin reads do not deadlock in the child process.
//
-// RUN: %clangxx_dfsan -mllvm -dfsan-fast-16-labels=true %s -o %t
+// RUN: %clangxx_dfsan %s -o %t
// RUN: %run %t 2>&1 | FileCheck %s
//
-// RUN: %clangxx_dfsan -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t
+// RUN: %clangxx_dfsan -mllvm -dfsan-track-origins=1 %s -o %t
// RUN: DFSAN_OPTIONS=store_context_size=1000,origin_history_size=0,origin_history_per_stack_limit=0 %run %t 2>&1 | FileCheck %s
//
// REQUIRES: x86_64-target-arch
diff --git a/compiler-rt/test/dfsan/interceptors.c b/compiler-rt/test/dfsan/interceptors.c
index b949d2f338887..029832bf57552 100644
--- a/compiler-rt/test/dfsan/interceptors.c
+++ b/compiler-rt/test/dfsan/interceptors.c
@@ -1,5 +1,5 @@
-// RUN: %clang_dfsan -mllvm -dfsan-fast-16-labels -mllvm -dfsan-combine-pointer-labels-on-load=false %s -o %t && %run %t
-// RUN: %clang_dfsan -DORIGIN_TRACKING -mllvm -dfsan-fast-16-labels -mllvm -dfsan-track-origins=1 -mllvm -dfsan-combine-pointer-labels-on-load=false %s -o %t && %run %t
+// RUN: %clang_dfsan -mllvm -dfsan-combine-pointer-labels-on-load=false %s -o %t && %run %t
+// RUN: %clang_dfsan -DORIGIN_TRACKING -mllvm -dfsan-track-origins=1 -mllvm -dfsan-combine-pointer-labels-on-load=false %s -o %t && %run %t
//
// Tests custom implementations of various glibc functions.
//
diff --git a/compiler-rt/test/dfsan/label_count.c b/compiler-rt/test/dfsan/label_count.c
deleted file mode 100644
index 444278b89e9c0..0000000000000
--- a/compiler-rt/test/dfsan/label_count.c
+++ /dev/null
@@ -1,77 +0,0 @@
-// RUN: %clang_dfsan -DLIB -c %s -o %t.lib.o && \
-// RUN: %clang_dfsan -c %s -o %t.o && \
-// RUN: %clang_dfsan %t.lib.o %t.o -o %t.bin && \
-// RUN: %run %t.bin
-
-// RUN: %clang_dfsan -mllvm -dfsan-args-abi -DLIB -c %s -o %t.lib.o && \
-// RUN: %clang_dfsan -mllvm -dfsan-args-abi -c %s -o %t.o && \
-// RUN: %clang_dfsan -mllvm -dfsan-args-abi %t.o %t.lib.o -o %t.bin && \
-// RUN: %run %t.bin
-//
-// REQUIRES: x86_64-target-arch
-
-#include <sanitizer/dfsan_interface.h>
-#include <assert.h>
-
-#ifdef LIB
-// Compiling this file with and without LIB defined allows this file to be
-// built as two separate translation units. This ensures that the code
-// can not be optimized in a way that removes behavior we wish to test. For
-// example, computing a value should cause labels to be allocated only if
-// the computation is actually done. Putting the computation here prevents
-// the compiler from optimizing away the computation (and labeling) that
-// tests wish to verify.
-
-int add_in_separate_translation_unit(int a, int b) {
- return a + b;
-}
-
-int multiply_in_separate_translation_unit(int a, int b) {
- return a * b;
-}
-
-#else
-
-int add_in_separate_translation_unit(int i, int j);
-int multiply_in_separate_translation_unit(int i, int j);
-
-int main(void) {
- size_t label_count;
-
- // No labels allocated yet.
- label_count = dfsan_get_label_count();
- assert(0 == label_count);
-
- int i = 1;
- dfsan_label i_label = dfsan_create_label("i", 0);
- dfsan_set_label(i_label, &i, sizeof(i));
-
- // One label allocated for i.
- label_count = dfsan_get_label_count();
- assert(1u == label_count);
-
- int j = 2;
- dfsan_label j_label = dfsan_create_label("j", 0);
- dfsan_set_label(j_label, &j, sizeof(j));
-
- // Check that a new label was allocated for j.
- label_count = dfsan_get_label_count();
- assert(2u == label_count);
-
- // Create a value that combines i and j.
- int i_plus_j = add_in_separate_translation_unit(i, j);
-
- // Check that a label was created for the union of i and j.
- label_count = dfsan_get_label_count();
- assert(3u == label_count);
-
- // Combine i and j in a
diff erent way. Check that the existing label is
- // reused, and a new label is not created.
- int j_times_i = multiply_in_separate_translation_unit(j, i);
- label_count = dfsan_get_label_count();
- assert(3u == label_count);
- assert(dfsan_get_label(i_plus_j) == dfsan_get_label(j_times_i));
-
- return 0;
-}
-#endif // #ifdef LIB
diff --git a/compiler-rt/test/dfsan/origin_add_label.c b/compiler-rt/test/dfsan/origin_add_label.c
index baf40edc9a776..058c3c65b5142 100644
--- a/compiler-rt/test/dfsan/origin_add_label.c
+++ b/compiler-rt/test/dfsan/origin_add_label.c
@@ -1,10 +1,10 @@
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
-// RUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: FileCheck %s < %t.out
//
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true -mllvm -dfsan-instrument-with-call-threshold=0 %s -o %t && \
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-instrument-with-call-threshold=0 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
-// RUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: FileCheck %s < %t.out
//
// REQUIRES: x86_64-target-arch
diff --git a/compiler-rt/test/dfsan/origin_branch.c b/compiler-rt/test/dfsan/origin_branch.c
index 3c7e5b62e3ba5..16ffda243f589 100644
--- a/compiler-rt/test/dfsan/origin_branch.c
+++ b/compiler-rt/test/dfsan/origin_branch.c
@@ -1,6 +1,6 @@
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
-// RUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: FileCheck %s < %t.out
//
// REQUIRES: x86_64-target-arch
diff --git a/compiler-rt/test/dfsan/origin_disabled.c b/compiler-rt/test/dfsan/origin_disabled.c
index 44c5e663d4a48..d2e9c6546cb68 100644
--- a/compiler-rt/test/dfsan/origin_disabled.c
+++ b/compiler-rt/test/dfsan/origin_disabled.c
@@ -1,6 +1,5 @@
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-fast-16-labels=true %s -o %t && \
-// RUN: %run %t >%t.out 2>&1
-// RUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: %clang_dfsan -gmlt %s -o %t && %run %t >%t.out 2>&1
+// RUN: FileCheck %s < %t.out
//
// REQUIRES: x86_64-target-arch
diff --git a/compiler-rt/test/dfsan/origin_invalid.c b/compiler-rt/test/dfsan/origin_invalid.c
index d391e92560f1d..2de5b01dea2f6 100644
--- a/compiler-rt/test/dfsan/origin_invalid.c
+++ b/compiler-rt/test/dfsan/origin_invalid.c
@@ -1,6 +1,6 @@
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-fast-16-labels=true -mllvm -dfsan-track-origins=1 %s -o %t && \
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
-// RUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: FileCheck %s < %t.out
//
// REQUIRES: x86_64-target-arch
@@ -8,13 +8,13 @@
int main(int argc, char *argv[]) {
uint64_t a = 10;
- dfsan_set_label(8, &a, sizeof(a));
+ dfsan_set_label(1, &a, sizeof(a));
size_t origin_addr =
- (((size_t)&a & ~0x700000000000LL + 0x200000000000LL) & ~0x3UL);
+ (((size_t)&a & ~0x600000000000LL + 0x100000000000LL) & ~0x3UL);
asm("mov %0, %%rax": :"r"(origin_addr));
asm("movq $0, (%rax)");
dfsan_print_origin_trace(&a, "invalid");
}
-// CHECK: Taint value 0x8 (at {{.*}}) origin tracking (invalid)
-// CHECK: Taint value 0x8 (at {{.*}}) has invalid origin tracking. This can be a DFSan bug.
+// CHECK: Taint value 0x1 (at {{.*}}) origin tracking (invalid)
+// CHECK: Taint value 0x1 (at {{.*}}) has invalid origin tracking. This can be a DFSan bug.
diff --git a/compiler-rt/test/dfsan/origin_ld_lost.c b/compiler-rt/test/dfsan/origin_ld_lost.c
index 37fcd6c1c1a46..3229e5cedc672 100644
--- a/compiler-rt/test/dfsan/origin_ld_lost.c
+++ b/compiler-rt/test/dfsan/origin_ld_lost.c
@@ -1,6 +1,6 @@
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
-// RUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: FileCheck %s < %t.out
//
// REQUIRES: x86_64-target-arch
//
diff --git a/compiler-rt/test/dfsan/origin_ldst.c b/compiler-rt/test/dfsan/origin_ldst.c
index 2e4eca18596d6..5aa7f332f53ae 100644
--- a/compiler-rt/test/dfsan/origin_ldst.c
+++ b/compiler-rt/test/dfsan/origin_ldst.c
@@ -1,26 +1,26 @@
-// RUN: %clang_dfsan -gmlt -DTEST64 -DALIGN=8 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -DTEST64 -DALIGN=8 -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
-// RUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: FileCheck %s < %t.out
//
-// RUN: %clang_dfsan -gmlt -DTEST32 -DALIGN=4 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -DTEST32 -DALIGN=4 -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
-// RUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: FileCheck %s < %t.out
//
-// RUN: %clang_dfsan -gmlt -DALIGN=2 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -DALIGN=2 -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
-// RUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: FileCheck %s < %t.out
//
-// rUN: %clang_dfsan -DTEST64 -DALIGN=5 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
-// rUN: %run %t >%t.out 2>&1
-// rUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: %clang_dfsan -gmlt -DTEST64 -DALIGN=4 -mllvm -dfsan-track-origins=1 %s -o %t && \
+// RUN: %run %t >%t.out 2>&1
+// RUN: FileCheck %s < %t.out
//
-// rUN: %clang_dfsan -DTEST32 -DALIGN=3 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
-// rUN: %run %t >%t.out 2>&1
-// rUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: %clang_dfsan -gmlt -DTEST32 -DALIGN=2 -mllvm -dfsan-track-origins=1 %s -o %t && \
+// RUN: %run %t >%t.out 2>&1
+// RUN: FileCheck %s < %t.out
//
-// RUN: %clang_dfsan -gmlt -DALIGN=1 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -DALIGN=1 -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
-// RUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: FileCheck %s < %t.out
//
// REQUIRES: x86_64-target-arch
//
diff --git a/compiler-rt/test/dfsan/origin_limit.c b/compiler-rt/test/dfsan/origin_limit.c
index 71920d878e47e..79988544a36d7 100644
--- a/compiler-rt/test/dfsan/origin_limit.c
+++ b/compiler-rt/test/dfsan/origin_limit.c
@@ -1,7 +1,7 @@
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 %s -o %t
//
// RUN: %run %t >%t.out 2>&1
-// RUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: FileCheck %s < %t.out
//
// RUN: DFSAN_OPTIONS=origin_history_size=2 %run %t >%t.out 2>&1
// RUN: FileCheck %s --check-prefix=CHECK2 < %t.out
diff --git a/compiler-rt/test/dfsan/origin_memcpy.c b/compiler-rt/test/dfsan/origin_memcpy.c
index 34edf9d4554a8..1649faab6c880 100644
--- a/compiler-rt/test/dfsan/origin_memcpy.c
+++ b/compiler-rt/test/dfsan/origin_memcpy.c
@@ -1,8 +1,8 @@
-// RUN: %clang_dfsan -gmlt -DOFFSET=0 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -DOFFSET=0 -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s --check-prefix=CHECK0 < %t.out
//
-// RUN: %clang_dfsan -gmlt -DOFFSET=10 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -DOFFSET=10 -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s --check-prefix=CHECK10 < %t.out
//
diff --git a/compiler-rt/test/dfsan/origin_memmove.c b/compiler-rt/test/dfsan/origin_memmove.c
index fee04569ce9db..2d8e9e4b5afb7 100644
--- a/compiler-rt/test/dfsan/origin_memmove.c
+++ b/compiler-rt/test/dfsan/origin_memmove.c
@@ -1,8 +1,8 @@
-// RUN: %clang_dfsan -gmlt -DOFFSET=0 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -DOFFSET=0 -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s --check-prefix=CHECK0 < %t.out
//
-// RUN: %clang_dfsan -gmlt -DOFFSET=10 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -DOFFSET=10 -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s --check-prefix=CHECK10 < %t.out
//
diff --git a/compiler-rt/test/dfsan/origin_memset.c b/compiler-rt/test/dfsan/origin_memset.c
index 21b384188057b..86d4034e30f21 100644
--- a/compiler-rt/test/dfsan/origin_memset.c
+++ b/compiler-rt/test/dfsan/origin_memset.c
@@ -1,8 +1,8 @@
-// RUN: %clang_dfsan -gmlt -DOFFSET=0 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -DOFFSET=0 -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s --check-prefix=CHECK0 < %t.out
//
-// RUN: %clang_dfsan -gmlt -DOFFSET=10 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -DOFFSET=10 -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s --check-prefix=CHECK10 < %t.out
//
diff --git a/compiler-rt/test/dfsan/origin_overlapped.c b/compiler-rt/test/dfsan/origin_overlapped.c
index 33bd0ec9cb1ad..60774c8419baf 100644
--- a/compiler-rt/test/dfsan/origin_overlapped.c
+++ b/compiler-rt/test/dfsan/origin_overlapped.c
@@ -1,6 +1,6 @@
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
-// RUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: FileCheck %s < %t.out
//
// REQUIRES: x86_64-target-arch
diff --git a/compiler-rt/test/dfsan/origin_set_label.c b/compiler-rt/test/dfsan/origin_set_label.c
index d6a5d264772eb..b8727a60e1831 100644
--- a/compiler-rt/test/dfsan/origin_set_label.c
+++ b/compiler-rt/test/dfsan/origin_set_label.c
@@ -1,10 +1,10 @@
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
-// RUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: FileCheck %s < %t.out
//
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true -mllvm -dfsan-instrument-with-call-threshold=0 %s -o %t && \
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-instrument-with-call-threshold=0 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
-// RUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: FileCheck %s < %t.out
//
// REQUIRES: x86_64-target-arch
diff --git a/compiler-rt/test/dfsan/origin_stack_trace.c b/compiler-rt/test/dfsan/origin_stack_trace.c
index c7018a54d7215..e51698f618013 100644
--- a/compiler-rt/test/dfsan/origin_stack_trace.c
+++ b/compiler-rt/test/dfsan/origin_stack_trace.c
@@ -1,8 +1,8 @@
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s < %t.out
//
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true -mllvm -dfsan-instrument-with-call-threshold=0 %s -o %t && \
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-instrument-with-call-threshold=0 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s < %t.out
//
diff --git a/compiler-rt/test/dfsan/origin_track_ld.c b/compiler-rt/test/dfsan/origin_track_ld.c
index 96edbea5381ef..d1415abf254aa 100644
--- a/compiler-rt/test/dfsan/origin_track_ld.c
+++ b/compiler-rt/test/dfsan/origin_track_ld.c
@@ -1,4 +1,4 @@
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=2 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=2 %s -o %t && \
// RUN: %run %t > %t.out 2>&1
// RUN: FileCheck %s < %t.out
//
diff --git a/compiler-rt/test/dfsan/origin_unaligned_memtrans.c b/compiler-rt/test/dfsan/origin_unaligned_memtrans.c
index fa3db7c32fc73..c0faf93c39109 100644
--- a/compiler-rt/test/dfsan/origin_unaligned_memtrans.c
+++ b/compiler-rt/test/dfsan/origin_unaligned_memtrans.c
@@ -1,8 +1,8 @@
-// RUN: %clang_dfsan -gmlt -DOFFSET=0 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -DOFFSET=0 -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s --check-prefix=CHECK0 < %t.out
//
-// RUN: %clang_dfsan -gmlt -DOFFSET=10 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -DOFFSET=10 -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s --check-prefix=CHECK10 < %t.out
//
diff --git a/compiler-rt/test/dfsan/origin_untainted.c b/compiler-rt/test/dfsan/origin_untainted.c
index d51ab1bd1e05f..da508cf0a0a61 100644
--- a/compiler-rt/test/dfsan/origin_untainted.c
+++ b/compiler-rt/test/dfsan/origin_untainted.c
@@ -1,6 +1,6 @@
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-fast-16-labels=true -mllvm -dfsan-track-origins=1 %s -o %t && \
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
-// RUN: FileCheck %s --check-prefix=CHECK < %t.out
+// RUN: FileCheck %s < %t.out
//
// REQUIRES: x86_64-target-arch
diff --git a/compiler-rt/test/dfsan/origin_with_sigactions.c b/compiler-rt/test/dfsan/origin_with_sigactions.c
index 3f7986dd540ed..ef0e340028eee 100644
--- a/compiler-rt/test/dfsan/origin_with_sigactions.c
+++ b/compiler-rt/test/dfsan/origin_with_sigactions.c
@@ -3,19 +3,19 @@
// Origin tracking uses ChainedOriginDepot that is not async signal safe, so we
// do not track origins inside signal handlers.
//
-// RUN: %clang_dfsan -gmlt -DUSE_SIGNAL_ACTION -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -DUSE_SIGNAL_ACTION -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s < %t.out
//
-// RUN: %clang_dfsan -gmlt -DUSE_SIGNAL_ACTION -mllvm -dfsan-instrument-with-call-threshold=0 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -DUSE_SIGNAL_ACTION -mllvm -dfsan-instrument-with-call-threshold=0 -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s < %t.out
//
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s < %t.out
//
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-instrument-with-call-threshold=0 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-instrument-with-call-threshold=0 -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s < %t.out
//
diff --git a/compiler-rt/test/dfsan/origin_with_signals.cpp b/compiler-rt/test/dfsan/origin_with_signals.cpp
index d4885563a4473..a22f64983ae65 100644
--- a/compiler-rt/test/dfsan/origin_with_signals.cpp
+++ b/compiler-rt/test/dfsan/origin_with_signals.cpp
@@ -3,11 +3,11 @@
// Origin tracking uses ChainedOriginDepot that is not async signal safe, so we
// do not track origins inside signal handlers.
//
-// RUN: %clangxx_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clangxx_dfsan -gmlt -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s < %t.out
//
-// RUN: %clangxx_dfsan -gmlt -mllvm -dfsan-instrument-with-call-threshold=0 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clangxx_dfsan -gmlt -mllvm -dfsan-instrument-with-call-threshold=0 -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s < %t.out
//
diff --git a/compiler-rt/test/dfsan/pair.cpp b/compiler-rt/test/dfsan/pair.cpp
index 4c2700d28e833..c794a34aff9c3 100644
--- a/compiler-rt/test/dfsan/pair.cpp
+++ b/compiler-rt/test/dfsan/pair.cpp
@@ -1,5 +1,5 @@
-// RUN: %clangxx_dfsan %s -mllvm -dfsan-fast-16-labels -mllvm -dfsan-track-select-control-flow=false -mllvm -dfsan-combine-pointer-labels-on-load=false -O0 -DO0 -o %t && %run %t
-// RUN: %clangxx_dfsan %s -mllvm -dfsan-fast-16-labels -mllvm -dfsan-track-select-control-flow=false -mllvm -dfsan-combine-pointer-labels-on-load=false -O1 -o %t && %run %t
+// RUN: %clangxx_dfsan %s -mllvm -dfsan-track-select-control-flow=false -mllvm -dfsan-combine-pointer-labels-on-load=false -O0 -DO0 -o %t && %run %t
+// RUN: %clangxx_dfsan %s -mllvm -dfsan-track-select-control-flow=false -mllvm -dfsan-combine-pointer-labels-on-load=false -O1 -o %t && %run %t
//
// REQUIRES: x86_64-target-arch
diff --git a/compiler-rt/test/dfsan/propagate.c b/compiler-rt/test/dfsan/propagate.c
index bd8fca9ca5afb..3d812853ae0f0 100644
--- a/compiler-rt/test/dfsan/propagate.c
+++ b/compiler-rt/test/dfsan/propagate.c
@@ -13,15 +13,15 @@ int main(void) {
assert(dfsan_union(0, 0) == 0);
int i = 1;
- dfsan_label i_label = dfsan_create_label("i", 0);
+ dfsan_label i_label = 1;
dfsan_set_label(i_label, &i, sizeof(i));
int j = 2;
- dfsan_label j_label = dfsan_create_label("j", 0);
+ dfsan_label j_label = 2;
dfsan_set_label(j_label, &j, sizeof(j));
int k = 3;
- dfsan_label k_label = dfsan_create_label("k", 0);
+ dfsan_label k_label = 4;
dfsan_set_label(k_label, &k, sizeof(k));
int k2 = 4;
diff --git a/compiler-rt/test/dfsan/pthread.c b/compiler-rt/test/dfsan/pthread.c
index 75bc4720cea84..4b111255e6238 100644
--- a/compiler-rt/test/dfsan/pthread.c
+++ b/compiler-rt/test/dfsan/pthread.c
@@ -1,10 +1,10 @@
-// RUN: %clang_dfsan -mllvm -dfsan-fast-16-labels=true %s -o %t && %run %t
+// RUN: %clang_dfsan %s -o %t && %run %t
//
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && \
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s < %t.out
//
-// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true -mllvm -dfsan-instrument-with-call-threshold=0 %s -o %t && \
+// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 -mllvm -dfsan-instrument-with-call-threshold=0 %s -o %t && \
// RUN: %run %t >%t.out 2>&1
// RUN: FileCheck %s < %t.out
//
diff --git a/compiler-rt/test/dfsan/release_shadow_space.c b/compiler-rt/test/dfsan/release_shadow_space.c
index 5e4298ffa12e2..01a21daec933c 100644
--- a/compiler-rt/test/dfsan/release_shadow_space.c
+++ b/compiler-rt/test/dfsan/release_shadow_space.c
@@ -1,7 +1,7 @@
// DFSAN_OPTIONS=no_huge_pages_for_shadow=false RUN: %clang_dfsan %s -o %t && setarch `uname -m` -R %run %t
// DFSAN_OPTIONS=no_huge_pages_for_shadow=true RUN: %clang_dfsan %s -o %t && setarch `uname -m` -R %run %t
-// DFSAN_OPTIONS=no_huge_pages_for_shadow=false RUN: %clang_dfsan %s -DORIGIN_TRACKING -mllvm -dfsan-fast-16-labels -mllvm -dfsan-track-origins=1 -o %t && setarch `uname -m` -R %run %t
-// DFSAN_OPTIONS=no_huge_pages_for_shadow=true RUN: %clang_dfsan %s -DORIGIN_TRACKING -mllvm -dfsan-fast-16-labels -mllvm -dfsan-track-origins=1 -o %t && setarch `uname -m` -R %run %t
+// DFSAN_OPTIONS=no_huge_pages_for_shadow=false RUN: %clang_dfsan %s -DORIGIN_TRACKING -mllvm -dfsan-track-origins=1 -o %t && setarch `uname -m` -R %run %t
+// DFSAN_OPTIONS=no_huge_pages_for_shadow=true RUN: %clang_dfsan %s -DORIGIN_TRACKING -mllvm -dfsan-track-origins=1 -o %t && setarch `uname -m` -R %run %t
//
// REQUIRES: x86_64-target-arch
@@ -45,7 +45,7 @@ int main(int argc, char **argv) {
size_t after_mmap = get_rss_kb();
// store labels to all addresses. The overhead is 2x.
- const dfsan_label label = dfsan_create_label("l", 0);
+ const dfsan_label label = 8;
char val = 0xff;
dfsan_set_label(label, &val, sizeof(val));
memset(p, val, map_size);
diff --git a/compiler-rt/test/dfsan/sigaction.c b/compiler-rt/test/dfsan/sigaction.c
index 30f8b0bf340c7..6b8f25b32c207 100644
--- a/compiler-rt/test/dfsan/sigaction.c
+++ b/compiler-rt/test/dfsan/sigaction.c
@@ -1,6 +1,5 @@
-// RUN: %clang_dfsan -DUSE_SIGNAL_ACTION -mllvm -dfsan-fast-16-labels=true %s -o %t && \
-// RUN: %run %t
-// RUN: %clang_dfsan -mllvm -dfsan-fast-16-labels=true %s -o %t && %run %t
+// RUN: %clang_dfsan -DUSE_SIGNAL_ACTION %s -o %t && %run %t
+// RUN: %clang_dfsan %s -o %t && %run %t
//
// REQUIRES: x86_64-target-arch
diff --git a/compiler-rt/test/dfsan/sigaction_stress_test.c b/compiler-rt/test/dfsan/sigaction_stress_test.c
index edb45fa5caf49..8c25fe5fa2c2f 100644
--- a/compiler-rt/test/dfsan/sigaction_stress_test.c
+++ b/compiler-rt/test/dfsan/sigaction_stress_test.c
@@ -1,6 +1,6 @@
-// RUN: %clangxx_dfsan -mllvm -dfsan-fast-16-labels=true %s -o %t && %run %t
-// RUN: %clangxx_dfsan -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true %s -o %t && %run %t
-// RUN: %clangxx_dfsan -mllvm -dfsan-track-origins=1 -mllvm -dfsan-fast-16-labels=true -mllvm -dfsan-instrument-with-call-threshold=0 %s -o %t && %run %t
+// RUN: %clangxx_dfsan %s -o %t && %run %t
+// RUN: %clangxx_dfsan -mllvm -dfsan-track-origins=1 %s -o %t && %run %t
+// RUN: %clangxx_dfsan -mllvm -dfsan-track-origins=1 -mllvm -dfsan-instrument-with-call-threshold=0 %s -o %t && %run %t
//
// Test that the state of shadows from a sigaction handler are consistent.
//
diff --git a/compiler-rt/test/dfsan/struct.c b/compiler-rt/test/dfsan/struct.c
index 8a6913f4dcec5..31d0d6c0e3390 100644
--- a/compiler-rt/test/dfsan/struct.c
+++ b/compiler-rt/test/dfsan/struct.c
@@ -1,6 +1,4 @@
-// RUN: %clang_dfsan %s -O1 -mllvm -dfsan-fast-16-labels=true -DFAST16_O1 -o %t && %run %t
-// RUN: %clang_dfsan %s -O1 -DO1 -o %t && %run %t
-// RUN: %clang_dfsan %s -O0 -mllvm -dfsan-fast-16-labels=true -DFAST16_O0 -o %t && %run %t
+// RUN: %clang_dfsan %s -O1 -o %t && %run %t
// RUN: %clang_dfsan %s -O0 -DO0 -o %t && %run %t
//
// REQUIRES: x86_64-target-arch
@@ -40,13 +38,8 @@ Pair copy_pair2(const Pair pair0) {
int main(void) {
int i = 1;
char *ptr = NULL;
-#if defined(FAST16_O1) || defined(FAST16_O0)
dfsan_label i_label = 1;
dfsan_label ptr_label = 2;
-#else
- dfsan_label i_label = dfsan_create_label("i", 0);
- dfsan_label ptr_label = dfsan_create_label("ptr", 0);
-#endif
dfsan_set_label(i_label, &i, sizeof(i));
dfsan_set_label(ptr_label, &ptr, sizeof(ptr));
@@ -56,12 +49,7 @@ int main(void) {
dfsan_label i1_label = dfsan_read_label(&i1, sizeof(i1));
dfsan_label ptr1_label = dfsan_read_label(&ptr1, sizeof(ptr1));
-#if defined(O0) || defined(O1)
- assert(dfsan_has_label(i1_label, i_label));
- assert(dfsan_has_label(i1_label, ptr_label));
- assert(dfsan_has_label(ptr1_label, i_label));
- assert(dfsan_has_label(ptr1_label, ptr_label));
-#elif defined(FAST16_O0)
+#if defined(O0)
assert(i1_label == (i_label | ptr_label));
assert(ptr1_label == (i_label | ptr_label));
#else
@@ -75,12 +63,7 @@ int main(void) {
dfsan_label i2_label = dfsan_read_label(&i2, sizeof(i2));
dfsan_label ptr2_label = dfsan_read_label(&ptr2, sizeof(ptr2));
-#if defined(O0) || defined(O1)
- assert(dfsan_has_label(i2_label, i_label));
- assert(dfsan_has_label(i2_label, ptr_label));
- assert(dfsan_has_label(ptr2_label, i_label));
- assert(dfsan_has_label(ptr2_label, ptr_label));
-#elif defined(FAST16_O0)
+#if defined(O0)
assert(i2_label == (i_label | ptr_label));
assert(ptr2_label == (i_label | ptr_label));
#else
@@ -94,12 +77,7 @@ int main(void) {
dfsan_label i3_label = dfsan_read_label(&i3, sizeof(i3));
dfsan_label ptr3_label = dfsan_read_label(&ptr3, sizeof(ptr3));
-#if defined(O0) || defined(O1)
- assert(dfsan_has_label(i3_label, i_label));
- assert(dfsan_has_label(i3_label, ptr_label));
- assert(dfsan_has_label(ptr3_label, i_label));
- assert(dfsan_has_label(ptr3_label, ptr_label));
-#elif defined(FAST16_O0)
+#if defined(O0)
assert(i3_label == (i_label | ptr_label));
assert(ptr3_label == (i_label | ptr_label));
#else
diff --git a/compiler-rt/test/fuzzer/dataflow.test b/compiler-rt/test/fuzzer/dataflow.test
index 391f160d0044a..99184103e7399 100644
--- a/compiler-rt/test/fuzzer/dataflow.test
+++ b/compiler-rt/test/fuzzer/dataflow.test
@@ -2,10 +2,10 @@
REQUIRES: linux, x86_64
# Build the tracer and the test.
-RUN: %no_fuzzer_cpp_compiler -c -fno-sanitize=all -fsanitize=dataflow -mllvm -dfsan-fast-16-labels %S/../../lib/fuzzer/dataflow/DataFlow.cpp -o %t-DataFlow.o
+RUN: %no_fuzzer_cpp_compiler -c -fno-sanitize=all -fsanitize=dataflow %S/../../lib/fuzzer/dataflow/DataFlow.cpp -o %t-DataFlow.o
RUN: %no_fuzzer_cpp_compiler -c -fno-sanitize=all -fPIC %S/../../lib/fuzzer/dataflow/DataFlowCallbacks.cpp -o %t-DataFlowCallbacks.o
-RUN: %no_fuzzer_cpp_compiler -fno-sanitize=all -fsanitize=dataflow -mllvm -dfsan-fast-16-labels -fsanitize-coverage=trace-pc-guard,pc-table,bb,trace-cmp %S/ThreeFunctionsTest.cpp %t-DataFlow*.o -o %t-ThreeFunctionsTestDF
-RUN: %no_fuzzer_cpp_compiler -fno-sanitize=all -fsanitize=dataflow -mllvm -dfsan-fast-16-labels -fsanitize-coverage=trace-pc-guard,pc-table,bb,trace-cmp %S/Labels20Test.cpp %t-DataFlow*.o -o %t-Labels20TestDF
+RUN: %no_fuzzer_cpp_compiler -fno-sanitize=all -fsanitize=dataflow -fsanitize-coverage=trace-pc-guard,pc-table,bb,trace-cmp %S/ThreeFunctionsTest.cpp %t-DataFlow*.o -o %t-ThreeFunctionsTestDF
+RUN: %no_fuzzer_cpp_compiler -fno-sanitize=all -fsanitize=dataflow -fsanitize-coverage=trace-pc-guard,pc-table,bb,trace-cmp %S/Labels20Test.cpp %t-DataFlow*.o -o %t-Labels20TestDF
RUN: %cpp_compiler %S/ThreeFunctionsTest.cpp -o %t-ThreeFunctionsTest
# Dump the function list.
diff --git a/compiler-rt/test/fuzzer/only-some-bytes-fork.test b/compiler-rt/test/fuzzer/only-some-bytes-fork.test
index a4142dbbb3b9a..75c047e6b4ae2 100644
--- a/compiler-rt/test/fuzzer/only-some-bytes-fork.test
+++ b/compiler-rt/test/fuzzer/only-some-bytes-fork.test
@@ -2,9 +2,9 @@
REQUIRES: linux, x86_64
# Build the tracer and the test.
-RUN: %no_fuzzer_cpp_compiler -c -fno-sanitize=all -fsanitize=dataflow -mllvm -dfsan-fast-16-labels %S/../../lib/fuzzer/dataflow/DataFlow.cpp -o %t-DataFlow.o
+RUN: %no_fuzzer_cpp_compiler -c -fno-sanitize=all -fsanitize=dataflow %S/../../lib/fuzzer/dataflow/DataFlow.cpp -o %t-DataFlow.o
RUN: %no_fuzzer_cpp_compiler -c -fno-sanitize=all -fPIC %S/../../lib/fuzzer/dataflow/DataFlowCallbacks.cpp -o %t-DataFlowCallbacks.o
-RUN: %no_fuzzer_cpp_compiler -fno-sanitize=all -fsanitize=dataflow -mllvm -dfsan-fast-16-labels -fsanitize-coverage=trace-pc-guard,pc-table,bb,trace-cmp %S/OnlySomeBytesTest.cpp %t-DataFlow*.o -o %t-DFT
+RUN: %no_fuzzer_cpp_compiler -fno-sanitize=all -fsanitize=dataflow -fsanitize-coverage=trace-pc-guard,pc-table,bb,trace-cmp %S/OnlySomeBytesTest.cpp %t-DataFlow*.o -o %t-DFT
RUN: %cpp_compiler %S/OnlySomeBytesTest.cpp -o %t-Fuzz
# Test that the fork mode can collect and use the DFT
diff --git a/compiler-rt/test/fuzzer/only-some-bytes.test b/compiler-rt/test/fuzzer/only-some-bytes.test
index 9a31ebfc93c1e..91d208861f4cb 100644
--- a/compiler-rt/test/fuzzer/only-some-bytes.test
+++ b/compiler-rt/test/fuzzer/only-some-bytes.test
@@ -2,9 +2,9 @@
REQUIRES: linux, x86_64
# Build the tracer and the test.
-RUN: %no_fuzzer_cpp_compiler -c -fno-sanitize=all -fsanitize=dataflow -mllvm -dfsan-fast-16-labels %S/../../lib/fuzzer/dataflow/DataFlow.cpp -o %t-DataFlow.o
+RUN: %no_fuzzer_cpp_compiler -c -fno-sanitize=all -fsanitize=dataflow %S/../../lib/fuzzer/dataflow/DataFlow.cpp -o %t-DataFlow.o
RUN: %no_fuzzer_cpp_compiler -c -fno-sanitize=all -fPIC %S/../../lib/fuzzer/dataflow/DataFlowCallbacks.cpp -o %t-DataFlowCallbacks.o
-RUN: %no_fuzzer_cpp_compiler -fno-sanitize=all -fsanitize=dataflow -mllvm -dfsan-fast-16-labels -fsanitize-coverage=trace-pc-guard,pc-table,bb,trace-cmp %S/OnlySomeBytesTest.cpp %t-DataFlow*.o -o %t-DFT
+RUN: %no_fuzzer_cpp_compiler -fno-sanitize=all -fsanitize=dataflow -fsanitize-coverage=trace-pc-guard,pc-table,bb,trace-cmp %S/OnlySomeBytesTest.cpp %t-DataFlow*.o -o %t-DFT
RUN: %cpp_compiler %S/OnlySomeBytesTest.cpp -o %t-Fuzz
# Prepare the inputs.
diff --git a/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
index bd4f32a472fc1..af4d43378e437 100644
--- a/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
@@ -18,11 +18,9 @@
/// The analysis is based on automatic propagation of data flow labels (also
/// known as taint labels) through a program as it performs computation.
///
-/// There are two possible memory layouts. In the first one, each byte of
-/// application memory is backed by a shadow memory byte. The shadow byte can
-/// represent up to 8 labels. To enable this you must specify the
-/// -dfsan-fast-8-labels flag. On Linux/x86_64, memory is then laid out as
-/// follows:
+/// Each byte of application memory is backed by a shadow memory byte. The
+/// shadow byte can represent up to 8 labels. On Linux/x86_64, memory is then
+/// laid out as follows:
///
/// +--------------------+ 0x800000000000 (top of memory)
/// | application memory |
@@ -30,11 +28,11 @@
/// | |
/// | unused |
/// | |
-/// +--------------------+ 0x300200000000 (kUnusedAddr)
-/// | union table |
-/// +--------------------+ 0x300000000000 (kUnionTableAddr)
+/// +--------------------+ 0x300000000000 (kUnusedAddr)
/// | origin |
/// +--------------------+ 0x200000008000 (kOriginAddr)
+/// | unused |
+/// +--------------------+ 0x200000000000
/// | shadow memory |
/// +--------------------+ 0x100000008000 (kShadowAddr)
/// | unused |
@@ -43,34 +41,9 @@
/// +--------------------+ 0x000000000000
///
///
-/// In the second memory layout, each byte of application memory is backed by
-/// two bytes of shadow memory which hold the label. That means we can represent
-/// either 16 labels (with -dfsan-fast-16-labels flag) or 2^16 labels (on the
-/// default legacy mode) per byte. On Linux/x86_64, memory is then laid out as
-/// follows:
-///
-/// +--------------------+ 0x800000000000 (top of memory)
-/// | application memory |
-/// +--------------------+ 0x700000008000 (kAppAddr)
-/// | |
-/// | unused |
-/// | |
-/// +--------------------+ 0x300200000000 (kUnusedAddr)
-/// | union table |
-/// +--------------------+ 0x300000000000 (kUnionTableAddr)
-/// | origin |
-/// +--------------------+ 0x200000008000 (kOriginAddr)
-/// | shadow memory |
-/// +--------------------+ 0x000000010000 (kShadowAddr)
-/// | reserved by kernel |
-/// +--------------------+ 0x000000000000
-///
-///
-/// To derive a shadow memory address from an application memory address,
-/// bits 44-46 are cleared to bring the address into the range
-/// [0x000000008000,0x100000000000). Then the address is shifted left by 1 to
-/// account for the double byte representation of shadow labels and move the
-/// address into the shadow memory range. See the function
+/// To derive a shadow memory address from an application memory address, bits
+/// 45-46 are cleared to bring the address into the range
+/// [0x100000008000,0x200000000000). See the function
/// DataFlowSanitizer::getShadowAddress below.
///
/// For more information, please refer to the design document:
@@ -230,22 +203,6 @@ static cl::opt<bool> ClEventCallbacks(
cl::desc("Insert calls to __dfsan_*_callback functions on data events."),
cl::Hidden, cl::init(false));
-// Use a distinct bit for each base label, enabling faster unions with less
-// instrumentation. Limits the max number of base labels to 16.
-static cl::opt<bool> ClFast16Labels(
- "dfsan-fast-16-labels",
- cl::desc("Use more efficient instrumentation, limiting the number of "
- "labels to 16."),
- cl::Hidden, cl::init(false));
-
-// Use a distinct bit for each base label, enabling faster unions with less
-// instrumentation. Limits the max number of base labels to 8.
-static cl::opt<bool> ClFast8Labels(
- "dfsan-fast-8-labels",
- cl::desc("Use more efficient instrumentation, limiting the number of "
- "labels to 8."),
- cl::Hidden, cl::init(false));
-
// Controls whether the pass tracks the control flow of select instructions.
static cl::opt<bool> ClTrackSelectControlFlow(
"dfsan-track-select-control-flow",
@@ -387,6 +344,8 @@ class DataFlowSanitizer {
friend struct DFSanFunction;
friend class DFSanVisitor;
+ enum { ShadowWidthBits = 8, ShadowWidthBytes = ShadowWidthBits / 8 };
+
enum {
OriginWidthBits = 32,
OriginWidthBytes = OriginWidthBits / 8
@@ -428,15 +387,11 @@ class DataFlowSanitizer {
WK_Custom
};
- unsigned ShadowWidthBits;
- unsigned ShadowWidthBytes;
-
Module *Mod;
LLVMContext *Ctx;
Type *Int8Ptr;
IntegerType *OriginTy;
PointerType *OriginPtrTy;
- ConstantInt *OriginBase;
ConstantInt *ZeroOrigin;
/// The shadow type for all primitive types and vector types.
IntegerType *PrimitiveShadowTy;
@@ -444,14 +399,14 @@ class DataFlowSanitizer {
IntegerType *IntptrTy;
ConstantInt *ZeroPrimitiveShadow;
ConstantInt *ShadowPtrMask;
- ConstantInt *ShadowPtrMul;
+ ConstantInt *ShadowBase;
+ ConstantInt *OriginBase;
Constant *ArgTLS;
ArrayType *ArgOriginTLSTy;
Constant *ArgOriginTLS;
Constant *RetvalTLS;
Constant *RetvalOriginTLS;
Constant *ExternalShadowMask;
- FunctionType *DFSanUnionFnTy;
FunctionType *DFSanUnionLoadFnTy;
FunctionType *DFSanLoadLabelAndOriginFnTy;
FunctionType *DFSanUnimplementedFnTy;
@@ -465,10 +420,7 @@ class DataFlowSanitizer {
FunctionType *DFSanChainOriginIfTaintedFnTy;
FunctionType *DFSanMemOriginTransferFnTy;
FunctionType *DFSanMaybeStoreOriginFnTy;
- FunctionCallee DFSanUnionFn;
- FunctionCallee DFSanCheckedUnionFn;
FunctionCallee DFSanUnionLoadFn;
- FunctionCallee DFSanUnionLoadFastLabelsFn;
FunctionCallee DFSanLoadLabelAndOriginFn;
FunctionCallee DFSanUnimplementedFn;
FunctionCallee DFSanSetLabelFn;
@@ -510,7 +462,6 @@ class DataFlowSanitizer {
void initializeCallbackFunctions(Module &M);
void initializeRuntimeFunctions(Module &M);
void injectMetadataGlobals(Module &M);
-
bool init(Module &M);
/// Advances \p OriginAddr to point to the next 32-bit origin and then loads
@@ -518,19 +469,15 @@ class DataFlowSanitizer {
Value *loadNextOrigin(Instruction *Pos, Align OriginAlign,
Value **OriginAddr);
- /// Returns whether fast8 or fast16 mode has been specified.
- bool hasFastLabelsEnabled();
-
/// Returns whether the given load byte size is amenable to inlined
/// optimization patterns.
bool hasLoadSizeForFastPath(uint64_t Size);
- /// Returns whether the pass tracks origins. Support only fast16 mode in TLS
- /// ABI mode.
+ /// Returns whether the pass tracks origins. Supports only TLS ABI mode.
bool shouldTrackOrigins();
/// Returns whether the pass tracks labels for struct fields and array
- /// indices. Support only fast16 mode in TLS ABI mode.
+ /// indices. Supports only TLS ABI mode.
bool shouldTrackFieldsAndIndices();
/// Returns a zero constant with the shadow type of OrigTy.
@@ -590,7 +537,6 @@ struct DFSanFunction {
DenseSet<Instruction *> SkipInsts;
std::vector<Value *> NonZeroChecks;
- bool AvoidNewBlocks;
struct CachedShadow {
BasicBlock *Block; // The block where Shadow is defined.
@@ -608,9 +554,6 @@ struct DFSanFunction {
DFSanFunction(DataFlowSanitizer &DFS, Function *F, bool IsNativeABI)
: DFS(DFS), F(F), IA(DFS.getInstrumentedABI()), IsNativeABI(IsNativeABI) {
DT.recalculate(*F);
- // FIXME: Need to track down the register allocator issue which causes poor
- // performance in pathological cases with large numbers of basic blocks.
- AvoidNewBlocks = F->size() > 1000;
}
/// Computes the shadow address for a given function argument.
@@ -702,15 +645,11 @@ struct DFSanFunction {
/// Returns the shadow value of an argument A.
Value *getShadowForTLSArgument(Argument *A);
- /// The fast path of loading shadow in legacy mode.
- Value *loadLegacyShadowFast(Value *ShadowAddr, uint64_t Size,
- Align ShadowAlign, Instruction *Pos);
-
- /// The fast path of loading shadow in fast-16-label mode.
+ /// The fast path of loading shadows.
std::pair<Value *, Value *>
- loadFast16ShadowFast(Value *ShadowAddr, Value *OriginAddr, uint64_t Size,
- Align ShadowAlign, Align OriginAlign, Value *FirstOrigin,
- Instruction *Pos);
+ loadShadowFast(Value *ShadowAddr, Value *OriginAddr, uint64_t Size,
+ Align ShadowAlign, Align OriginAlign, Value *FirstOrigin,
+ Instruction *Pos);
Align getOriginAlign(Align InstAlignment);
@@ -820,14 +759,6 @@ class DFSanVisitor : public InstVisitor<DFSanVisitor> {
DataFlowSanitizer::DataFlowSanitizer(
const std::vector<std::string> &ABIListFiles) {
- if (ClFast8Labels && ClFast16Labels) {
- report_fatal_error(
- "cannot set both -dfsan-fast-8-labels and -dfsan-fast-16-labels");
- }
-
- ShadowWidthBits = ClFast8Labels ? 8 : 16;
- ShadowWidthBytes = ShadowWidthBits / 8;
-
std::vector<std::string> AllABIListFiles(std::move(ABIListFiles));
llvm::append_range(AllABIListFiles, ClABIListFiles);
// FIXME: should we propagate vfs::FileSystem to this constructor?
@@ -922,11 +853,6 @@ bool DataFlowSanitizer::isZeroShadow(Value *V) {
return isa<ConstantAggregateZero>(V);
}
-bool DataFlowSanitizer::hasFastLabelsEnabled() {
- static const bool HasFastLabelsEnabled = ClFast8Labels || ClFast16Labels;
- return HasFastLabelsEnabled;
-}
-
bool DataFlowSanitizer::hasLoadSizeForFastPath(uint64_t Size) {
uint64_t ShadowSize = Size * ShadowWidthBytes;
return ShadowSize % 8 == 0 || ShadowSize == 4;
@@ -934,14 +860,12 @@ bool DataFlowSanitizer::hasLoadSizeForFastPath(uint64_t Size) {
bool DataFlowSanitizer::shouldTrackOrigins() {
static const bool ShouldTrackOrigins =
- ClTrackOrigins && getInstrumentedABI() == DataFlowSanitizer::IA_TLS &&
- hasFastLabelsEnabled();
+ ClTrackOrigins && getInstrumentedABI() == DataFlowSanitizer::IA_TLS;
return ShouldTrackOrigins;
}
bool DataFlowSanitizer::shouldTrackFieldsAndIndices() {
- return getInstrumentedABI() == DataFlowSanitizer::IA_TLS &&
- hasFastLabelsEnabled();
+ return getInstrumentedABI() == DataFlowSanitizer::IA_TLS;
}
Constant *DataFlowSanitizer::getZeroShadow(Type *OrigTy) {
@@ -1100,21 +1024,19 @@ bool DataFlowSanitizer::init(Module &M) {
PrimitiveShadowPtrTy = PointerType::getUnqual(PrimitiveShadowTy);
IntptrTy = DL.getIntPtrType(*Ctx);
ZeroPrimitiveShadow = ConstantInt::getSigned(PrimitiveShadowTy, 0);
- ShadowPtrMul = ConstantInt::getSigned(IntptrTy, ShadowWidthBytes);
- OriginBase = ConstantInt::get(IntptrTy, 0x200000000000LL);
ZeroOrigin = ConstantInt::getSigned(OriginTy, 0);
+ // TODO: these should be platform-specific and set in the switch-stmt below.
+ ShadowBase = ConstantInt::get(IntptrTy, 0x100000008000LL);
+ OriginBase = ConstantInt::get(IntptrTy, 0x200000008000LL);
+
switch (TargetTriple.getArch()) {
case Triple::x86_64:
- ShadowPtrMask = ClFast8Labels
- ? ConstantInt::getSigned(IntptrTy, ~0x600000000000LL)
- : ConstantInt::getSigned(IntptrTy, ~0x700000000000LL);
+ ShadowPtrMask = ConstantInt::getSigned(IntptrTy, ~0x600000000000LL);
break;
case Triple::mips64:
case Triple::mips64el:
- ShadowPtrMask = ClFast8Labels
- ? ConstantInt::getSigned(IntptrTy, ~0xE000000000LL)
- : ConstantInt::getSigned(IntptrTy, ~0xF000000000LL);
+ ShadowPtrMask = ConstantInt::getSigned(IntptrTy, ~0xE000000000LL);
break;
case Triple::aarch64:
case Triple::aarch64_be:
@@ -1125,9 +1047,6 @@ bool DataFlowSanitizer::init(Module &M) {
report_fatal_error("unsupported triple");
}
- Type *DFSanUnionArgs[2] = {PrimitiveShadowTy, PrimitiveShadowTy};
- DFSanUnionFnTy =
- FunctionType::get(PrimitiveShadowTy, DFSanUnionArgs, /*isVarArg=*/false);
Type *DFSanUnionLoadArgs[2] = {PrimitiveShadowPtrTy, IntptrTy};
DFSanUnionLoadFnTy = FunctionType::get(PrimitiveShadowTy, DFSanUnionLoadArgs,
/*isVarArg=*/false);
@@ -1306,32 +1225,6 @@ Constant *DataFlowSanitizer::getOrBuildTrampolineFunction(FunctionType *FT,
// Initialize DataFlowSanitizer runtime functions and declare them in the module
void DataFlowSanitizer::initializeRuntimeFunctions(Module &M) {
- {
- AttributeList AL;
- AL = AL.addAttribute(M.getContext(), AttributeList::FunctionIndex,
- Attribute::NoUnwind);
- AL = AL.addAttribute(M.getContext(), AttributeList::FunctionIndex,
- Attribute::ReadNone);
- AL = AL.addAttribute(M.getContext(), AttributeList::ReturnIndex,
- Attribute::ZExt);
- AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
- AL = AL.addParamAttribute(M.getContext(), 1, Attribute::ZExt);
- DFSanUnionFn =
- Mod->getOrInsertFunction("__dfsan_union", DFSanUnionFnTy, AL);
- }
- {
- AttributeList AL;
- AL = AL.addAttribute(M.getContext(), AttributeList::FunctionIndex,
- Attribute::NoUnwind);
- AL = AL.addAttribute(M.getContext(), AttributeList::FunctionIndex,
- Attribute::ReadNone);
- AL = AL.addAttribute(M.getContext(), AttributeList::ReturnIndex,
- Attribute::ZExt);
- AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
- AL = AL.addParamAttribute(M.getContext(), 1, Attribute::ZExt);
- DFSanCheckedUnionFn =
- Mod->getOrInsertFunction("dfsan_union", DFSanUnionFnTy, AL);
- }
{
AttributeList AL;
AL = AL.addAttribute(M.getContext(), AttributeList::FunctionIndex,
@@ -1343,17 +1236,6 @@ void DataFlowSanitizer::initializeRuntimeFunctions(Module &M) {
DFSanUnionLoadFn =
Mod->getOrInsertFunction("__dfsan_union_load", DFSanUnionLoadFnTy, AL);
}
- {
- AttributeList AL;
- AL = AL.addAttribute(M.getContext(), AttributeList::FunctionIndex,
- Attribute::NoUnwind);
- AL = AL.addAttribute(M.getContext(), AttributeList::FunctionIndex,
- Attribute::ReadOnly);
- AL = AL.addAttribute(M.getContext(), AttributeList::ReturnIndex,
- Attribute::ZExt);
- DFSanUnionLoadFastLabelsFn = Mod->getOrInsertFunction(
- "__dfsan_union_load_fast16labels", DFSanUnionLoadFnTy, AL);
- }
{
AttributeList AL;
AL = AL.addAttribute(M.getContext(), AttributeList::FunctionIndex,
@@ -1406,13 +1288,8 @@ void DataFlowSanitizer::initializeRuntimeFunctions(Module &M) {
"__dfsan_maybe_store_origin", DFSanMaybeStoreOriginFnTy, AL);
}
- DFSanRuntimeFunctions.insert(DFSanUnionFn.getCallee()->stripPointerCasts());
- DFSanRuntimeFunctions.insert(
- DFSanCheckedUnionFn.getCallee()->stripPointerCasts());
DFSanRuntimeFunctions.insert(
DFSanUnionLoadFn.getCallee()->stripPointerCasts());
- DFSanRuntimeFunctions.insert(
- DFSanUnionLoadFastLabelsFn.getCallee()->stripPointerCasts());
DFSanRuntimeFunctions.insert(
DFSanLoadLabelAndOriginFn.getCallee()->stripPointerCasts());
DFSanRuntimeFunctions.insert(
@@ -1878,13 +1755,16 @@ Value *DataFlowSanitizer::getShadowOffset(Value *Addr, IRBuilder<> &IRB) {
std::pair<Value *, Value *>
DataFlowSanitizer::getShadowOriginAddress(Value *Addr, Align InstAlignment,
Instruction *Pos) {
- // Returns ((Addr & shadow_mask) + origin_base) & ~4UL
+ // Returns ((Addr & shadow_mask) + origin_base - shadow_base) & ~4UL
IRBuilder<> IRB(Pos);
Value *ShadowOffset = getShadowOffset(Addr, IRB);
Value *ShadowPtr = getShadowAddress(Addr, Pos, ShadowOffset);
Value *OriginPtr = nullptr;
if (shouldTrackOrigins()) {
- Value *OriginLong = IRB.CreateAdd(ShadowOffset, OriginBase);
+ static Value *OriginByShadowOffset = ConstantInt::get(
+ IntptrTy, OriginBase->getZExtValue() - ShadowBase->getZExtValue());
+
+ Value *OriginLong = IRB.CreateAdd(ShadowOffset, OriginByShadowOffset);
const Align Alignment = llvm::assumeAligned(InstAlignment.value());
// When alignment is >= 4, Addr must be aligned to 4, otherwise it is UB.
// So Mask is unnecessary.
@@ -1900,15 +1780,11 @@ DataFlowSanitizer::getShadowOriginAddress(Value *Addr, Align InstAlignment,
Value *DataFlowSanitizer::getShadowAddress(Value *Addr, Instruction *Pos,
Value *ShadowOffset) {
IRBuilder<> IRB(Pos);
-
- if (!ShadowPtrMul->isOne())
- ShadowOffset = IRB.CreateMul(ShadowOffset, ShadowPtrMul);
-
return IRB.CreateIntToPtr(ShadowOffset, PrimitiveShadowPtrTy);
}
Value *DataFlowSanitizer::getShadowAddress(Value *Addr, Instruction *Pos) {
- // Returns (Addr & shadow_mask) x 2
+ // Returns (Addr & shadow_mask)
IRBuilder<> IRB(Pos);
Value *ShadowOffset = getShadowOffset(Addr, IRB);
return getShadowAddress(Addr, Pos, ShadowOffset);
@@ -1961,37 +1837,8 @@ Value *DFSanFunction::combineShadows(Value *V1, Value *V2, Instruction *Pos) {
Value *PV2 = collapseToPrimitiveShadow(V2, Pos);
IRBuilder<> IRB(Pos);
- if (DFS.hasFastLabelsEnabled()) {
- CCS.Block = Pos->getParent();
- CCS.Shadow = IRB.CreateOr(PV1, PV2);
- } else if (AvoidNewBlocks) {
- CallInst *Call = IRB.CreateCall(DFS.DFSanCheckedUnionFn, {PV1, PV2});
- Call->addAttribute(AttributeList::ReturnIndex, Attribute::ZExt);
- Call->addParamAttr(0, Attribute::ZExt);
- Call->addParamAttr(1, Attribute::ZExt);
-
- CCS.Block = Pos->getParent();
- CCS.Shadow = Call;
- } else {
- BasicBlock *Head = Pos->getParent();
- Value *Ne = IRB.CreateICmpNE(PV1, PV2);
- BranchInst *BI = cast<BranchInst>(SplitBlockAndInsertIfThen(
- Ne, Pos, /*Unreachable=*/false, DFS.ColdCallWeights, &DT));
- IRBuilder<> ThenIRB(BI);
- CallInst *Call = ThenIRB.CreateCall(DFS.DFSanUnionFn, {PV1, PV2});
- Call->addAttribute(AttributeList::ReturnIndex, Attribute::ZExt);
- Call->addParamAttr(0, Attribute::ZExt);
- Call->addParamAttr(1, Attribute::ZExt);
-
- BasicBlock *Tail = BI->getSuccessor(0);
- PHINode *Phi =
- PHINode::Create(DFS.PrimitiveShadowTy, 2, "", &Tail->front());
- Phi->addIncoming(Call, Call->getParent());
- Phi->addIncoming(PV1, Head);
-
- CCS.Block = Tail;
- CCS.Shadow = Phi;
- }
+ CCS.Block = Pos->getParent();
+ CCS.Shadow = IRB.CreateOr(PV1, PV2);
std::set<Value *> UnionElems;
if (V1Elems != ShadowElements.end()) {
@@ -2116,7 +1963,7 @@ Value *DataFlowSanitizer::loadNextOrigin(Instruction *Pos, Align OriginAlign,
return IRB.CreateAlignedLoad(OriginTy, *OriginAddr, OriginAlign);
}
-std::pair<Value *, Value *> DFSanFunction::loadFast16ShadowFast(
+std::pair<Value *, Value *> DFSanFunction::loadShadowFast(
Value *ShadowAddr, Value *OriginAddr, uint64_t Size, Align ShadowAlign,
Align OriginAlign, Value *FirstOrigin, Instruction *Pos) {
const bool ShouldTrackOrigins = DFS.shouldTrackOrigins();
@@ -2135,7 +1982,7 @@ std::pair<Value *, Value *> DFSanFunction::loadFast16ShadowFast(
// Specifically, when the shadow size in bytes (i.e., loaded bytes x shadow
// per byte) is either:
// - a multiple of 8 (common)
- // - equal to 4 (only for load32 in fast-8 mode)
+ // - equal to 4 (only for load32)
//
// For the second case, we can fit the wide shadow in a 32-bit integer. In all
// other cases, we use a 64-bit integer to hold the wide shadow.
@@ -2204,84 +2051,6 @@ std::pair<Value *, Value *> DFSanFunction::loadFast16ShadowFast(
: DFS.ZeroOrigin};
}
-Value *DFSanFunction::loadLegacyShadowFast(Value *ShadowAddr, uint64_t Size,
- Align ShadowAlign,
- Instruction *Pos) {
- // Fast path for the common case where each byte has identical shadow: load
- // shadow 64 (or 32) bits at a time, fall out to a __dfsan_union_load call if
- // any shadow is non-equal.
- BasicBlock *FallbackBB = BasicBlock::Create(*DFS.Ctx, "", F);
- IRBuilder<> FallbackIRB(FallbackBB);
- CallInst *FallbackCall = FallbackIRB.CreateCall(
- DFS.DFSanUnionLoadFn, {ShadowAddr, ConstantInt::get(DFS.IntptrTy, Size)});
- FallbackCall->addAttribute(AttributeList::ReturnIndex, Attribute::ZExt);
-
- const uint64_t ShadowSize = Size * DFS.ShadowWidthBytes;
- assert(Size >= 4 && "Not large enough load size for fast path!");
-
- // Same as in loadFast16AShadowsFast. In the case of load32, we can fit the
- // wide shadow in a 32-bit integer instead.
- Type *WideShadowTy =
- ShadowSize == 4 ? Type::getInt32Ty(*DFS.Ctx) : Type::getInt64Ty(*DFS.Ctx);
-
- // Compare each of the shadows stored in the loaded 64 bits to each other,
- // by computing (WideShadow rotl ShadowWidthBits) == WideShadow.
- IRBuilder<> IRB(Pos);
- unsigned WideShadowBitWidth = WideShadowTy->getIntegerBitWidth();
- Value *WideAddr = IRB.CreateBitCast(ShadowAddr, WideShadowTy->getPointerTo());
- Value *WideShadow =
- IRB.CreateAlignedLoad(WideShadowTy, WideAddr, ShadowAlign);
- Value *TruncShadow = IRB.CreateTrunc(WideShadow, DFS.PrimitiveShadowTy);
- Value *ShlShadow = IRB.CreateShl(WideShadow, DFS.ShadowWidthBits);
- Value *ShrShadow =
- IRB.CreateLShr(WideShadow, WideShadowBitWidth - DFS.ShadowWidthBits);
- Value *RotShadow = IRB.CreateOr(ShlShadow, ShrShadow);
- Value *ShadowsEq = IRB.CreateICmpEQ(WideShadow, RotShadow);
-
- BasicBlock *Head = Pos->getParent();
- BasicBlock *Tail = Head->splitBasicBlock(Pos->getIterator());
-
- if (DomTreeNode *OldNode = DT.getNode(Head)) {
- std::vector<DomTreeNode *> Children(OldNode->begin(), OldNode->end());
-
- DomTreeNode *NewNode = DT.addNewBlock(Tail, Head);
- for (auto *Child : Children)
- DT.changeImmediateDominator(Child, NewNode);
- }
-
- // In the following code LastBr will refer to the previous basic block's
- // conditional branch instruction, whose true successor is fixed up to point
- // to the next block during the loop below or to the tail after the final
- // iteration.
- BranchInst *LastBr = BranchInst::Create(FallbackBB, FallbackBB, ShadowsEq);
- ReplaceInstWithInst(Head->getTerminator(), LastBr);
- DT.addNewBlock(FallbackBB, Head);
-
- const uint64_t BytesPerWideShadow = WideShadowBitWidth / DFS.ShadowWidthBits;
-
- for (uint64_t ByteOfs = BytesPerWideShadow; ByteOfs < Size;
- ByteOfs += BytesPerWideShadow) {
- BasicBlock *NextBB = BasicBlock::Create(*DFS.Ctx, "", F);
- DT.addNewBlock(NextBB, LastBr->getParent());
- IRBuilder<> NextIRB(NextBB);
- WideAddr = NextIRB.CreateGEP(WideShadowTy, WideAddr,
- ConstantInt::get(DFS.IntptrTy, 1));
- Value *NextWideShadow =
- NextIRB.CreateAlignedLoad(WideShadowTy, WideAddr, ShadowAlign);
- ShadowsEq = NextIRB.CreateICmpEQ(WideShadow, NextWideShadow);
- LastBr->setSuccessor(0, NextBB);
- LastBr = NextIRB.CreateCondBr(ShadowsEq, FallbackBB, FallbackBB);
- }
-
- LastBr->setSuccessor(0, Tail);
- FallbackIRB.CreateBr(Tail);
- PHINode *Shadow =
- PHINode::Create(DFS.PrimitiveShadowTy, 2, "", &Tail->front());
- Shadow->addIncoming(FallbackCall, FallbackBB);
- Shadow->addIncoming(TruncShadow, LastBr->getParent());
- return Shadow;
-}
-
std::pair<Value *, Value *> DFSanFunction::loadShadowOriginSansLoadTracking(
Value *Addr, uint64_t Size, Align InstAlignment, Instruction *Pos) {
const bool ShouldTrackOrigins = DFS.shouldTrackOrigins();
@@ -2369,21 +2138,14 @@ std::pair<Value *, Value *> DFSanFunction::loadShadowOriginSansLoadTracking(
}
}
bool HasSizeForFastPath = DFS.hasLoadSizeForFastPath(Size);
- bool HasFastLabelsEnabled = DFS.hasFastLabelsEnabled();
-
- if (HasFastLabelsEnabled && HasSizeForFastPath)
- return loadFast16ShadowFast(ShadowAddr, OriginAddr, Size, ShadowAlign,
- OriginAlign, Origin, Pos);
- if (!AvoidNewBlocks && HasSizeForFastPath)
- return {loadLegacyShadowFast(ShadowAddr, Size, ShadowAlign, Pos), Origin};
+ if (HasSizeForFastPath)
+ return loadShadowFast(ShadowAddr, OriginAddr, Size, ShadowAlign,
+ OriginAlign, Origin, Pos);
IRBuilder<> IRB(Pos);
- FunctionCallee &UnionLoadFn = HasFastLabelsEnabled
- ? DFS.DFSanUnionLoadFastLabelsFn
- : DFS.DFSanUnionLoadFn;
CallInst *FallbackCall = IRB.CreateCall(
- UnionLoadFn, {ShadowAddr, ConstantInt::get(DFS.IntptrTy, Size)});
+ DFS.DFSanUnionLoadFn, {ShadowAddr, ConstantInt::get(DFS.IntptrTy, Size)});
FallbackCall->addAttribute(AttributeList::ReturnIndex, Attribute::ZExt);
return {FallbackCall, Origin};
}
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/abilist.ll b/llvm/test/Instrumentation/DataFlowSanitizer/abilist.ll
index 11a09af8dc00e..3750ce346586b 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/abilist.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/abilist.ll
@@ -1,6 +1,4 @@
; RUN: opt < %s -dfsan -dfsan-args-abi -dfsan-abilist=%S/Inputs/abilist.txt -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -dfsan-args-abi -dfsan-abilist=%S/Inputs/abilist.txt -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels=true -dfsan-args-abi -dfsan-abilist=%S/Inputs/abilist.txt -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/abilist_aggregate.ll b/llvm/test/Instrumentation/DataFlowSanitizer/abilist_aggregate.ll
index 6d59e96a94019..b1e60c6fd0d04 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/abilist_aggregate.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/abilist_aggregate.ll
@@ -1,6 +1,4 @@
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -dfsan-abilist=%S/Inputs/abilist.txt -S | FileCheck %s --check-prefixes=CHECK,TLS_ABI
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels=true -dfsan-abilist=%S/Inputs/abilist.txt -S | FileCheck %s --check-prefixes=CHECK,TLS_ABI
-; RUN: opt < %s -dfsan -dfsan-abilist=%S/Inputs/abilist.txt -S | FileCheck %s --check-prefixes=CHECK,LEGACY
+; RUN: opt < %s -dfsan -dfsan-abilist=%S/Inputs/abilist.txt -S | FileCheck %s --check-prefixes=CHECK,TLS_ABI
; RUN: opt < %s -dfsan -dfsan-args-abi -dfsan-abilist=%S/Inputs/abilist.txt -S | FileCheck %s --check-prefixes=CHECK,ARGS_ABI
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@@ -33,19 +31,12 @@ define {i1, i7} @call_functional({i32, i1} %a, [2 x i7] %b) {
; TLS_ABI-NEXT: %[[#REG+10]] = insertvalue { i[[#SBITS]], i[[#SBITS]] } %[[#REG+9]], i[[#SBITS]] %[[#REG+8]], 1
; TLS_ABI: store { i[[#SBITS]], i[[#SBITS]] } %[[#REG+10]], { i[[#SBITS]], i[[#SBITS]] }* bitcast ([100 x i64]* @__dfsan_retval_tls to { i[[#SBITS]], i[[#SBITS]] }*), align [[ALIGN]]
- ; LEGACY: @"dfs$call_functional"
- ; LEGACY: [[B:%.*]] = load i[[#SBITS]], i[[#SBITS]]* inttoptr (i64 add (i64 ptrtoint ([100 x i64]* @__dfsan_arg_tls to i64), i64 2) to i[[#SBITS]]*), align [[ALIGN:2]]
- ; LEGACY: [[A:%.*]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([100 x i64]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; LEGACY: [[U:%.*]] = call zeroext i[[#SBITS]] @__dfsan_union(i[[#SBITS]] zeroext [[A]], i[[#SBITS]] zeroext [[B]])
- ; LEGACY: [[PH:%.*]] = phi i[[#SBITS]] [ [[U]], {{.*}} ], [ [[A]], {{.*}} ]
- ; LEGACY: store i[[#SBITS]] [[PH]], i[[#SBITS]]* bitcast ([100 x i64]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
-
- ; ARGS_ABI: @"dfs$call_functional"
- ; ARGS_ABI: [[U:%.*]] = call zeroext i[[#SBITS]] @__dfsan_union(i[[#SBITS]] zeroext %2, i[[#SBITS]] zeroext %3)
- ; ARGS_ABI: [[PH:%.*]] = phi i[[#SBITS]] [ %7, {{.*}} ], [ %2, {{.*}} ]
- ; ARGS_ABI: [[R0:%.*]] = insertvalue { { i1, i7 }, i[[#SBITS]] } undef, { i1, i7 } %r, 0
- ; ARGS_ABI: [[R1:%.*]] = insertvalue { { i1, i7 }, i[[#SBITS]] } [[R0]], i[[#SBITS]] [[PH]], 1
- ; ARGS_ABI: ret { { i1, i7 }, i[[#SBITS]] } [[R1]]
+ ; ARGS_ABI: @"dfs$call_functional"({ i32, i1 } %0, [2 x i7] %1, i[[#SBITS]] %2, i[[#SBITS]] %3)
+ ; ARGS_ABI: %[[#U:]] = or i[[#SBITS]] %2, %3
+ ; ARGS_ABI: %r = call { i1, i7 } @functional({ i32, i1 } %0, [2 x i7] %1)
+ ; ARGS_ABI: %[[#R:]] = insertvalue { { i1, i7 }, i[[#SBITS]] } undef, { i1, i7 } %r, 0
+ ; ARGS_ABI: %[[#R+1]] = insertvalue { { i1, i7 }, i[[#SBITS]] } %[[#R]], i[[#SBITS]] %[[#U]], 1
+ ; ARGS_ABI: ret { { i1, i7 }, i[[#SBITS]] } %[[#R+1]]
%r = call {i1, i7} @functional({i32, i1} %a, [2 x i7] %b)
ret {i1, i7} %r
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/arith.ll b/llvm/test/Instrumentation/DataFlowSanitizer/arith.ll
index a574c90917611..499d478c59383 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/arith.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/arith.ll
@@ -7,13 +7,12 @@ target triple = "x86_64-unknown-linux-gnu"
define i8 @add(i8 %a, i8 %b) {
; CHECK: @"dfs$add"
- ; CHECK-DAG: %[[ALABEL:.*]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[ARGTLSTYPE:\[100 x i64\]]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN:2]]
- ; CHECK-DAG: %[[BLABEL:.*]] = load i[[#SBITS]], i[[#SBITS]]* inttoptr (i64 add (i64 ptrtoint ([[ARGTLSTYPE]]* @__dfsan_arg_tls to i64), i64 2) to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK: %[[UNION:.*]] = call zeroext i[[#SBITS]] @__dfsan_union(i[[#SBITS]] zeroext %[[ALABEL]], i[[#SBITS]] zeroext %[[BLABEL]])
- ; CHECK: %[[ADDLABEL:.*]] = phi i[[#SBITS]] [ %[[UNION]], {{.*}} ], [ %[[ALABEL]], {{.*}} ]
- ; CHECK: add i8
- ; CHECK: store i[[#SBITS]] %[[ADDLABEL]], i[[#SBITS]]* bitcast ([100 x i64]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK: ret i8
+ ; CHECK-DAG: %[[#ALABEL:]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[ARGTLSTYPE:\[100 x i64\]]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN:2]]
+ ; CHECK-DAG: %[[#BLABEL:]] = load i[[#SBITS]], i[[#SBITS]]* inttoptr (i64 add (i64 ptrtoint ([[ARGTLSTYPE]]* @__dfsan_arg_tls to i64), i64 2) to i[[#SBITS]]*), align [[ALIGN]]
+ ; CHECK: %[[#UNION:]] = or i[[#SBITS]] %[[#ALABEL]], %[[#BLABEL]]
+ ; CHECK: %c = add i8 %a, %b
+ ; CHECK: store i[[#SBITS]] %[[#UNION]], i[[#SBITS]]* bitcast ([100 x i64]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
+ ; CHECK: ret i8 %c
%c = add i8 %a, %b
ret i8 %c
}
@@ -22,10 +21,10 @@ define i8 @sub(i8 %a, i8 %b) {
; CHECK: @"dfs$sub"
; CHECK: load{{.*}}__dfsan_arg_tls
; CHECK: load{{.*}}__dfsan_arg_tls
- ; CHECK: call{{.*}}__dfsan_union
- ; CHECK: sub i8
+ ; CHECK: or i[[#SBITS]]
+ ; CHECK: %c = sub i8 %a, %b
; CHECK: store{{.*}}__dfsan_retval_tls
- ; CHECK: ret i8
+ ; CHECK: ret i8 %c
%c = sub i8 %a, %b
ret i8 %c
}
@@ -34,10 +33,10 @@ define i8 @mul(i8 %a, i8 %b) {
; CHECK: @"dfs$mul"
; CHECK: load{{.*}}__dfsan_arg_tls
; CHECK: load{{.*}}__dfsan_arg_tls
- ; CHECK: call{{.*}}__dfsan_union
- ; CHECK: mul i8
+ ; CHECK: or i[[#SBITS]]
+ ; CHECK: %c = mul i8 %a, %b
; CHECK: store{{.*}}__dfsan_retval_tls
- ; CHECK: ret i8
+ ; CHECK: ret i8 %c
%c = mul i8 %a, %b
ret i8 %c
}
@@ -46,10 +45,10 @@ define i8 @sdiv(i8 %a, i8 %b) {
; CHECK: @"dfs$sdiv"
; CHECK: load{{.*}}__dfsan_arg_tls
; CHECK: load{{.*}}__dfsan_arg_tls
- ; CHECK: call{{.*}}__dfsan_union
- ; CHECK: sdiv i8
+ ; CHECK: or i[[#SBITS]]
+ ; CHECK: %c = sdiv i8 %a, %b
; CHECK: store{{.*}}__dfsan_retval_tls
- ; CHECK: ret i8
+ ; CHECK: ret i8 %c
%c = sdiv i8 %a, %b
ret i8 %c
}
@@ -58,10 +57,10 @@ define i8 @udiv(i8 %a, i8 %b) {
; CHECK: @"dfs$udiv"
; CHECK: load{{.*}}__dfsan_arg_tls
; CHECK: load{{.*}}__dfsan_arg_tls
- ; CHECK: call{{.*}}__dfsan_union
- ; CHECK: udiv i8
+ ; CHECK: or i[[#SBITS]]
+ ; CHECK: %c = udiv i8 %a, %b
; CHECK: store{{.*}}__dfsan_retval_tls
- ; CHECK: ret i8
+ ; CHECK: ret i8 %c
%c = udiv i8 %a, %b
ret i8 %c
}
@@ -69,9 +68,9 @@ define i8 @udiv(i8 %a, i8 %b) {
define double @fneg(double %a) {
; CHECK: @"dfs$fneg"
; CHECK: load{{.*}}__dfsan_arg_tls
- ; CHECK: fneg double
+ ; CHECK: %c = fneg double %a
; CHECK: store{{.*}}__dfsan_retval_tls
- ; CHECK: ret double
+ ; CHECK: ret double %c
%c = fneg double %a
ret double %c
}
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/array.ll b/llvm/test/Instrumentation/DataFlowSanitizer/array.ll
index fc88061480d5c..654171bd1089b 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/array.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/array.ll
@@ -1,15 +1,9 @@
-; RUN: opt < %s -dfsan -S | FileCheck %s --check-prefixes=CHECK,LEGACY
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -dfsan-event-callbacks=true -S | FileCheck %s --check-prefixes=CHECK,EVENT_CALLBACKS
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels=true -dfsan-event-callbacks=true -S | FileCheck %s --check-prefixes=CHECK,EVENT_CALLBACKS
+; RUN: opt < %s -dfsan -dfsan-event-callbacks=true -S | FileCheck %s --check-prefixes=CHECK,EVENT_CALLBACKS
; RUN: opt < %s -dfsan -dfsan-args-abi -S | FileCheck %s --check-prefixes=CHECK,ARGS_ABI
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -S | FileCheck %s --check-prefixes=CHECK,FAST
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -dfsan-combine-pointer-labels-on-load=false -S | FileCheck %s --check-prefixes=CHECK,NO_COMBINE_LOAD_PTR
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -dfsan-combine-pointer-labels-on-store=true -S | FileCheck %s --check-prefixes=CHECK,COMBINE_STORE_PTR
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -dfsan-debug-nonzero-labels -S | FileCheck %s --check-prefixes=CHECK,DEBUG_NONZERO_LABELS
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels=true -S | FileCheck %s --check-prefixes=CHECK,FAST
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels=true -dfsan-combine-pointer-labels-on-load=false -S | FileCheck %s --check-prefixes=CHECK,NO_COMBINE_LOAD_PTR
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels=true -dfsan-combine-pointer-labels-on-store=true -S | FileCheck %s --check-prefixes=CHECK,COMBINE_STORE_PTR
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels=true -dfsan-debug-nonzero-labels -S | FileCheck %s --check-prefixes=CHECK,DEBUG_NONZERO_LABELS
+; RUN: opt < %s -dfsan -S | FileCheck %s --check-prefixes=CHECK,FAST
+; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-load=false -S | FileCheck %s --check-prefixes=CHECK,NO_COMBINE_LOAD_PTR
+; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-store=true -S | FileCheck %s --check-prefixes=CHECK,COMBINE_STORE_PTR
+; RUN: opt < %s -dfsan -dfsan-debug-nonzero-labels -S | FileCheck %s --check-prefixes=CHECK,DEBUG_NONZERO_LABELS
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@@ -102,13 +96,6 @@ define [1 x i1] @load_array1([1 x i1]* %p) {
; FAST: [[S1:%.*]] = insertvalue [1 x i[[#SBITS]]] undef, i[[#SBITS]] [[U]], 0
; FAST: store [1 x i[[#SBITS]]] [[S1]], [1 x i[[#SBITS]]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to [1 x i[[#SBITS]]]*), align [[ALIGN]]
- ; LEGACY: @"dfs$load_array1"
- ; LEGACY: [[P:%.*]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN:2]]
- ; LEGACY: [[L:%.*]] = load i[[#SBITS]], i[[#SBITS]]* {{.*}}, align [[#SBYTES]]
- ; LEGACY: [[U:%.*]] = call zeroext i[[#SBITS]] @__dfsan_union(i[[#SBITS]] zeroext [[L]], i[[#SBITS]] zeroext [[P]])
- ; LEGACY: [[PH:%.*]] = phi i[[#SBITS]] [ [[U]], {{.*}} ], [ [[L]], {{.*}} ]
- ; LEGACY: store i[[#SBITS]] [[PH]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
-
%a = load [1 x i1], [1 x i1]* %p
ret [1 x i1] %a
}
@@ -164,13 +151,6 @@ define [4 x i1] @load_array4([4 x i1]* %p) {
; FAST: [[S4:%.*]] = insertvalue [4 x i[[#SBITS]]] [[S3]], i[[#SBITS]] [[O]], 3
; FAST: store [4 x i[[#SBITS]]] [[S4]], [4 x i[[#SBITS]]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to [4 x i[[#SBITS]]]*), align 2
- ; LEGACY: @"dfs$load_array4"
- ; LEGACY: [[P:%.*]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN:2]]
- ; LEGACY: [[PH1:%.*]] = phi i[[#SBITS]]
- ; LEGACY: [[U:%.*]] = call zeroext i[[#SBITS]] @__dfsan_union(i[[#SBITS]] zeroext [[PH1]], i[[#SBITS]] zeroext [[P]])
- ; LEGACY: [[PH:%.*]] = phi i[[#SBITS]] [ [[U]], {{.*}} ], [ [[PH1]], {{.*}} ]
- ; LEGACY: store i[[#SBITS]] [[PH]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
-
%a = load [4 x i1], [4 x i1]* %p
ret [4 x i1] %a
}
@@ -220,13 +200,6 @@ define void @store_zero_array([4 x i1]* %p) {
}
define void @store_array2([2 x i1] %a, [2 x i1]* %p) {
- ; LEGACY: @"dfs$store_array2"
- ; LEGACY: [[S:%.*]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN:2]]
- ; LEGACY: [[SP0:%.*]] = getelementptr i[[#SBITS]], i[[#SBITS]]* [[SP:%.*]], i32 0
- ; LEGACY: store i[[#SBITS]] [[S]], i[[#SBITS]]* [[SP0]], align [[#SBYTES]]
- ; LEGACY: [[SP1:%.*]] = getelementptr i[[#SBITS]], i[[#SBITS]]* [[SP]], i32 1
- ; LEGACY: store i[[#SBITS]] [[S]], i[[#SBITS]]* [[SP1]], align [[#SBYTES]]
-
; EVENT_CALLBACKS: @"dfs$store_array2"
; EVENT_CALLBACKS: [[E12:%.*]] = or i[[#SBITS]]
; EVENT_CALLBACKS: [[P:%.*]] = bitcast [2 x i1]* %p to i8*
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/atomics.ll b/llvm/test/Instrumentation/DataFlowSanitizer/atomics.ll
index 31b3f5cc5efd1..4040c5086e80e 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/atomics.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/atomics.ll
@@ -1,9 +1,6 @@
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels=true -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -S | FileCheck %s --check-prefixes=CHECK,CHECK16
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-8-labels=true -S | FileCheck %s --check-prefixes=CHECK,CHECK_ORIGIN
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-8-labels=true -dfsan-instrument-with-call-threshold=0 -S | FileCheck %s --check-prefixes=CHECK,CHECK_ORIGIN
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-16-labels=true -S | FileCheck %s --check-prefixes=CHECK,CHECK16,CHECK_ORIGIN
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-16-labels=true -dfsan-instrument-with-call-threshold=0 -S | FileCheck %s --check-prefixes=CHECK,CHECK16,CHECK_ORIGIN
+; RUN: opt < %s -dfsan -S | FileCheck %s
+; RUN: opt < %s -dfsan -dfsan-track-origins=1 -S | FileCheck %s --check-prefixes=CHECK,CHECK_ORIGIN
+; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-instrument-with-call-threshold=0 -S | FileCheck %s --check-prefixes=CHECK,CHECK_ORIGIN
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@@ -21,7 +18,6 @@ entry:
; CHECK-NOT: @__dfsan_arg_tls
; CHECK: %[[#INTP:]] = ptrtoint i32* %p to i64
; CHECK-NEXT: %[[#SHADOW_ADDR:INTP+1]] = and i64 %[[#INTP]], [[#%.10d,MASK:]]
- ; CHECK16-NEXT: %[[#SHADOW_ADDR:INTP+2]] = mul i64 %[[#INTP+1]], 2
; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
; CHECK-NEXT: %[[#SHADOW_PTR64:]] = bitcast i[[#SBITS]]* %[[#SHADOW_PTR]] to i[[#NUM_BITS:mul(SBITS,4)]]*
; CHECK-NEXT: store i[[#NUM_BITS]] 0, i[[#NUM_BITS]]* %[[#SHADOW_PTR64]], align [[#SBYTES]]
@@ -42,7 +38,6 @@ define i32 @AtomicRmwMax(i32* %p, i32 %x) {
; CHECK-NOT: @__dfsan_arg_tls
; CHECK: %[[#INTP:]] = ptrtoint i32* %p to i64
; CHECK-NEXT: %[[#SHADOW_ADDR:INTP+1]] = and i64 %[[#INTP]], [[#%.10d,MASK:]]
- ; CHECK16-NEXT: %[[#SHADOW_ADDR:INTP+2]] = mul i64 %[[#INTP+1]], 2
; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
; CHECK-NEXT: %[[#SHADOW_PTR64:]] = bitcast i[[#SBITS]]* %[[#SHADOW_PTR]] to i[[#NUM_BITS:mul(SBITS,4)]]*
; CHECK-NEXT: store i[[#NUM_BITS]] 0, i[[#NUM_BITS]]* %[[#SHADOW_PTR64]], align [[#SBYTES]]
@@ -65,7 +60,6 @@ define i32 @Cmpxchg(i32* %p, i32 %a, i32 %b) {
; CHECK-NOT: @__dfsan_arg_tls
; CHECK: %[[#INTP:]] = ptrtoint i32* %p to i64
; CHECK-NEXT: %[[#SHADOW_ADDR:INTP+1]] = and i64 %[[#INTP]], [[#%.10d,MASK:]]
- ; CHECK16-NEXT: %[[#SHADOW_ADDR:INTP+2]] = mul i64 %[[#INTP+1]], 2
; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
; CHECK-NEXT: %[[#SHADOW_PTR64:]] = bitcast i[[#SBITS]]* %[[#SHADOW_PTR]] to i[[#NUM_BITS:mul(SBITS,4)]]*
; CHECK-NEXT: store i[[#NUM_BITS]] 0, i[[#NUM_BITS]]* %[[#SHADOW_PTR64]], align [[#SBYTES]]
@@ -89,7 +83,6 @@ define i32 @CmpxchgMonotonic(i32* %p, i32 %a, i32 %b) {
; CHECK-NOT: @__dfsan_arg_tls
; CHECK: %[[#INTP:]] = ptrtoint i32* %p to i64
; CHECK-NEXT: %[[#SHADOW_ADDR:INTP+1]] = and i64 %[[#INTP]], [[#%.10d,MASK:]]
- ; CHECK16-NEXT: %[[#SHADOW_ADDR:INTP+2]] = mul i64 %[[#INTP+1]], 2
; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
; CHECK-NEXT: %[[#SHADOW_PTR64:]] = bitcast i[[#SBITS]]* %[[#SHADOW_PTR]] to i[[#NUM_BITS:mul(SBITS,4)]]*
; CHECK-NEXT: store i[[#NUM_BITS]] 0, i[[#NUM_BITS]]* %[[#SHADOW_PTR64]], align [[#SBYTES]]
@@ -213,7 +206,6 @@ define void @AtomicStore(i32* %p, i32 %x) {
; CHECK_ORIGIN-NOT: 35184372088832
; CHECK: %[[#INTP:]] = ptrtoint i32* %p to i64
; CHECK-NEXT: %[[#SHADOW_ADDR:INTP+1]] = and i64 %[[#INTP]], [[#%.10d,MASK:]]
- ; CHECK16-NEXT: %[[#SHADOW_ADDR:INTP+2]] = mul i64 %[[#INTP+1]], 2
; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
; CHECK-NEXT: %[[#SHADOW_PTR64:]] = bitcast i[[#SBITS]]* %[[#SHADOW_PTR]] to i[[#NUM_BITS:mul(SBITS,4)]]*
; CHECK-NEXT: store i[[#NUM_BITS]] 0, i[[#NUM_BITS]]* %[[#SHADOW_PTR64]], align [[#SBYTES]]
@@ -234,7 +226,6 @@ define void @AtomicStoreRelease(i32* %p, i32 %x) {
; CHECK_ORIGIN-NOT: 35184372088832
; CHECK: %[[#INTP:]] = ptrtoint i32* %p to i64
; CHECK-NEXT: %[[#SHADOW_ADDR:INTP+1]] = and i64 %[[#INTP]], [[#%.10d,MASK:]]
- ; CHECK16-NEXT: %[[#SHADOW_ADDR:INTP+2]] = mul i64 %[[#INTP+1]], 2
; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
; CHECK-NEXT: %[[#SHADOW_PTR64:]] = bitcast i[[#SBITS]]* %[[#SHADOW_PTR]] to i[[#NUM_BITS:mul(SBITS,4)]]*
; CHECK-NEXT: store i[[#NUM_BITS]] 0, i[[#NUM_BITS]]* %[[#SHADOW_PTR64]], align [[#SBYTES]]
@@ -255,7 +246,6 @@ define void @AtomicStoreMonotonic(i32* %p, i32 %x) {
; CHECK_ORIGIN-NOT: 35184372088832
; CHECK: %[[#INTP:]] = ptrtoint i32* %p to i64
; CHECK-NEXT: %[[#SHADOW_ADDR:INTP+1]] = and i64 %[[#INTP]], [[#%.10d,MASK:]]
- ; CHECK16-NEXT: %[[#SHADOW_ADDR:INTP+2]] = mul i64 %[[#INTP+1]], 2
; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
; CHECK-NEXT: %[[#SHADOW_PTR64:]] = bitcast i[[#SBITS]]* %[[#SHADOW_PTR]] to i[[#NUM_BITS:mul(SBITS,4)]]*
; CHECK-NEXT: store i[[#NUM_BITS]] 0, i[[#NUM_BITS]]* %[[#SHADOW_PTR64]], align [[#SBYTES]]
@@ -276,7 +266,6 @@ define void @AtomicStoreUnordered(i32* %p, i32 %x) {
; CHECK_ORIGIN-NOT: 35184372088832
; CHECK: %[[#INTP:]] = ptrtoint i32* %p to i64
; CHECK-NEXT: %[[#SHADOW_ADDR:INTP+1]] = and i64 %[[#INTP]], [[#%.10d,MASK:]]
- ; CHECK16-NEXT: %[[#SHADOW_ADDR:INTP+2]] = mul i64 %[[#INTP+1]], 2
; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
; CHECK-NEXT: %[[#SHADOW_PTR64:]] = bitcast i[[#SBITS]]* %[[#SHADOW_PTR]] to i[[#NUM_BITS:mul(SBITS,4)]]*
; CHECK-NEXT: store i[[#NUM_BITS]] 0, i[[#NUM_BITS]]* %[[#SHADOW_PTR64]], align [[#SBYTES]]
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/basic.ll b/llvm/test/Instrumentation/DataFlowSanitizer/basic.ll
index 0fa1569617b2f..38d8331e6e89c 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/basic.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/basic.ll
@@ -1,6 +1,5 @@
-; RUN: opt < %s -dfsan -S | FileCheck %s --check-prefixes=CHECK,CHECK_NO_ORIGIN -DSHADOW_MASK=-123145302310913
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-16-labels=true -S | FileCheck %s --check-prefixes=CHECK,CHECK_ORIGIN -DSHADOW_MASK=-123145302310913
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-8-labels=true -S | FileCheck %s --check-prefixes=CHECK,CHECK_ORIGIN -DSHADOW_MASK=-105553116266497
+; RUN: opt < %s -dfsan -S | FileCheck %s --check-prefixes=CHECK,CHECK_NO_ORIGIN -DSHADOW_MASK=-105553116266497 --dump-input-context=100
+; RUN: opt < %s -dfsan -dfsan-track-origins=1 -S | FileCheck %s --check-prefixes=CHECK,CHECK_ORIGIN -DSHADOW_MASK=-105553116266497 --dump-input-context=100
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@@ -35,20 +34,11 @@ define void @store(i8* %p) {
; CHECK: declare void @__dfsan_mem_transfer_callback(i[[#SBITS]]*, i64)
; CHECK: declare void @__dfsan_cmp_callback(i[[#SBITS]])
-; CHECK: ; Function Attrs: nounwind readnone
-; CHECK-NEXT: declare zeroext i[[#SBITS]] @__dfsan_union(i[[#SBITS]] zeroext, i[[#SBITS]] zeroext) #0
-
-; CHECK: ; Function Attrs: nounwind readnone
-; CHECK-NEXT: declare zeroext i[[#SBITS]] @dfsan_union(i[[#SBITS]] zeroext, i[[#SBITS]] zeroext) #0
-
-; CHECK: ; Function Attrs: nounwind readonly
-; CHECK-NEXT: declare zeroext i[[#SBITS]] @__dfsan_union_load(i[[#SBITS]]*, i64) #1
-
; CHECK: ; Function Attrs: nounwind readonly
-; CHECK-NEXT: declare zeroext i[[#SBITS]] @__dfsan_union_load_fast16labels(i[[#SBITS]]*, i64) #1
+; CHECK-NEXT: declare zeroext i[[#SBITS]] @__dfsan_union_load(i[[#SBITS]]*, i64)
; CHECK: ; Function Attrs: nounwind readonly
-; CHECK-NEXT: declare zeroext i64 @__dfsan_load_label_and_origin(i8*, i64) #1
+; CHECK-NEXT: declare zeroext i64 @__dfsan_load_label_and_origin(i8*, i64)
; CHECK: declare void @__dfsan_unimplemented(i8*)
; CHECK: declare void @__dfsan_set_label(i[[#SBITS]] zeroext, i32 zeroext, i8*, i64)
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/call.ll b/llvm/test/Instrumentation/DataFlowSanitizer/call.ll
index bb47d8c6ba30a..feb8ff6910581 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/call.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/call.ll
@@ -1,6 +1,4 @@
; RUN: opt < %s -dfsan -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels -S | FileCheck %s
; RUN: opt < %s -passes=dfsan -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/dont_combine_offset_labels_on_gep.ll b/llvm/test/Instrumentation/DataFlowSanitizer/dont_combine_offset_labels_on_gep.ll
index 5fe63538a36f6..3b74138aae216 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/dont_combine_offset_labels_on_gep.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/dont_combine_offset_labels_on_gep.ll
@@ -1,5 +1,5 @@
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-combine-offset-labels-on-gep=false -dfsan-fast-8-labels=true -S | FileCheck %s --check-prefixes=CHECK,CHECK_ORIGIN
-; RUN: opt < %s -dfsan -dfsan-combine-offset-labels-on-gep=false -dfsan-fast-8-labels=true -S | FileCheck %s
+; RUN: opt < %s -dfsan -dfsan-combine-offset-labels-on-gep=false -S | FileCheck %s
+; RUN: opt < %s -dfsan -dfsan-combine-offset-labels-on-gep=false -dfsan-track-origins=1 -S | FileCheck %s --check-prefixes=CHECK,CHECK_ORIGIN
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/external_mask.ll b/llvm/test/Instrumentation/DataFlowSanitizer/external_mask.ll
index 2b5cd5e3065c4..26491f50a00f2 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/external_mask.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/external_mask.ll
@@ -1,15 +1,12 @@
-; RUN: opt < %s -dfsan -S | FileCheck %s --check-prefixes=CHECK,CHECK16
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -S | FileCheck %s --check-prefixes=CHECK,CHECK16
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels=true -S | FileCheck %s --check-prefixes=CHECK
+; RUN: opt < %s -dfsan -S | FileCheck %s
target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
target triple = "aarch64-unknown-linux-gnu"
define i32 @test(i32 %a, i32* nocapture readonly %b) #0 {
-; CHECK: @"dfs$test"
-; CHECK: %[[RV:.*]] load{{.*}}__dfsan_shadow_ptr_mask
-; CHECK: ptrtoint i32* {{.*}} to i64
-; CHECK: and {{.*}}%[[RV:.*]]
-; CHECK16: mul i64
+ ; CHECK: @"dfs$test"
+ ; CHECK: %[[RV:.*]] load{{.*}}__dfsan_shadow_ptr_mask
+ ; CHECK: ptrtoint i32* {{.*}} to i64
+ ; CHECK: and {{.*}}%[[RV:.*]]
%1 = load i32, i32* %b, align 4
%2 = add nsw i32 %1, %a
ret i32 %2
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/fast16labels.ll b/llvm/test/Instrumentation/DataFlowSanitizer/fast16labels.ll
deleted file mode 100644
index c6b998fb28e65..0000000000000
--- a/llvm/test/Instrumentation/DataFlowSanitizer/fast16labels.ll
+++ /dev/null
@@ -1,172 +0,0 @@
-; Test that -dfsan-fast-16-labels mode uses inline ORs rather than calling
-; __dfsan_union or __dfsan_union_load.
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels -S | FileCheck %s --implicit-check-not="call{{.*}}__dfsan_union" --check-prefixes=CHECK,CHECK16
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels -S | FileCheck %s --implicit-check-not="call{{.*}}__dfsan_union" --check-prefixes=CHECK,CHECK8
-target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
-
-; CHECK: @__dfsan_arg_tls = external thread_local(initialexec) global [[TLS_ARR:\[100 x i64\]]]
-; CHECK: @__dfsan_retval_tls = external thread_local(initialexec) global [[TLS_ARR]]
-; CHECK: @__dfsan_shadow_width_bits = weak_odr constant i32 [[#SBITS:]]
-; CHECK: @__dfsan_shadow_width_bytes = weak_odr constant i32 [[#SBYTES:]]
-
-define i8 @add(i8 %a, i8 %b) {
- ; CHECK-LABEL: define i8 @"dfs$add"
- ; CHECK-DAG: %[[ALABEL:.*]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN:2]]
- ; CHECK-DAG: %[[BLABEL:.*]] = load i[[#SBITS]], i[[#SBITS]]* inttoptr (i64 add (i64 ptrtoint ([[TLS_ARR]]* @__dfsan_arg_tls to i64), i64 2) to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK: %[[ADDLABEL:.*]] = or i[[#SBITS]] %[[ALABEL]], %[[BLABEL]]
- ; CHECK: %c = add i8 %a, %b
- ; CHECK: store i[[#SBITS]] %[[ADDLABEL]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK: ret i8 %c
- %c = add i8 %a, %b
- ret i8 %c
-}
-
-define i8 @load8(i8* %p) {
- ; CHECK-LABEL: define i8 @"dfs$load8"
- ; CHECK-SAME: (i8* %[[PADDR:.*]])
- ; CHECK-NEXT: %[[#ARG:]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK-NEXT: %[[#R:]] = ptrtoint i8* %[[PADDR]] to i64
- ; CHECK-NEXT: %[[#PS:R+1]] = and i64 %[[#R]], [[#%.10d,MASK:]]
- ; CHECK16-NEXT: %[[#PS:R+2]] = mul i64 %[[#R+1]], 2
- ; CHECK-NEXT: %[[#SADDR:]] = inttoptr i64 %[[#PS]] to i[[#SBITS]]*
- ; CHECK-NEXT: %[[#S:]] = load i[[#SBITS]], i[[#SBITS]]* %[[#SADDR]]
- ; CHECK-NEXT: %[[#S_OUT:S+1]] = or i[[#SBITS]] %[[#S]], %[[#ARG]]
- ; CHECK-NEXT: %a = load i8, i8* %p
- ; CHECK-NEXT: store i[[#SBITS]] %[[#S_OUT]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK-NEXT: ret i8 %a
-
- %a = load i8, i8* %p
- ret i8 %a
-}
-
-define i16 @load16(i16* %p) {
- ; CHECK-LABEL: define i16 @"dfs$load16"
- ; CHECK-SAME: (i16* %[[PADDR:.*]])
- ; CHECK-NEXT: %[[#ARG:]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK-NEXT: %[[#R:]] = ptrtoint i16* %[[PADDR]] to i64
- ; CHECK-NEXT: %[[#PS:R+1]] = and i64 %[[#R]], [[#%.10d,MASK:]]
- ; CHECK16-NEXT: %[[#PS:R+2]] = mul i64 %[[#R+1]], 2
- ; CHECK-NEXT: %[[#SADDR:]] = inttoptr i64 %[[#PS]] to i[[#SBITS]]*
- ; CHECK-NEXT: %[[#SADDR+1]] = getelementptr i[[#SBITS]], i[[#SBITS]]* %[[#SADDR]], i64 1
- ; CHECK-NEXT: %[[#S:]] = load i[[#SBITS]], i[[#SBITS]]* %[[#SADDR]]
- ; CHECK-NEXT: %[[#S+1]] = load i[[#SBITS]], i[[#SBITS]]* %[[#SADDR+1]]
- ; CHECK-NEXT: %[[#S+2]] = or i[[#SBITS]] %[[#S]], %[[#S+1]]
- ; CHECK-NEXT: %[[#S_OUT:S+3]] = or i[[#SBITS]] %[[#S+2]], %[[#ARG]]
- ; CHECK-NEXT: %a = load i16, i16* %p
- ; CHECK-NEXT: store i[[#SBITS]] %[[#S_OUT]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK-NEXT: ret i16 %a
-
- %a = load i16, i16* %p
- ret i16 %a
-}
-
-define i32 @load32(i32* %p) {
- ; CHECK-LABEL: define i32 @"dfs$load32"
- ; CHECK-SAME: (i32* %[[PADDR:.*]])
- ; CHECK-NEXT: %[[#ARG:]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK-NEXT: %[[#R:]] = ptrtoint i32* %[[PADDR]] to i64
- ; CHECK-NEXT: %[[#PS:R+1]] = and i64 %[[#R]], [[#%.10d,MASK:]]
- ; CHECK16-NEXT: %[[#PS:R+2]] = mul i64 %[[#R+1]], 2
- ; CHECK-NEXT: %[[#SADDR:]] = inttoptr i64 %[[#PS]] to i[[#SBITS]]*
- ; CHECK-NEXT: %[[#SADDR+1]] = bitcast i[[#SBITS]]* %[[#SADDR]] to i[[#WBITS:mul(SBITS,4)]]*
- ; CHECK-NEXT: %[[#WS:]] = load i[[#WBITS]], i[[#WBITS]]* %[[#SADDR+1]]
- ; CHECK-NEXT: %[[#WS+1]] = lshr i[[#WBITS]] %[[#WS]], [[#mul(SBITS,2)]]
- ; CHECK-NEXT: %[[#WS+2]] = or i[[#WBITS]] %[[#WS]], %[[#WS+1]]
- ; CHECK-NEXT: %[[#WS+3]] = lshr i[[#WBITS]] %[[#WS+2]], [[#SBITS]]
- ; CHECK-NEXT: %[[#WS+4]] = or i[[#WBITS]] %[[#WS+2]], %[[#WS+3]]
- ; CHECK-NEXT: %[[#WS+5]] = trunc i[[#WBITS]] %[[#WS+4]] to i[[#SBITS]]
- ; CHECK-NEXT: %[[#S_OUT:WS+6]] = or i[[#SBITS]] %[[#WS+5]], %[[#ARG]]
- ; CHECK-NEXT: %a = load i32, i32* %p
- ; CHECK-NEXT: store i[[#SBITS]] %[[#S_OUT]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK-NEXT: ret i32 %a
-
- %a = load i32, i32* %p
- ret i32 %a
-}
-
-define i64 @load64(i64* %p) {
- ; CHECK-LABEL: define i64 @"dfs$load64"
- ; CHECK-SAME: (i64* %[[PADDR:.*]])
- ; CHECK-NEXT: %[[#ARG:]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK-NEXT: %[[#R:]] = ptrtoint i64* %[[PADDR]] to i64
- ; CHECK-NEXT: %[[#PS:R+1]] = and i64 %[[#R]], [[#%.10d,MASK:]]
- ; CHECK16-NEXT: %[[#PS:R+2]] = mul i64 %[[#R+1]], 2
- ; CHECK-NEXT: %[[#SADDR:]] = inttoptr i64 %[[#PS]] to i[[#SBITS]]*
- ; CHECK-NEXT: %[[#SADDR+1]] = bitcast i[[#SBITS]]* %[[#SADDR]] to i64*
- ; CHECK-NEXT: %[[#WS:]] = load i64, i64* %[[#SADDR+1]]
-
- ; COMM: On fast16, the 2x64 shadow bits need to be ORed first.
- ; CHECK16-NEXT: %[[#SADDR_NEXT:]] = getelementptr i64, i64* %[[#SADDR+1]], i64 1
- ; CHECK16-NEXT: %[[#WS_NEXT:]] = load i64, i64* %[[#SADDR_NEXT]]
- ; CHECK16-NEXT: %[[#WS:]] = or i64 %[[#WS]], %[[#WS_NEXT]]
- ; CHECK16-NEXT: %[[#WS+1]] = lshr i64 %[[#WS]], 32
- ; CHECK16-NEXT: %[[#WS+2]] = or i64 %[[#WS]], %[[#WS+1]]
- ; CHECK16-NEXT: %[[#WS+3]] = lshr i64 %[[#WS+2]], 16
- ; CHECK16-NEXT: %[[#WS+4]] = or i64 %[[#WS+2]], %[[#WS+3]]
- ; CHECK16-NEXT: %[[#WS+5]] = trunc i64 %[[#WS+4]] to i[[#SBITS]]
- ; CHECK16-NEXT: %[[#S_OUT:]] = or i[[#SBITS]] %[[#WS+5]], %[[#ARG]]
-
- ; COMM: On fast8, no need to OR the wide shadow but one more shift is needed.
- ; CHECK8-NEXT: %[[#WS+1]] = lshr i64 %[[#WS]], 32
- ; CHECK8-NEXT: %[[#WS+2]] = or i64 %[[#WS]], %[[#WS+1]]
- ; CHECK8-NEXT: %[[#WS+3]] = lshr i64 %[[#WS+2]], 16
- ; CHECK8-NEXT: %[[#WS+4]] = or i64 %[[#WS+2]], %[[#WS+3]]
- ; CHECK8-NEXT: %[[#WS+5]] = lshr i64 %[[#WS+4]], 8
- ; CHECK8-NEXT: %[[#WS+6]] = or i64 %[[#WS+4]], %[[#WS+5]]
- ; CHECK8-NEXT: %[[#WS+7]] = trunc i64 %[[#WS+6]] to i[[#SBITS]]
- ; CHECK8-NEXT: %[[#S_OUT:]] = or i[[#SBITS]] %[[#WS+7]], %[[#ARG]]
-
- ; CHECK-NEXT: %a = load i64, i64* %p
- ; CHECK-NEXT: store i[[#SBITS]] %[[#S_OUT]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK-NEXT: ret i64 %a
-
- %a = load i64, i64* %p
- ret i64 %a
-}
-
-define i128 @load128(i128* %p) {
- ; CHECK-LABEL: define i128 @"dfs$load128"
- ; CHECK-SAME: (i128* %[[PADDR:.*]])
- ; CHECK-NEXT: %[[#ARG:]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK-NEXT: %[[#R:]] = ptrtoint i128* %[[PADDR]] to i64
- ; CHECK-NEXT: %[[#PS:R+1]] = and i64 %[[#R]], [[#%.10d,MASK:]]
- ; CHECK16-NEXT: %[[#PS:R+2]] = mul i64 %[[#R+1]], 2
- ; CHECK-NEXT: %[[#SADDR:]] = inttoptr i64 %[[#PS]] to i[[#SBITS]]*
- ; CHECK-NEXT: %[[#SADDR+1]] = bitcast i[[#SBITS]]* %[[#SADDR]] to i64*
- ; CHECK-NEXT: %[[#S:]] = load i64, i64* %[[#SADDR+1]]
- ; CHECK-NEXT: %[[#S+1]] = getelementptr i64, i64* %[[#SADDR+1]], i64 1
- ; CHECK-NEXT: %[[#S+2]] = load i64, i64* %[[#S+1]]
- ; CHECK-NEXT: %[[#WS:S+3]] = or i64 %[[#S]], %[[#S+2]]
-
- ; COMM: On fast16, we need to OR 4x64bits for the wide shadow, before ORing its bytes.
- ; CHECK16-NEXT: %[[#S+4]] = getelementptr i64, i64* %[[#S+1]], i64 1
- ; CHECK16-NEXT: %[[#S+5]] = load i64, i64* %[[#S+4]]
- ; CHECK16-NEXT: %[[#S+6]] = or i64 %[[#S+3]], %[[#S+5]]
- ; CHECK16-NEXT: %[[#S+7]] = getelementptr i64, i64* %[[#S+4]], i64 1
- ; CHECK16-NEXT: %[[#S+8]] = load i64, i64* %[[#S+7]]
- ; CHECK16-NEXT: %[[#WS:S+9]] = or i64 %[[#S+6]], %[[#S+8]]
- ; CHECK16-NEXT: %[[#WS+1]] = lshr i64 %[[#WS]], 32
- ; CHECK16-NEXT: %[[#WS+2]] = or i64 %[[#WS]], %[[#WS+1]]
- ; CHECK16-NEXT: %[[#WS+3]] = lshr i64 %[[#WS+2]], 16
- ; CHECK16-NEXT: %[[#WS+4]] = or i64 %[[#WS+2]], %[[#WS+3]]
- ; CHECK16-NEXT: %[[#WS+5]] = trunc i64 %[[#WS+4]] to i[[#SBITS]]
- ; CHECK16-NEXT: %[[#S_OUT:]] = or i[[#SBITS]] %[[#WS+5]], %[[#ARG]]
-
- ; COMM: On fast8, we need to OR 2x64bits for the wide shadow, before ORing its bytes (one more shift).
- ; CHECK8-NEXT: %[[#WS+1]] = lshr i64 %[[#WS]], 32
- ; CHECK8-NEXT: %[[#WS+2]] = or i64 %[[#WS]], %[[#WS+1]]
- ; CHECK8-NEXT: %[[#WS+3]] = lshr i64 %[[#WS+2]], 16
- ; CHECK8-NEXT: %[[#WS+4]] = or i64 %[[#WS+2]], %[[#WS+3]]
- ; CHECK8-NEXT: %[[#WS+5]] = lshr i64 %[[#WS+4]], 8
- ; CHECK8-NEXT: %[[#WS+6]] = or i64 %[[#WS+4]], %[[#WS+5]]
- ; CHECK8-NEXT: %[[#WS+7]] = trunc i64 %[[#WS+6]] to i[[#SBITS]]
- ; CHECK8-NEXT: %[[#S_OUT:]] = or i[[#SBITS]] %[[#WS+7]], %[[#ARG]]
-
- ; CHECK-NEXT: %a = load i128, i128* %p
- ; CHECK-NEXT: store i[[#SBITS]] %[[#S_OUT]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK-NEXT: ret i128 %a
-
- %a = load i128, i128* %p
- ret i128 %a
-}
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/load.ll b/llvm/test/Instrumentation/DataFlowSanitizer/load.ll
index 74f3f8bcee518..d8321a6b24b6f 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/load.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/load.ll
@@ -1,176 +1,156 @@
-; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-load=1 -S | FileCheck %s --check-prefix=COMBINE_PTR_LABEL
-; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-load=0 -S | FileCheck %s --check-prefix=NO_COMBINE_PTR_LABEL
+; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-load=true -S | FileCheck %s --check-prefixes=CHECK,COMBINE_LOAD_PTR
+; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-load=false -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
+; CHECK: @__dfsan_arg_tls = external thread_local(initialexec) global [[TLS_ARR:\[100 x i64\]]]
+; CHECK: @__dfsan_retval_tls = external thread_local(initialexec) global [[TLS_ARR]]
+; CHECK: @__dfsan_shadow_width_bits = weak_odr constant i32 [[#SBITS:]]
+; CHECK: @__dfsan_shadow_width_bytes = weak_odr constant i32 [[#SBYTES:]]
+
+
define {} @load0({}* %p) {
- ; COMBINE_PTR_LABEL: @"dfs$load0"
- ; COMBINE_PTR_LABEL: load
- ; COMBINE_PTR_LABEL-NOT: load
+ ; CHECK-LABEL: @"dfs$load0"
+ ; CHECK-NEXT: %a = load {}, {}* %p, align 1
+ ; CHECK-NEXT: store {} zeroinitializer, {}* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to {}*), align [[ALIGN:2]]
+ ; CHECK-NEXT: ret {} %a
- ; NO_COMBINE_PTR_LABEL: @"dfs$load0"
- ; NO_COMBINE_PTR_LABEL: load
- ; NO_COMBINE_PTR_LABEL-NOT: load
%a = load {}, {}* %p
ret {} %a
}
define i8 @load8(i8* %p) {
- ; COMBINE_PTR_LABEL: @"dfs$load8"
- ; COMBINE_PTR_LABEL: load i16, i16*
- ; COMBINE_PTR_LABEL: ptrtoint i8* {{.*}} to i64
- ; COMBINE_PTR_LABEL: and i64
- ; COMBINE_PTR_LABEL: mul i64
- ; COMBINE_PTR_LABEL: inttoptr i64
- ; COMBINE_PTR_LABEL: load i16, i16*
- ; COMBINE_PTR_LABEL: icmp ne i16
- ; COMBINE_PTR_LABEL: call zeroext i16 @__dfsan_union
- ; COMBINE_PTR_LABEL: load i8, i8*
- ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
- ; COMBINE_PTR_LABEL: ret i8
-
- ; NO_COMBINE_PTR_LABEL: @"dfs$load8"
- ; NO_COMBINE_PTR_LABEL: ptrtoint i8*
- ; NO_COMBINE_PTR_LABEL: and i64
- ; NO_COMBINE_PTR_LABEL: mul i64
- ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} to i16*
- ; NO_COMBINE_PTR_LABEL: load i16, i16*
- ; NO_COMBINE_PTR_LABEL: load i8, i8*
- ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
- ; NO_COMBINE_PTR_LABEL: ret i8
+ ; CHECK-LABEL: @"dfs$load8"
+ ; COMBINE_LOAD_PTR-NEXT: %[[#PS:]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
+ ; CHECK-NEXT: %[[#INTP:]] = ptrtoint i8* %p to i64
+ ; CHECK-NEXT: %[[#SHADOW_ADDR:]] = and i64 %[[#INTP]], [[#%.10d,MASK:]]
+ ; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
+ ; CHECK-NEXT: %[[#SHADOW:]] = load i[[#SBITS]], i[[#SBITS]]* %[[#SHADOW_PTR]]
+ ; COMBINE_LOAD_PTR-NEXT: %[[#SHADOW:]] = or i[[#SBITS]] %[[#SHADOW]], %[[#PS]]
+ ; CHECK-NEXT: %a = load i8, i8* %p
+ ; CHECK-NEXT: store i[[#SBITS]] %[[#SHADOW]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
+ ; CHECK-NEXT: ret i8 %a
%a = load i8, i8* %p
ret i8 %a
}
define i16 @load16(i16* %p) {
- ; COMBINE_PTR_LABEL: @"dfs$load16"
- ; COMBINE_PTR_LABEL: ptrtoint i16*
- ; COMBINE_PTR_LABEL: and i64
- ; COMBINE_PTR_LABEL: mul i64
- ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
- ; COMBINE_PTR_LABEL: getelementptr i16
- ; COMBINE_PTR_LABEL: load i16, i16*
- ; COMBINE_PTR_LABEL: load i16, i16*
- ; COMBINE_PTR_LABEL: icmp ne
- ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
- ; COMBINE_PTR_LABEL: icmp ne i16
- ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
- ; COMBINE_PTR_LABEL: load i16, i16*
- ; COMBINE_PTR_LABEL: store {{.*}} @__dfsan_retval_tls
- ; COMBINE_PTR_LABEL: ret i16
-
- ; NO_COMBINE_PTR_LABEL: @"dfs$load16"
- ; NO_COMBINE_PTR_LABEL: ptrtoint i16*
- ; NO_COMBINE_PTR_LABEL: and i64
- ; NO_COMBINE_PTR_LABEL: mul i64
- ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
- ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
- ; NO_COMBINE_PTR_LABEL: load i16, i16*
- ; NO_COMBINE_PTR_LABEL: load i16, i16*
- ; NO_COMBINE_PTR_LABEL: icmp ne i16
- ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
- ; NO_COMBINE_PTR_LABEL: load i16, i16*
- ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
- ; NO_COMBINE_PTR_LABEL: ret i16
+ ; CHECK-LABEL: @"dfs$load16"
+ ; COMBINE_LOAD_PTR-NEXT: %[[#PS:]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
+ ; CHECK-NEXT: %[[#INTP:]] = ptrtoint i16* %p to i64
+ ; CHECK-NEXT: %[[#SHADOW_ADDR:]] = and i64 %[[#INTP]], [[#MASK]]
+ ; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
+ ; CHECK-NEXT: %[[#SHADOW_PTR+1]] = getelementptr i[[#SBITS]], i[[#SBITS]]* %[[#SHADOW_PTR]], i64 1
+ ; CHECK-NEXT: %[[#SHADOW:]] = load i[[#SBITS]], i[[#SBITS]]* %[[#SHADOW_PTR]]
+ ; CHECK-NEXT: %[[#SHADOW+1]] = load i[[#SBITS]], i[[#SBITS]]* %[[#SHADOW_PTR+1]]
+
+ ; CHECK-NEXT: %[[#SHADOW:]] = or i[[#SBITS]] %[[#SHADOW]], %[[#SHADOW+1]]
+ ; COMBINE_LOAD_PTR-NEXT: %[[#SHADOW:]] = or i[[#SBITS]] %[[#SHADOW]], %[[#PS]]
+ ; CHECK-NEXT: %a = load i16, i16* %p
+ ; CHECK-NEXT: store i[[#SBITS]] %[[#SHADOW]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
+ ; CHECK-NEXT: ret i16 %a
%a = load i16, i16* %p
ret i16 %a
}
define i32 @load32(i32* %p) {
- ; COMBINE_PTR_LABEL: @"dfs$load32"
- ; COMBINE_PTR_LABEL: ptrtoint i32*
- ; COMBINE_PTR_LABEL: and i64
- ; COMBINE_PTR_LABEL: mul i64
- ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
- ; COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
- ; COMBINE_PTR_LABEL: load i64, i64*
- ; COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
- ; COMBINE_PTR_LABEL: shl i64
- ; COMBINE_PTR_LABEL: lshr i64
- ; COMBINE_PTR_LABEL: or i64
- ; COMBINE_PTR_LABEL: icmp eq i64
- ; COMBINE_PTR_LABEL: icmp ne i16
- ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
- ; COMBINE_PTR_LABEL: load i32, i32*
- ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
- ; COMBINE_PTR_LABEL: ret i32
- ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
-
- ; NO_COMBINE_PTR_LABEL: @"dfs$load32"
- ; NO_COMBINE_PTR_LABEL: ptrtoint i32*
- ; NO_COMBINE_PTR_LABEL: and i64
- ; NO_COMBINE_PTR_LABEL: mul i64
- ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
- ; NO_COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
- ; NO_COMBINE_PTR_LABEL: load i64, i64*
- ; NO_COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
- ; NO_COMBINE_PTR_LABEL: shl i64
- ; NO_COMBINE_PTR_LABEL: lshr i64
- ; NO_COMBINE_PTR_LABEL: or i64
- ; NO_COMBINE_PTR_LABEL: icmp eq i64
- ; NO_COMBINE_PTR_LABEL: load i32, i32*
- ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
- ; NO_COMBINE_PTR_LABEL: ret i32
- ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
-
+ ; CHECK-LABEL: @"dfs$load32"
+ ; COMBINE_LOAD_PTR-NEXT: %[[#PS:]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
+ ; CHECK-NEXT: %[[#INTP:]] = ptrtoint i32* %p to i64
+ ; CHECK-NEXT: %[[#SHADOW_ADDR:]] = and i64 %[[#INTP]], [[#MASK]]
+ ; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_PTR:]] = bitcast i[[#SBITS]]* %[[#SHADOW_PTR]] to i[[#WSBITS:mul(SBITS,4)]]*
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = load i[[#WSBITS]], i[[#WSBITS]]* %[[#WIDE_SHADOW_PTR]], align [[#SBYTES]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i[[#WSBITS]] %[[#WIDE_SHADOW]], [[#mul(SBITS,2)]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i[[#WSBITS]] %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i[[#WSBITS]] %[[#WIDE_SHADOW]], [[#SBITS]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i[[#WSBITS]] %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
+ ; CHECK-NEXT: %[[#SHADOW:]] = trunc i[[#WSBITS]] %[[#WIDE_SHADOW]] to i[[#SBITS]]
+ ; COMBINE_LOAD_PTR-NEXT: %[[#SHADOW:]] = or i[[#SBITS]] %[[#SHADOW]], %[[#PS]]
+ ; CHECK-NEXT: %a = load i32, i32* %p, align 4
+ ; CHECK-NEXT: store i[[#SBITS]] %[[#SHADOW]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
+ ; CHECK-NEXT: ret i32 %a
%a = load i32, i32* %p
ret i32 %a
}
define i64 @load64(i64* %p) {
- ; COMBINE_PTR_LABEL: @"dfs$load64"
- ; COMBINE_PTR_LABEL: ptrtoint i64*
- ; COMBINE_PTR_LABEL: and i64
- ; COMBINE_PTR_LABEL: mul i64
- ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
- ; COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
- ; COMBINE_PTR_LABEL: load i64, i64*
- ; COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
- ; COMBINE_PTR_LABEL: shl i64
- ; COMBINE_PTR_LABEL: lshr i64
- ; COMBINE_PTR_LABEL: or i64
- ; COMBINE_PTR_LABEL: icmp eq i64
- ; COMBINE_PTR_LABEL: icmp ne i16
- ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
- ; COMBINE_PTR_LABEL: load i64, i64*
- ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
- ; COMBINE_PTR_LABEL: ret i64
- ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
- ; COMBINE_PTR_LABEL: getelementptr i64, i64* {{.*}} i64
- ; COMBINE_PTR_LABEL: load i64, i64*
- ; COMBINE_PTR_LABEL: icmp eq i64
-
- ; NO_COMBINE_PTR_LABEL: @"dfs$load64"
- ; NO_COMBINE_PTR_LABEL: ptrtoint i64*
- ; NO_COMBINE_PTR_LABEL: and i64
- ; NO_COMBINE_PTR_LABEL: mul i64
- ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
- ; NO_COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
- ; NO_COMBINE_PTR_LABEL: load i64, i64*
- ; NO_COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
- ; NO_COMBINE_PTR_LABEL: shl i64
- ; NO_COMBINE_PTR_LABEL: lshr i64
- ; NO_COMBINE_PTR_LABEL: or i64
- ; NO_COMBINE_PTR_LABEL: icmp eq i64
- ; NO_COMBINE_PTR_LABEL: load i64, i64*
- ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
- ; NO_COMBINE_PTR_LABEL: ret i64
- ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
- ; NO_COMBINE_PTR_LABEL: getelementptr i64, i64* {{.*}} i64
- ; NO_COMBINE_PTR_LABEL: load i64, i64*
- ; NO_COMBINE_PTR_LABEL: icmp eq i64
+ ; CHECK-LABEL: @"dfs$load64"
+ ; COMBINE_LOAD_PTR-NEXT: %[[#PS:]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
+ ; CHECK-NEXT: %[[#INTP:]] = ptrtoint i64* %p to i64
+ ; CHECK-NEXT: %[[#SHADOW_ADDR:]] = and i64 %[[#INTP]], [[#MASK]]
+ ; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_PTR:]] = bitcast i[[#SBITS]]* %[[#SHADOW_PTR]] to i64*
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = load i64, i64* %[[#WIDE_SHADOW_PTR]], align [[#SBYTES]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 32
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 16
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 8
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
+ ; CHECK-NEXT: %[[#SHADOW:]] = trunc i64 %[[#WIDE_SHADOW]] to i[[#SBITS]]
+ ; COMBINE_LOAD_PTR-NEXT: %[[#SHADOW:]] = or i[[#SBITS]] %[[#SHADOW]], %[[#PS]]
+ ; CHECK-NEXT: %a = load i64, i64* %p, align 8
+ ; CHECK-NEXT: store i[[#SBITS]] %[[#SHADOW]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
+ ; CHECK-NEXT: ret i64 %a
%a = load i64, i64* %p
ret i64 %a
}
+define i128 @load128(i128* %p) {
+ ; CHECK-LABEL: @"dfs$load128"
+ ; COMBINE_LOAD_PTR-NEXT: %[[#PS:]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
+ ; CHECK-NEXT: %[[#INTP:]] = ptrtoint i128* %p to i64
+ ; CHECK-NEXT: %[[#SHADOW_ADDR:]] = and i64 %[[#INTP]], [[#MASK]]
+ ; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_PTR:]] = bitcast i[[#SBITS]]* %[[#SHADOW_PTR]] to i64*
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = load i64, i64* %[[#WIDE_SHADOW_PTR]], align [[#SBYTES]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_PTR2:]] = getelementptr i64, i64* %[[#WIDE_SHADOW_PTR]], i64 1
+ ; CHECK-NEXT: %[[#WIDE_SHADOW2:]] = load i64, i64* %[[#WIDE_SHADOW_PTR2]], align [[#SBYTES]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW2]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 32
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 16
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 8
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
+ ; CHECK-NEXT: %[[#SHADOW:]] = trunc i64 %[[#WIDE_SHADOW]] to i[[#SBITS]]
+ ; COMBINE_LOAD_PTR-NEXT: %[[#SHADOW:]] = or i[[#SBITS]] %[[#SHADOW]], %[[#PS]]
+ ; CHECK-NEXT: %a = load i128, i128* %p, align 8
+ ; CHECK-NEXT: store i[[#SBITS]] %[[#SHADOW]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
+ ; CHECK-NEXT: ret i128 %a
+
+ %a = load i128, i128* %p
+ ret i128 %a
+}
+
+
+define i17 @load17(i17* %p) {
+ ; CHECK-LABEL: @"dfs$load17"
+ ; COMBINE_LOAD_PTR-NEXT: %[[#PS:]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
+ ; CHECK-NEXT: %[[#INTP:]] = ptrtoint i17* %p to i64
+ ; CHECK-NEXT: %[[#SHADOW_ADDR:]] = and i64 %[[#INTP]], [[#MASK]]
+ ; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
+ ; CHECK-NEXT: %[[#SHADOW:]] = call zeroext i8 @__dfsan_union_load(i[[#SBITS]]* %[[#SHADOW_PTR]], i64 3)
+ ; COMBINE_LOAD_PTR-NEXT: %[[#SHADOW:]] = or i[[#SBITS]] %[[#SHADOW]], %[[#PS]]
+ ; CHECK-NEXT: %a = load i17, i17* %p
+ ; CHECK-NEXT: store i[[#SBITS]] %[[#SHADOW]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
+ ; CHECK-NEXT: ret i17 %a
+
+ %a = load i17, i17* %p
+ ret i17 %a
+}
+
@X = constant i1 1
define i1 @load_global() {
- ; NO_COMBINE_PTR_LABEL: @"dfs$load_global"
- ; NO_COMBINE_PTR_LABEL: store i16 0, i16* bitcast ([100 x i64]* @__dfsan_retval_tls to i16*), align 2
+ ; CHECK-LABEL: @"dfs$load_global"
+ ; CHECK-NEXT: %a = load i1, i1* @X
+ ; CHECK-NEXT: store i[[#SBITS]] 0, i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
+ ; CHECK-NEXT: ret i1 %a
%a = load i1, i1* @X
ret i1 %a
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/musttailcall.ll b/llvm/test/Instrumentation/DataFlowSanitizer/musttailcall.ll
index 537449ee6e68c..a76c16b817dcf 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/musttailcall.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/musttailcall.ll
@@ -1,7 +1,5 @@
; RUN: opt < %s -dfsan -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels -dfsan-track-origins=1 -S | FileCheck %s --check-prefixes=CHECK,CHECK_ORIGIN
+; RUN: opt < %s -dfsan -dfsan-track-origins=1 -S | FileCheck %s --check-prefixes=CHECK,CHECK_ORIGIN
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/origin_abilist.ll b/llvm/test/Instrumentation/DataFlowSanitizer/origin_abilist.ll
index b6d8973b88343..a1a7547e4f51e 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/origin_abilist.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/origin_abilist.ll
@@ -1,5 +1,4 @@
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-8-labels=true -dfsan-abilist=%S/Inputs/abilist.txt -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-16-labels=true -dfsan-abilist=%S/Inputs/abilist.txt -S | FileCheck %s
+; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-abilist=%S/Inputs/abilist.txt -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/origin_cached_shadows.ll b/llvm/test/Instrumentation/DataFlowSanitizer/origin_cached_shadows.ll
index 482959296fde3..1d7bf54a9fb96 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/origin_cached_shadows.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/origin_cached_shadows.ll
@@ -1,5 +1,4 @@
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-8-labels=true -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-16-labels=true -S | FileCheck %s
+; RUN: opt < %s -dfsan -dfsan-track-origins=1 -S | FileCheck %s
;
; %15 and %17 have the same key in shadow cache. They should not reuse the same
; shadow because their blocks do not dominate each other. Origin tracking
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/origin_call.ll b/llvm/test/Instrumentation/DataFlowSanitizer/origin_call.ll
index 7f511bd207586..b8c05a5d46219 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/origin_call.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/origin_call.ll
@@ -1,5 +1,4 @@
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-8-labels=true -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-16-labels=true -S | FileCheck %s
+; RUN: opt < %s -dfsan -dfsan-track-origins=1 -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/origin_load.ll b/llvm/test/Instrumentation/DataFlowSanitizer/origin_load.ll
index fa4e7942e12f7..ebd7f242ad71d 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/origin_load.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/origin_load.ll
@@ -1,7 +1,5 @@
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-8-labels -S | FileCheck %s --check-prefixes=CHECK,CHECK8,COMBINE_LOAD_PTR
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-8-labels -dfsan-combine-pointer-labels-on-load=false -S | FileCheck %s --check-prefixes=CHECK,CHECK8
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-16-labels -S | FileCheck %s --check-prefixes=CHECK,CHECK16,COMBINE_LOAD_PTR
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-16-labels -dfsan-combine-pointer-labels-on-load=false -S | FileCheck %s --check-prefixes=CHECK,CHECK16
+; RUN: opt < %s -dfsan -dfsan-track-origins=1 -S | FileCheck %s --check-prefixes=CHECK,COMBINE_LOAD_PTR
+; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-combine-pointer-labels-on-load=false -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@@ -38,7 +36,6 @@ define i16* @load_escaped_alloca() {
; CHECK-LABEL: @"dfs$load_escaped_alloca"
; CHECK: %[[#INTP:]] = ptrtoint i16* %p to i64
; CHECK-NEXT: %[[#SHADOW_ADDR:]] = and i64 %[[#INTP]], [[#%.10d,MASK:]]
- ; CHECK16-NEXT: %[[#SHADOW_ADDR:]] = mul i64 %[[#SHADOW_ADDR]], 2
; CHECK-NEXT: %[[#SHADOW_PTR0:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
; CHECK-NEXT: %[[#ORIGIN_OFFSET:]] = add i64 %[[#INTP+1]], [[#%.10d,ORIGIN_MASK:]]
; CHECK-NEXT: %[[#ORIGIN_ADDR:]] = and i64 %[[#ORIGIN_OFFSET]], -4
@@ -76,7 +73,6 @@ define i1 @load1(i1* %p) {
; CHECK-NEXT: %[[#INTP:]] = ptrtoint i1* %p to i64
; CHECK-NEXT: %[[#SHADOW_ADDR:]] = and i64 %[[#INTP]], [[#MASK]]
- ; CHECK16-NEXT: %[[#SHADOW_ADDR:]] = mul i64 %[[#SHADOW_ADDR]], 2
; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
; CHECK-NEXT: %[[#ORIGIN_OFFSET:]] = add i64 %[[#INTP+1]], [[#ORIGIN_MASK]]
; CHECK-NEXT: %[[#ORIGIN_ADDR:]] = and i64 %[[#ORIGIN_OFFSET]], -4
@@ -104,7 +100,6 @@ define i16 @load16(i1 %i, i16* %p) {
; CHECK-NEXT: %[[#INTP:]] = ptrtoint i16* %p to i64
; CHECK-NEXT: %[[#SHADOW_ADDR:]] = and i64 %[[#INTP]], [[#MASK]]
- ; CHECK16-NEXT: %[[#SHADOW_ADDR:]] = mul i64 %[[#SHADOW_ADDR]], 2
; CHECK-NEXT: %[[#SHADOW_PTR0:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
; CHECK-NEXT: %[[#ORIGIN_OFFSET:]] = add i64 %[[#INTP+1]], [[#ORIGIN_MASK]]
; CHECK-NEXT: %[[#ORIGIN_ADDR:]] = and i64 %[[#ORIGIN_OFFSET]], -4
@@ -133,9 +128,8 @@ define i32 @load32(i32* %p) {
; COMBINE_LOAD_PTR-NEXT: %[[#PO:]] = load i32, i32* getelementptr inbounds ([200 x i32], [200 x i32]* @__dfsan_arg_origin_tls, i64 0, i64 0), align 4
; COMBINE_LOAD_PTR-NEXT: %[[#PS:]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([100 x i64]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK: %[[#INTP:]] = ptrtoint i32* %p to i64
+ ; CHECK-NEXT: %[[#INTP:]] = ptrtoint i32* %p to i64
; CHECK-NEXT: %[[#SHADOW_ADDR:INTP+1]] = and i64 %[[#INTP]], [[#MASK]]
- ; CHECK16-NEXT: %[[#SHADOW_ADDR:]] = mul i64 %[[#SHADOW_ADDR]], 2
; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
; CHECK-NEXT: %[[#ORIGIN_ADDR:]] = add i64 %[[#INTP+1]], [[#ORIGIN_MASK]]
; CHECK-NEXT: %[[#ORIGIN_PTR:]] = inttoptr i64 %[[#ORIGIN_ADDR]] to i32*
@@ -166,41 +160,26 @@ define i64 @load64(i64* %p) {
; COMBINE_LOAD_PTR-NEXT: %[[#PO:]] = load i32, i32* getelementptr inbounds ([200 x i32], [200 x i32]* @__dfsan_arg_origin_tls, i64 0, i64 0), align 4
; COMBINE_LOAD_PTR-NEXT: %[[#PS:]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([100 x i64]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK: %[[#INTP:]] = ptrtoint i64* %p to i64
+ ; CHECK-NEXT: %[[#INTP:]] = ptrtoint i64* %p to i64
; CHECK-NEXT: %[[#SHADOW_ADDR:INTP+1]] = and i64 %[[#INTP]], [[#MASK]]
- ; CHECK16-NEXT: %[[#SHADOW_ADDR:]] = mul i64 %[[#SHADOW_ADDR]], 2
; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
; CHECK-NEXT: %[[#ORIGIN_ADDR:]] = add i64 %[[#INTP+1]], [[#ORIGIN_MASK]]
; CHECK-NEXT: %[[#ORIGIN_PTR:]] = inttoptr i64 %[[#ORIGIN_ADDR]] to i32*
; CHECK-NEXT: %[[#ORIGIN:]] = load i32, i32* %[[#ORIGIN_PTR]], align 8
; CHECK-NEXT: %[[#WIDE_SHADOW_PTR:]] = bitcast i[[#SBITS]]* %[[#SHADOW_PTR]] to i64*
; CHECK-NEXT: %[[#WIDE_SHADOW:]] = load i64, i64* %[[#WIDE_SHADOW_PTR]], align [[#SBYTES]]
-
- ; COMM: On fast16, the 2x64 shadow bits need to be ORed first.
- ; CHECK16-NEXT: %[[#WIDE_SHADOW_PTR2:]] = getelementptr i64, i64* %[[#WIDE_SHADOW_PTR]], i64 1
- ; CHECK16-NEXT: %[[#WIDE_SHADOW2:]] = load i64, i64* %[[#WIDE_SHADOW_PTR2]], align [[#SBYTES]]
- ; CHECK16-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW2]]
- ; CHECK16-NEXT: %[[#ORIGIN_PTR2:]] = getelementptr i32, i32* %[[#ORIGIN_PTR]], i64 1
- ; CHECK16-NEXT: %[[#ORIGIN2:]] = load i32, i32* %[[#ORIGIN_PTR2]], align 8
- ; CHECK16-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 32
- ; CHECK16-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
- ; CHECK16-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 16
- ; CHECK16-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
- ; CHECK16-NEXT: %[[#SHADOW:]] = trunc i64 %[[#WIDE_SHADOW]] to i[[#SBITS]]
- ; CHECK16-NEXT: %[[#SHADOW_NZ:]] = icmp ne i64 %[[#WIDE_SHADOW2]], 0
- ; CHECK16-NEXT: %[[#ORIGIN:]] = select i1 %[[#SHADOW_NZ]], i32 %[[#ORIGIN2]], i32 %[[#ORIGIN]]
-
- ; COMM: On fast8, no need to OR the wide shadow but one more shift is needed.
- ; CHECK8-NEXT: %[[#WIDE_SHADOW_LO:]] = shl i64 %[[#WIDE_SHADOW]], 32
- ; CHECK8-NEXT: %[[#ORIGIN_PTR2:]] = getelementptr i32, i32* %[[#ORIGIN_PTR]], i64 1
- ; CHECK8-NEXT: %[[#ORIGIN2:]] = load i32, i32* %[[#ORIGIN_PTR2]], align 8
- ; CHECK8-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 32
- ; CHECK8-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
- ; CHECK8-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 16
- ; CHECK8-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
- ; CHECK8-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 8
- ; CHECK8-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
- ; CHECK8-NEXT: %[[#SHADOW:]] = trunc i64 %[[#WIDE_SHADOW]] to i[[#SBITS]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_LO:]] = shl i64 %[[#WIDE_SHADOW]], 32
+ ; CHECK-NEXT: %[[#ORIGIN2_PTR:]] = getelementptr i32, i32* %[[#ORIGIN_PTR]], i64 1
+ ; CHECK-NEXT: %[[#ORIGIN2:]] = load i32, i32* %[[#ORIGIN2_PTR]], align 8
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 32
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 16
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 8
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
+ ; CHECK-NEXT: %[[#SHADOW:]] = trunc i64 %[[#WIDE_SHADOW]] to i[[#SBITS]]
+ ; CHECK-NEXT: %[[#SHADOW_NZ:]] = icmp ne i64 %[[#WIDE_SHADOW_LO]], 0
+ ; CHECK-NEXT: %[[#ORIGIN:]] = select i1 %[[#SHADOW_NZ]], i32 %[[#ORIGIN]], i32 %[[#ORIGIN2]]
; CHECK8-NEXT: %[[#SHADOW_NZ:]] = icmp ne i64 %[[#WIDE_SHADOW_LO]], 0
; CHECK8-NEXT: %[[#ORIGIN:]] = select i1 %[[#SHADOW_NZ]], i32 %[[#ORIGIN]], i32 %[[#ORIGIN2]]
@@ -246,66 +225,38 @@ define i128 @load128(i128* %p) {
; COMBINE_LOAD_PTR-NEXT: %[[#PO:]] = load i32, i32* getelementptr inbounds ([200 x i32], [200 x i32]* @__dfsan_arg_origin_tls, i64 0, i64 0), align 4
; COMBINE_LOAD_PTR-NEXT: %[[#PS:]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([100 x i64]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; CHECK: %[[#INTP:]] = ptrtoint i128* %p to i64
+ ; CHECK-NEXT: %[[#INTP:]] = ptrtoint i128* %p to i64
; CHECK-NEXT: %[[#SHADOW_ADDR:INTP+1]] = and i64 %[[#INTP]], [[#MASK]]
- ; CHECK16-NEXT: %[[#SHADOW_ADDR:]] = mul i64 %[[#SHADOW_ADDR]], 2
; CHECK-NEXT: %[[#SHADOW_PTR:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
- ; CHECK-NEXT: %[[#ORIGIN_ADDR:]] = add i64 %[[#INTP+1]], [[#ORIGIN_MASK]]
- ; CHECK-NEXT: %[[#ORIGIN_PTR:]] = inttoptr i64 %[[#ORIGIN_ADDR]] to i32*
- ; CHECK-NEXT: %[[#ORIGIN:]] = load i32, i32* %[[#ORIGIN_PTR]], align 8
- ; CHECK-NEXT: %[[#WIDE_SHADOW_PTR:]] = bitcast i[[#SBITS]]* %[[#SHADOW_PTR]] to i64*
- ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = load i64, i64* %[[#WIDE_SHADOW_PTR]], align [[#SBYTES]]
- ; CHECK8-NEXT: %[[#WIDE_SHADOW_LO:]] = shl i64 %[[#WIDE_SHADOW]], 32
- ; CHECK8-NEXT: %[[#ORIGIN_PTR2:]] = getelementptr i32, i32* %[[#ORIGIN_PTR]], i64 1
- ; CHECK8-NEXT: %[[#ORIGIN2:]] = load i32, i32* %[[#ORIGIN_PTR2]], align 8
- ; CHECK-NEXT: %[[#WIDE_SHADOW_PTR2:]] = getelementptr i64, i64* %[[#WIDE_SHADOW_PTR]], i64 1
- ; CHECK-NEXT: %[[#WIDE_SHADOW2:]] = load i64, i64* %[[#WIDE_SHADOW_PTR2]], align [[#SBYTES]]
- ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW2]]
-
- ; COMM: On fast16, we need to OR 4x64bits for the wide shadow, before ORing its bytes.
- ; CHECK16-NEXT: %[[#ORIGIN_PTR2:]] = getelementptr i32, i32* %[[#ORIGIN_PTR]], i64 1
- ; CHECK16-NEXT: %[[#ORIGIN2:]] = load i32, i32* %[[#ORIGIN_PTR2]], align 8
- ; CHECK16-NEXT: %[[#WIDE_SHADOW_PTR3:]] = getelementptr i64, i64* %[[#WIDE_SHADOW_PTR2]], i64 1
- ; CHECK16-NEXT: %[[#WIDE_SHADOW3:]] = load i64, i64* %[[#WIDE_SHADOW_PTR3]], align [[#SBYTES]]
- ; CHECK16-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW3]]
- ; CHECK16-NEXT: %[[#ORIGIN_PTR3:]] = getelementptr i32, i32* %[[#ORIGIN_PTR2]], i64 1
- ; CHECK16-NEXT: %[[#ORIGIN3:]] = load i32, i32* %[[#ORIGIN_PTR3]], align 8
- ; CHECK16-NEXT: %[[#WIDE_SHADOW_PTR4:]] = getelementptr i64, i64* %[[#WIDE_SHADOW_PTR3]], i64 1
- ; CHECK16-NEXT: %[[#WIDE_SHADOW4:]] = load i64, i64* %[[#WIDE_SHADOW_PTR4]], align [[#SBYTES]]
- ; CHECK16-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW4]]
- ; CHECK16-NEXT: %[[#ORIGIN_PTR4:]] = getelementptr i32, i32* %[[#ORIGIN_PTR3]], i64 1
- ; CHECK16-NEXT: %[[#ORIGIN4:]] = load i32, i32* %[[#ORIGIN_PTR4]], align 8
- ; CHECK16-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 32
- ; CHECK16-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
- ; CHECK16-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 16
- ; CHECK16-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
- ; CHECK16-NEXT: %[[#SHADOW:]] = trunc i64 %[[#WIDE_SHADOW]] to i[[#SBITS]]
- ; CHECK16-NEXT: %[[#SHADOW2_NZ:]] = icmp ne i64 %[[#WIDE_SHADOW2]], 0
- ; CHECK16-NEXT: %[[#ORIGIN:]] = select i1 %[[#SHADOW2_NZ]], i32 %[[#ORIGIN2]], i32 %[[#ORIGIN]]
- ; CHECK16-NEXT: %[[#SHADOW3_NZ:]] = icmp ne i64 %[[#WIDE_SHADOW3]], 0
- ; CHECK16-NEXT: %[[#ORIGIN:]] = select i1 %[[#SHADOW3_NZ]], i32 %[[#ORIGIN3]], i32 %[[#ORIGIN]]
- ; CHECK16-NEXT: %[[#SHADOW4_NZ:]] = icmp ne i64 %[[#WIDE_SHADOW4]], 0
- ; CHECK16-NEXT: %[[#ORIGIN:]] = select i1 %[[#SHADOW4_NZ]], i32 %[[#ORIGIN4]], i32 %[[#ORIGIN]]
-
- ; COMM: On fast8, we need to OR 2x64bits for the wide shadow, before ORing its bytes (one more shift).
- ; CHECK8-NEXT: %[[#ORIGIN_PTR3:]] = getelementptr i32, i32* %[[#ORIGIN_PTR2]], i64 1
- ; CHECK8-NEXT: %[[#ORIGIN3:]] = load i32, i32* %[[#ORIGIN_PTR3]], align 8
- ; CHECK8-NEXT: %[[#WIDE_SHADOW2_LO:]] = shl i64 %[[#WIDE_SHADOW2]], 32
- ; CHECK8-NEXT: %[[#ORIGIN_PTR4:]] = getelementptr i32, i32* %[[#ORIGIN_PTR3]], i64 1
- ; CHECK8-NEXT: %[[#ORIGIN4:]] = load i32, i32* %[[#ORIGIN_PTR4]], align 8
- ; CHECK8-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 32
- ; CHECK8-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
- ; CHECK8-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 16
- ; CHECK8-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
- ; CHECK8-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 8
- ; CHECK8-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
- ; CHECK8-NEXT: %[[#SHADOW:]] = trunc i64 %[[#WIDE_SHADOW]] to i[[#SBITS]]
- ; CHECK8-NEXT: %[[#SHADOW_LO_NZ:]] = icmp ne i64 %[[#WIDE_SHADOW_LO]], 0
- ; CHECK8-NEXT: %[[#ORIGIN:]] = select i1 %[[#SHADOW_LO_NZ]], i32 %[[#ORIGIN]], i32 %[[#ORIGIN2]]
- ; CHECK8-NEXT: %[[#SHADOW2_NZ:]] = icmp ne i64 %[[#WIDE_SHADOW2]], 0
- ; CHECK8-NEXT: %[[#ORIGIN:]] = select i1 %[[#SHADOW2_NZ]], i32 %[[#ORIGIN4]], i32 %[[#ORIGIN]]
- ; CHECK8-NEXT: %[[#SHADOW2_LO_NZ:]] = icmp ne i64 %[[#WIDE_SHADOW2_LO]], 0
- ; CHECK8-NEXT: %[[#ORIGIN:]] = select i1 %[[#SHADOW2_LO_NZ]], i32 %[[#ORIGIN3]], i32 %[[#ORIGIN]]
+ ; CHECK-NEXT: %[[#ORIGIN_ADDR:]] = add i64 %[[#SHADOW_ADDR]], [[#ORIGIN_MASK]]
+ ; CHECK-NEXT: %[[#ORIGIN1_PTR:]] = inttoptr i64 %[[#ORIGIN_ADDR]] to i32*
+ ; CHECK-NEXT: %[[#ORIGIN1:]] = load i32, i32* %[[#ORIGIN1_PTR]], align 8
+ ; CHECK-NEXT: %[[#WIDE_SHADOW1_PTR:]] = bitcast i[[#SBITS]]* %[[#SHADOW_PTR]] to i64*
+ ; CHECK-NEXT: %[[#WIDE_SHADOW1:]] = load i64, i64* %[[#WIDE_SHADOW1_PTR]], align [[#SBYTES]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW1_LO:]] = shl i64 %[[#WIDE_SHADOW1]], 32
+ ; CHECK-NEXT: %[[#ORIGIN2_PTR:]] = getelementptr i32, i32* %[[#ORIGIN1_PTR]], i64 1
+ ; CHECK-NEXT: %[[#ORIGIN2:]] = load i32, i32* %[[#ORIGIN2_PTR]], align 8
+ ; CHECK-NEXT: %[[#WIDE_SHADOW2_PTR:]] = getelementptr i64, i64* %[[#WIDE_SHADOW1_PTR]], i64 1
+ ; CHECK-NEXT: %[[#WIDE_SHADOW2:]] = load i64, i64* %[[#WIDE_SHADOW2_PTR]], align [[#SBYTES]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW1]], %[[#WIDE_SHADOW2]]
+ ; CHECK-NEXT: %[[#ORIGIN3_PTR:]] = getelementptr i32, i32* %[[#ORIGIN2_PTR]], i64 1
+ ; CHECK-NEXT: %[[#ORIGIN3:]] = load i32, i32* %[[#ORIGIN3_PTR]], align 8
+ ; CHECK-NEXT: %[[#WIDE_SHADOW2_LO:]] = shl i64 %[[#WIDE_SHADOW2]], 32
+ ; CHECK-NEXT: %[[#ORIGIN4_PTR:]] = getelementptr i32, i32* %[[#ORIGIN3_PTR]], i64 1
+ ; CHECK-NEXT: %[[#ORIGIN4:]] = load i32, i32* %[[#ORIGIN4_PTR]], align 8
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 32
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 16
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
+ ; CHECK-NEXT: %[[#WIDE_SHADOW_SHIFTED:]] = lshr i64 %[[#WIDE_SHADOW]], 8
+ ; CHECK-NEXT: %[[#WIDE_SHADOW:]] = or i64 %[[#WIDE_SHADOW]], %[[#WIDE_SHADOW_SHIFTED]]
+ ; CHECK-NEXT: %[[#SHADOW:]] = trunc i64 %[[#WIDE_SHADOW]] to i[[#SBITS]]
+ ; CHECK-NEXT: %[[#SHADOW1_LO_NZ:]] = icmp ne i64 %[[#WIDE_SHADOW1_LO]], 0
+ ; CHECK-NEXT: %[[#ORIGIN12:]] = select i1 %[[#SHADOW1_LO_NZ]], i32 %[[#ORIGIN1]], i32 %[[#ORIGIN2]]
+ ; CHECK-NEXT: %[[#SHADOW2_NZ:]] = icmp ne i64 %[[#WIDE_SHADOW2]], 0
+ ; CHECK-NEXT: %[[#ORIGIN124:]] = select i1 %[[#SHADOW2_NZ]], i32 %[[#ORIGIN4]], i32 %[[#ORIGIN12]]
+ ; CHECK-NEXT: %[[#SHADOW2_LO_NZ:]] = icmp ne i64 %[[#WIDE_SHADOW2_LO]], 0
+ ; CHECK-NEXT: %[[#ORIGIN:]] = select i1 %[[#SHADOW2_LO_NZ]], i32 %[[#ORIGIN3]], i32 %[[#ORIGIN124]]
; COMBINE_LOAD_PTR-NEXT: %[[#SHADOW:]] = or i[[#SBITS]] %[[#SHADOW]], %[[#PS]]
; COMBINE_LOAD_PTR-NEXT: %[[#NZ:]] = icmp ne i[[#SBITS]] %[[#PS]], 0
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/origin_mem_intrinsic.ll b/llvm/test/Instrumentation/DataFlowSanitizer/origin_mem_intrinsic.ll
index 6edb6d566b0f6..05eaa5bdccc9d 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/origin_mem_intrinsic.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/origin_mem_intrinsic.ll
@@ -1,5 +1,4 @@
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-8-labels=true -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-16-labels=true -S | FileCheck %s
+; RUN: opt < %s -dfsan -dfsan-track-origins=1 -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/origin_other_ops.ll b/llvm/test/Instrumentation/DataFlowSanitizer/origin_other_ops.ll
index ccd6164ee0a40..e03a680f38068 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/origin_other_ops.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/origin_other_ops.ll
@@ -1,5 +1,4 @@
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-8-labels=true -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-16-labels=true -S | FileCheck %s
+; RUN: opt < %s -dfsan -dfsan-track-origins=1 -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/origin_phi.ll b/llvm/test/Instrumentation/DataFlowSanitizer/origin_phi.ll
index a5d8b46603686..a1e5bd8641c08 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/origin_phi.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/origin_phi.ll
@@ -1,5 +1,4 @@
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-8-labels=true -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-16-labels=true -S | FileCheck %s
+; RUN: opt < %s -dfsan -dfsan-track-origins=1 -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/origin_select.ll b/llvm/test/Instrumentation/DataFlowSanitizer/origin_select.ll
index 53849701ff582..65fb236c014e6 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/origin_select.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/origin_select.ll
@@ -1,7 +1,5 @@
-; RUN: opt < %s -dfsan -dfsan-track-select-control-flow=1 -dfsan-track-origins=1 -dfsan-fast-8-labels=true -S | FileCheck %s --check-prefixes=CHECK,TRACK_CONTROL_FLOW
-; RUN: opt < %s -dfsan -dfsan-track-select-control-flow=0 -dfsan-track-origins=1 -dfsan-fast-8-labels=true -S | FileCheck %s --check-prefixes=CHECK,NO_TRACK_CONTROL_FLOW
-; RUN: opt < %s -dfsan -dfsan-track-select-control-flow=1 -dfsan-track-origins=1 -dfsan-fast-16-labels=true -S | FileCheck %s --check-prefixes=CHECK,TRACK_CONTROL_FLOW
-; RUN: opt < %s -dfsan -dfsan-track-select-control-flow=0 -dfsan-track-origins=1 -dfsan-fast-16-labels=true -S | FileCheck %s --check-prefixes=CHECK,NO_TRACK_CONTROL_FLOW
+; RUN: opt < %s -dfsan -dfsan-track-select-control-flow=1 -dfsan-track-origins=1 -S | FileCheck %s --check-prefixes=CHECK,TRACK_CONTROL_FLOW
+; RUN: opt < %s -dfsan -dfsan-track-select-control-flow=0 -dfsan-track-origins=1 -S | FileCheck %s --check-prefixes=CHECK,NO_TRACK_CONTROL_FLOW
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/origin_store.ll b/llvm/test/Instrumentation/DataFlowSanitizer/origin_store.ll
index 72d7c6e816456..6b7d8f106bc3e 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/origin_store.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/origin_store.ll
@@ -1,7 +1,5 @@
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-8-labels -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-8-labels -dfsan-combine-pointer-labels-on-store -S | FileCheck %s --check-prefixes=CHECK,COMBINE_STORE_PTR
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-16-labels -S | FileCheck %s --check-prefixes=CHECK,CHECK16
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-16-labels -dfsan-combine-pointer-labels-on-store -S | FileCheck %s --check-prefixes=CHECK,CHECK16,COMBINE_STORE_PTR
+; RUN: opt < %s -dfsan -dfsan-track-origins=1 -S | FileCheck %s
+; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-combine-pointer-labels-on-store -S | FileCheck %s --check-prefixes=CHECK,COMBINE_STORE_PTR
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@@ -55,7 +53,6 @@ define void @store_nonzero_to_escaped_alloca(i16 %a) {
; CHECK-NEXT: %[[#AS:]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([100 x i64]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
; CHECK: %[[#INTP:]] = ptrtoint i16* %p to i64
; CHECK-NEXT: %[[#SHADOW_ADDR:]] = and i64 %[[#INTP]], [[#%.10d,MASK:]]
- ; CHECK16-NEXT: %[[#SHADOW_ADDR:]] = mul i64 %[[#SHADOW_ADDR]], 2
; CHECK-NEXT: %[[#SHADOW_PTR0:]] = inttoptr i64 %[[#SHADOW_ADDR]] to i[[#SBITS]]*
; CHECK-NEXT: %[[#ORIGIN_OFFSET:]] = add i64 %[[#INTP+1]], [[#%.10d,ORIGIN_MASK:]]
; CHECK-NEXT: %[[#ORIGIN_ADDR:]] = and i64 %[[#ORIGIN_OFFSET]], -4
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/origin_store_threshold.ll b/llvm/test/Instrumentation/DataFlowSanitizer/origin_store_threshold.ll
index ce1ec49e0f9fd..1f82f7c64bbb8 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/origin_store_threshold.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/origin_store_threshold.ll
@@ -1,5 +1,4 @@
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-8-labels=true -dfsan-instrument-with-call-threshold=0 -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-fast-16-labels=true -dfsan-instrument-with-call-threshold=0 -S | FileCheck %s
+; RUN: opt < %s -dfsan -dfsan-track-origins=1 -dfsan-instrument-with-call-threshold=0 -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/origin_track_load.ll b/llvm/test/Instrumentation/DataFlowSanitizer/origin_track_load.ll
index f16a96aa76cbd..7f985e862fc24 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/origin_track_load.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/origin_track_load.ll
@@ -1,5 +1,4 @@
-; RUN: opt < %s -dfsan -dfsan-track-origins=2 -dfsan-fast-8-labels -S | FileCheck %s
-; RUN: opt < %s -dfsan -dfsan-track-origins=2 -dfsan-fast-16-labels -S | FileCheck %s
+; RUN: opt < %s -dfsan -dfsan-track-origins=2 -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/phi.ll b/llvm/test/Instrumentation/DataFlowSanitizer/phi.ll
index fe2b0ba3b47fc..244cdb3773e9a 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/phi.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/phi.ll
@@ -1,6 +1,4 @@
-; RUN: opt < %s -dfsan -S | FileCheck %s --check-prefixes=CHECK,LEGACY
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -S | FileCheck %s --check-prefixes=CHECK,FAST
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels=true -S | FileCheck %s --check-prefixes=CHECK,FAST
+; RUN: opt < %s -dfsan -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@@ -8,15 +6,11 @@ target triple = "x86_64-unknown-linux-gnu"
; CHECK: @__dfsan_shadow_width_bytes = weak_odr constant i32 [[#SBYTES:]]
define {i32, i32} @test({i32, i32} %a, i1 %c) {
- ; LEGACY: [[AL:%.*]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([100 x i64]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN:2]]
- ; LEGACY: [[PL:%.*]] = phi i[[#SBITS]] [ [[AL]], %T ], [ [[AL]], %F ]
- ; LEGACY: store i[[#SBITS]] [[PL]], i[[#SBITS]]* bitcast ([100 x i64]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
-
- ; FAST: [[AL:%.*]] = load { i[[#SBITS]], i[[#SBITS]] }, { i[[#SBITS]], i[[#SBITS]] }* bitcast ([100 x i64]* @__dfsan_arg_tls to { i[[#SBITS]], i[[#SBITS]] }*), align [[ALIGN:2]]
- ; FAST: [[AL0:%.*]] = insertvalue { i[[#SBITS]], i[[#SBITS]] } [[AL]], i[[#SBITS]] 0, 0
- ; FAST: [[AL1:%.*]] = insertvalue { i[[#SBITS]], i[[#SBITS]] } [[AL]], i[[#SBITS]] 0, 1
- ; FAST: [[PL:%.*]] = phi { i[[#SBITS]], i[[#SBITS]] } [ [[AL0]], %T ], [ [[AL1]], %F ]
- ; FAST: store { i[[#SBITS]], i[[#SBITS]] } [[PL]], { i[[#SBITS]], i[[#SBITS]] }* bitcast ([100 x i64]* @__dfsan_retval_tls to { i[[#SBITS]], i[[#SBITS]] }*), align [[ALIGN]]
+ ; CHECK: %[[#AL:]] = load { i[[#SBITS]], i[[#SBITS]] }, { i[[#SBITS]], i[[#SBITS]] }* bitcast ([100 x i64]* @__dfsan_arg_tls to { i[[#SBITS]], i[[#SBITS]] }*), align [[ALIGN:2]]
+ ; CHECK: %[[#AL0:]] = insertvalue { i[[#SBITS]], i[[#SBITS]] } %[[#AL]], i[[#SBITS]] 0, 0
+ ; CHECK: %[[#AL1:]] = insertvalue { i[[#SBITS]], i[[#SBITS]] } %[[#AL]], i[[#SBITS]] 0, 1
+ ; CHECK: %[[#PL:]] = phi { i[[#SBITS]], i[[#SBITS]] } [ %[[#AL0]], %T ], [ %[[#AL1]], %F ]
+ ; CHECK: store { i[[#SBITS]], i[[#SBITS]] } %[[#PL]], { i[[#SBITS]], i[[#SBITS]] }* bitcast ([100 x i64]* @__dfsan_retval_tls to { i[[#SBITS]], i[[#SBITS]] }*), align [[ALIGN]]
entry:
br i1 %c, label %T, label %F
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/select.ll b/llvm/test/Instrumentation/DataFlowSanitizer/select.ll
index 6a3355b4a649a..e7dbf03162c7e 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/select.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/select.ll
@@ -1,9 +1,5 @@
-; RUN: opt < %s -dfsan -dfsan-track-select-control-flow=1 -S | FileCheck %s --check-prefixes=CHECK,TRACK_CF,TRACK_CF_LEGACY
-; RUN: opt < %s -dfsan -dfsan-track-select-control-flow=0 -S | FileCheck %s --check-prefixes=CHECK,NO_TRACK_CF,NO_TRACK_CF_LEGACY
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels -dfsan-track-select-control-flow=1 -S | FileCheck %s --check-prefixes=CHECK,TRACK_CF,TRACK_CF_FAST
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels -dfsan-track-select-control-flow=0 -S | FileCheck %s --check-prefixes=CHECK,NO_TRACK_CF,NO_TRACK_CF_FAST
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels -dfsan-track-select-control-flow=1 -S | FileCheck %s --check-prefixes=CHECK,TRACK_CF,TRACK_CF_FAST
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels -dfsan-track-select-control-flow=0 -S | FileCheck %s --check-prefixes=CHECK,NO_TRACK_CF,NO_TRACK_CF_FAST
+; RUN: opt < %s -dfsan -dfsan-track-select-control-flow=true -S | FileCheck %s --check-prefixes=CHECK,TRACK_CF
+; RUN: opt < %s -dfsan -dfsan-track-select-control-flow=false -S | FileCheck %s --check-prefixes=CHECK,NO_TRACK_CF
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@@ -18,11 +14,7 @@ define i8 @select8(i1 %c, i8 %t, i8 %f) {
; TRACK_CF: %[[#R+1]] = load i[[#SBITS]], i[[#SBITS]]* inttoptr (i64 add (i64 ptrtoint ([[TLS_ARR]]* @__dfsan_arg_tls to i64), i64 2) to i[[#SBITS]]*), align [[ALIGN]]
; TRACK_CF: %[[#R+2]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
; TRACK_CF: %[[#R+3]] = select i1 %c, i[[#SBITS]] %[[#R+1]], i[[#SBITS]] %[[#R]]
- ; TRACK_CF_LEGACY: %[[#R+4]] = icmp ne i[[#SBITS]] %[[#R+2]], %[[#R+3]]
- ; TRACK_CF_LEGACY: %[[#R+6]] = call {{.*}} i[[#SBITS]] @__dfsan_union(i[[#SBITS]] {{.*}} %[[#R+2]], i[[#SBITS]] {{.*}} %[[#R+3]])
- ; TRACK_CF_LEGACY: %[[#RO:]] = phi i[[#SBITS]] [ %[[#R+6]], {{.*}} ], [ %[[#R+2]], {{.*}} ]
- ; COMM: The union is simply an OR when fast labels are used.
- ; TRACK_CF_FAST: %[[#RO:]] = or i[[#SBITS]] %[[#R+2]], %[[#R+3]]
+ ; TRACK_CF: %[[#RO:]] = or i[[#SBITS]] %[[#R+2]], %[[#R+3]]
; TRACK_CF: %a = select i1 %c, i8 %t, i8 %f
; TRACK_CF: store i[[#SBITS]] %[[#RO]], i[[#SBITS]]* bitcast ([100 x i64]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
; TRACK_CF: ret i8 %a
@@ -44,11 +36,7 @@ define i8 @select8e(i1 %c, i8 %tf) {
; TRACK_CF: @"dfs$select8e"
; TRACK_CF: %[[#R:]] = load i[[#SBITS]], i[[#SBITS]]* inttoptr (i64 add (i64 ptrtoint ([[TLS_ARR]]* @__dfsan_arg_tls to i64), i64 2) to i[[#SBITS]]*), align [[ALIGN]]
; TRACK_CF: %[[#R+1]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; TRACK_CF_LEGACY: %[[#R+2]] = icmp ne i[[#SBITS]] %[[#R+1]], %[[#R]]
- ; TRACK_CF_LEGACY: %[[#R+4]] = call {{.*}} i[[#SBITS]] @__dfsan_union(i[[#SBITS]] {{.*}} %[[#R+1]], i[[#SBITS]] {{.*}} %[[#R]])
- ; TRACK_CF_LEGACY: %[[#RO:]] = phi i[[#SBITS]] [ %[[#R+4]], {{.*}} ], [ %[[#R+1]], {{.*}} ]
- ; COMM: The union is simply an OR when fast labels are used.
- ; TRACK_CF_FAST: %[[#RO:]] = or i[[#SBITS]] %[[#R+1]], %[[#R]]
+ ; TRACK_CF: %[[#RO:]] = or i[[#SBITS]] %[[#R+1]], %[[#R]]
; TRACK_CF: %a = select i1 %c, i8 %tf, i8 %tf
; TRACK_CF: store i[[#SBITS]] %[[#RO]], i[[#SBITS]]* bitcast ([100 x i64]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
; TRACK_CF: ret i8 %a
@@ -69,15 +57,8 @@ define <4 x i8> @select8v(<4 x i1> %c, <4 x i8> %t, <4 x i8> %f) {
; TRACK_CF: %[[#R:]] = load i[[#SBITS]], i[[#SBITS]]* inttoptr (i64 add (i64 ptrtoint ([[TLS_ARR]]* @__dfsan_arg_tls to i64), i64 4) to i[[#SBITS]]*), align [[ALIGN:2]]
; TRACK_CF: %[[#R+1]] = load i[[#SBITS]], i[[#SBITS]]* inttoptr (i64 add (i64 ptrtoint ([[TLS_ARR]]* @__dfsan_arg_tls to i64), i64 2) to i[[#SBITS]]*), align [[ALIGN]]
; TRACK_CF: %[[#R+2]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; TRACK_CF_LEGACY: %[[#R+3]] = icmp ne i[[#SBITS]] %[[#R+1]], %[[#R]]
- ; TRACK_CF_LEGACY: %[[#R+5]] = call {{.*}} i[[#SBITS]] @__dfsan_union(i[[#SBITS]] {{.*}} %[[#R+1]], i[[#SBITS]] zeroext %[[#R]])
- ; TRACK_CF_LEGACY: %[[#R+7]] = phi i[[#SBITS]] [ %[[#R+5]], {{.*}} ], [ %[[#R+1]], {{.*}} ]
- ; TRACK_CF_LEGACY: %[[#R+8]] = icmp ne i[[#SBITS]] %[[#R+2]], %[[#R+7]]
- ; TRACK_CF_LEGACY: %[[#R+10]] = call {{.*}} i[[#SBITS]] @__dfsan_union(i[[#SBITS]] {{.*}} %[[#R+2]], i[[#SBITS]] zeroext %[[#R+7]])
- ; TRACK_CF_LEGACY: %[[#RO:]] = phi i[[#SBITS]] [ %[[#R+10]], {{.*}} ], [ %[[#R+2]], {{.*}} ]
- ; COMM: The union is simply an OR when fast labels are used.
- ; TRACK_CF_FAST: %[[#R+3]] = or i[[#SBITS]] %[[#R+1]], %[[#R]]
- ; TRACK_CF_FAST: %[[#RO:]] = or i[[#SBITS]] %[[#R+2]], %[[#R+3]]
+ ; TRACK_CF: %[[#R+3]] = or i[[#SBITS]] %[[#R+1]], %[[#R]]
+ ; TRACK_CF: %[[#RO:]] = or i[[#SBITS]] %[[#R+2]], %[[#R+3]]
; TRACK_CF: %a = select <4 x i1> %c, <4 x i8> %t, <4 x i8> %f
; TRACK_CF: store i[[#SBITS]] %[[#RO]], i[[#SBITS]]* bitcast ([100 x i64]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
; TRACK_CF: ret <4 x i8> %a
@@ -86,11 +67,7 @@ define <4 x i8> @select8v(<4 x i1> %c, <4 x i8> %t, <4 x i8> %f) {
; NO_TRACK_CF: %[[#R:]] = load i[[#SBITS]], i[[#SBITS]]* inttoptr (i64 add (i64 ptrtoint ([[TLS_ARR]]* @__dfsan_arg_tls to i64), i64 4) to i[[#SBITS]]*), align [[ALIGN:2]]
; NO_TRACK_CF: %[[#R+1]] = load i[[#SBITS]], i[[#SBITS]]* inttoptr (i64 add (i64 ptrtoint ([[TLS_ARR]]* @__dfsan_arg_tls to i64), i64 2) to i[[#SBITS]]*), align [[ALIGN]]
; NO_TRACK_CF: %[[#R+2]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; NO_TRACK_CF_LEGACY: %[[#R+3]] = icmp ne i[[#SBITS]] %[[#R+1]], %[[#R]]
- ; NO_TRACK_CF_LEGACY: %[[#R+5]] = call {{.*}} i[[#SBITS]] @__dfsan_union(i[[#SBITS]] {{.*}} %[[#R+1]], i[[#SBITS]] {{.*}} %[[#R]])
- ; NO_TRACK_CF_LEGACY: %[[#RO:]] = phi i[[#SBITS]] [ %6, {{.*}} ], [ %2, {{.*}} ]
- ; COMM: The union is simply an OR when fast labels are used.
- ; NO_TRACK_CF_FAST: %[[#RO:]] = or i[[#SBITS]] %[[#R+1]], %[[#R]]
+ ; NO_TRACK_CF: %[[#RO:]] = or i[[#SBITS]] %[[#R+1]], %[[#R]]
; NO_TRACK_CF: %a = select <4 x i1> %c, <4 x i8> %t, <4 x i8> %f
; NO_TRACK_CF: store i[[#SBITS]] %[[#RO]], i[[#SBITS]]* bitcast ([100 x i64]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
; NO_TRACK_CF: ret <4 x i8> %a
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll b/llvm/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll
index 9c7440e5ebaf7..522628ece6471 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll
@@ -1,6 +1,4 @@
; RUN: opt -mtriple=x86_64-unknown-linux-gnu < %s -dfsan -S --dfsan-abilist=%S/Inputs/shadow-args-abilist.txt | FileCheck %s
-; RUN: opt -mtriple=x86_64-unknown-linux-gnu < %s -dfsan -S --dfsan-abilist=%S/Inputs/shadow-args-abilist.txt -dfsan-fast-16-labels | FileCheck %s
-; RUN: opt -mtriple=x86_64-unknown-linux-gnu < %s -dfsan -S --dfsan-abilist=%S/Inputs/shadow-args-abilist.txt -dfsan-fast-8-labels | FileCheck %s
; REQUIRES: x86-registered-target
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/store.ll b/llvm/test/Instrumentation/DataFlowSanitizer/store.ll
index 660656f57d261..5bb28bf99a82f 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/store.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/store.ll
@@ -1,9 +1,5 @@
-; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-store=1 -S | FileCheck %s --check-prefixes=CHECK,CHECK16,COMBINE_PTR_LABEL
-; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-store=0 -S | FileCheck %s --check-prefixes=CHECK,CHECK16,NO_COMBINE_PTR_LABEL
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels -dfsan-combine-pointer-labels-on-store=1 -S | FileCheck %s --check-prefixes=CHECK,CHECK16,COMBINE_PTR_LABEL_FAST
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels -dfsan-combine-pointer-labels-on-store=0 -S | FileCheck %s --check-prefixes=CHECK,CHECK16,NO_COMBINE_PTR_LABEL
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels -dfsan-combine-pointer-labels-on-store=1 -S | FileCheck %s --check-prefixes=CHECK,COMBINE_PTR_LABEL_FAST
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels -dfsan-combine-pointer-labels-on-store=0 -S | FileCheck %s --check-prefixes=CHECK,NO_COMBINE_PTR_LABEL
+; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-store=1 -S | FileCheck %s --check-prefixes=CHECK,COMBINE_PTR_LABEL
+; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-store=0 -S | FileCheck %s --check-prefixes=CHECK,NO_COMBINE_PTR_LABEL
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@@ -23,19 +19,10 @@ define void @store0({} %v, {}* %p) {
define void @store8(i8 %v, i8* %p) {
; CHECK-LABEL: @"dfs$store8"
; CHECK: load i[[#SBITS]], i[[#SBITS]]* {{.*}} @__dfsan_arg_tls
-
; COMBINE_PTR_LABEL: load i[[#SBITS]], i[[#SBITS]]* {{.*}} @__dfsan_arg_tls
- ; COMBINE_PTR_LABEL: icmp ne i[[#SBITS]]
- ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
-
- ; COMM: When not in legacy mode, the three instructions above will
- ; be replaced with the following:
- ; COMBINE_PTR_LABEL_FAST: load i[[#SBITS]], i[[#SBITS]]* {{.*}} @__dfsan_arg_tls
- ; COMBINE_PTR_LABEL_FAST: or i[[#SBITS]]
-
+ ; COMBINE_PTR_LABEL: or i[[#SBITS]]
; CHECK: ptrtoint i8* {{.*}} i64
; CHECK-NEXT: and i64
- ; CHECK16-NEXT: mul i64
; CHECK-NEXT: inttoptr i64 {{.*}} i[[#SBITS]]*
; CHECK-NEXT: getelementptr i[[#SBITS]], i[[#SBITS]]*
; CHECK-NEXT: store i[[#SBITS]]
@@ -49,19 +36,10 @@ define void @store8(i8 %v, i8* %p) {
define void @store16(i16 %v, i16* %p) {
; CHECK-LABEL: @"dfs$store16"
; CHECK: load i[[#SBITS]], i[[#SBITS]]* {{.*}} @__dfsan_arg_tls
-
; COMBINE_PTR_LABEL: load i[[#SBITS]], i[[#SBITS]]* {{.*}} @__dfsan_arg_tls
- ; COMBINE_PTR_LABEL: icmp ne i[[#SBITS]]
- ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
-
- ; COMM: When not in legacy mode, the three instructions above will
- ; be replaced with the following:
- ; COMBINE_PTR_LABEL_FAST: load i[[#SBITS]], i[[#SBITS]]* {{.*}} @__dfsan_arg_tls
- ; COMBINE_PTR_LABEL_FAST: or i[[#SBITS]]
-
+ ; COMBINE_PTR_LABEL: or i[[#SBITS]]
; CHECK: ptrtoint i16* {{.*}} i64
; CHECK-NEXT: and i64
- ; CHECK16-NEXT: mul i64
; CHECK-NEXT: inttoptr i64 {{.*}} i[[#SBITS]]*
; CHECK-NEXT: getelementptr i[[#SBITS]], i[[#SBITS]]*
; CHECK-NEXT: store i[[#SBITS]]
@@ -77,19 +55,10 @@ define void @store16(i16 %v, i16* %p) {
define void @store32(i32 %v, i32* %p) {
; CHECK-LABEL: @"dfs$store32"
; CHECK: load i[[#SBITS]], i[[#SBITS]]* {{.*}} @__dfsan_arg_tls
-
; COMBINE_PTR_LABEL: load i[[#SBITS]], i[[#SBITS]]* {{.*}} @__dfsan_arg_tls
- ; COMBINE_PTR_LABEL: icmp ne i[[#SBITS]]
- ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
-
- ; COMM: When not in legacy mode, the three instructions above will
- ; be replaced with the following:
- ; COMBINE_PTR_LABEL_FAST: load i[[#SBITS]], i[[#SBITS]]* {{.*}} @__dfsan_arg_tls
- ; COMBINE_PTR_LABEL_FAST: or i[[#SBITS]]
-
+ ; COMBINE_PTR_LABEL: or i[[#SBITS]]
; CHECK: ptrtoint i32* {{.*}} i64
; CHECK-NEXT: and i64
- ; CHECK16-NEXT: mul i64
; CHECK-NEXT: inttoptr i64 {{.*}} i[[#SBITS]]*
; CHECK-NEXT: getelementptr i[[#SBITS]], i[[#SBITS]]*
; CHECK-NEXT: store i[[#SBITS]]
@@ -109,19 +78,10 @@ define void @store32(i32 %v, i32* %p) {
define void @store64(i64 %v, i64* %p) {
; CHECK-LABEL: @"dfs$store64"
; CHECK: load i[[#SBITS]], i[[#SBITS]]* {{.*}} @__dfsan_arg_tls
-
; COMBINE_PTR_LABEL: load i[[#SBITS]], i[[#SBITS]]* {{.*}} @__dfsan_arg_tls
- ; COMBINE_PTR_LABEL: icmp ne i[[#SBITS]]
- ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
-
- ; COMM: When not in legacy mode, the three instructions above will
- ; be replaced with the following:
- ; COMBINE_PTR_LABEL_FAST: load i[[#SBITS]], i[[#SBITS]]* {{.*}} @__dfsan_arg_tls
- ; COMBINE_PTR_LABEL_FAST: or i[[#SBITS]]
-
+ ; COMBINE_PTR_LABEL: or i[[#SBITS]]
; CHECK: ptrtoint i64* {{.*}} i64
; CHECK-NEXT: and i64
- ; CHECK16-NEXT: mul i64
; CHECK-NEXT: inttoptr i64 {{.*}} i[[#SBITS]]*
; CHECK-COUNT-8: insertelement {{.*}} i[[#SBITS]]
; CHECK-NEXT: bitcast i[[#SBITS]]* {{.*}} <8 x i[[#SBITS]]>*
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/struct.ll b/llvm/test/Instrumentation/DataFlowSanitizer/struct.ll
index 4d68a2c0577c7..d11f0d6f0a5c3 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/struct.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/struct.ll
@@ -1,16 +1,10 @@
-; RUN: opt < %s -dfsan -S | FileCheck %s --check-prefixes=CHECK,LEGACY
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -dfsan-event-callbacks=true -S | FileCheck %s --check-prefixes=CHECK,EVENT_CALLBACKS
+; RUN: opt < %s -dfsan -dfsan-event-callbacks=true -S | FileCheck %s --check-prefixes=CHECK,EVENT_CALLBACKS
; RUN: opt < %s -dfsan -dfsan-args-abi -S | FileCheck %s --check-prefixes=CHECK,ARGS_ABI
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -S | FileCheck %s --check-prefixes=CHECK,FAST
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -dfsan-combine-pointer-labels-on-load=false -S | FileCheck %s --check-prefixes=CHECK,NO_COMBINE_LOAD_PTR
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -dfsan-combine-pointer-labels-on-store=true -S | FileCheck %s --check-prefixes=CHECK,COMBINE_STORE_PTR
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -dfsan-track-select-control-flow=false -S | FileCheck %s --check-prefixes=CHECK,NO_SELECT_CONTROL
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -dfsan-debug-nonzero-labels -S | FileCheck %s --check-prefixes=CHECK,DEBUG_NONZERO_LABELS
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels=true -S | FileCheck %s --check-prefixes=CHECK,FAST
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels=true -dfsan-combine-pointer-labels-on-load=false -S | FileCheck %s --check-prefixes=CHECK,NO_COMBINE_LOAD_PTR
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels=true -dfsan-combine-pointer-labels-on-store=true -S | FileCheck %s --check-prefixes=CHECK,COMBINE_STORE_PTR
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels=true -dfsan-track-select-control-flow=false -S | FileCheck %s --check-prefixes=CHECK,NO_SELECT_CONTROL
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels=true -dfsan-debug-nonzero-labels -S | FileCheck %s --check-prefixes=CHECK,DEBUG_NONZERO_LABELS
+; RUN: opt < %s -dfsan -S | FileCheck %s --check-prefixes=CHECK,FAST
+; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-load=false -S | FileCheck %s --check-prefixes=CHECK,NO_COMBINE_LOAD_PTR
+; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-store=true -S | FileCheck %s --check-prefixes=CHECK,COMBINE_STORE_PTR
+; RUN: opt < %s -dfsan -dfsan-track-select-control-flow=false -S | FileCheck %s --check-prefixes=CHECK,NO_SELECT_CONTROL
+; RUN: opt < %s -dfsan -dfsan-debug-nonzero-labels -S | FileCheck %s --check-prefixes=CHECK,DEBUG_NONZERO_LABELS
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@@ -91,11 +85,6 @@ define {i1, i32} @select_struct(i1 %c, {i1, i32} %a, {i1, i32} %b) {
; FAST: %[[#R+9]] = insertvalue { i[[#SBITS]], i[[#SBITS]] } %[[#R+8]], i[[#SBITS]] %[[#R+7]], 1
; FAST: store { i[[#SBITS]], i[[#SBITS]] } %[[#R+9]], { i[[#SBITS]], i[[#SBITS]] }* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to { i[[#SBITS]], i[[#SBITS]] }*), align [[ALIGN]]
- ; LEGACY: @"dfs$select_struct"
- ; LEGACY: [[U:%.*]] = call zeroext i[[#SBITS]] @__dfsan_union
- ; LEGACY: [[P:%.*]] = phi i[[#SBITS]] [ [[U]],
- ; LEGACY: store i[[#SBITS]] [[P]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align 2
-
%s = select i1 %c, {i1, i32} %a, {i1, i32} %b
ret {i1, i32} %s
}
@@ -109,13 +98,6 @@ define { i32, i32 } @asm_struct(i32 %0, i32 %1) {
; FAST: [[S1:%.*]] = insertvalue { i[[#SBITS]], i[[#SBITS]] } [[S0]], i[[#SBITS]] [[E01]], 1
; FAST: store { i[[#SBITS]], i[[#SBITS]] } [[S1]], { i[[#SBITS]], i[[#SBITS]] }* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to { i[[#SBITS]], i[[#SBITS]] }*), align [[ALIGN]]
- ; LEGACY: @"dfs$asm_struct"
- ; LEGACY: [[E1:%.*]] = load i[[#SBITS]], i[[#SBITS]]* inttoptr (i64 add (i64 ptrtoint ([[TLS_ARR]]* @__dfsan_arg_tls to i64), i64 2) to i[[#SBITS]]*), align [[ALIGN:2]]
- ; LEGACY: [[E0:%.*]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; LEGACY: [[E01:%.*]] = call zeroext i[[#SBITS]] @__dfsan_union(i[[#SBITS]] zeroext [[E0]], i[[#SBITS]] zeroext [[E1]])
- ; LEGACY: [[P:%.*]] = phi i[[#SBITS]] [ [[E01]], {{.*}} ], [ [[E0]], {{.*}} ]
- ; LEGACY: store i[[#SBITS]] [[P]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
-
entry:
%a = call { i32, i32 } asm "", "=r,=r,r,r,~{dirflag},~{fpsr},~{flags}"(i32 %0, i32 %1)
ret { i32, i32 } %a
@@ -124,9 +106,6 @@ entry:
define {i32, i32} @const_struct() {
; FAST: @"dfs$const_struct"
; FAST: store { i[[#SBITS]], i[[#SBITS]] } zeroinitializer, { i[[#SBITS]], i[[#SBITS]] }* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to { i[[#SBITS]], i[[#SBITS]] }*), align 2
-
- ; LEGACY: @"dfs$const_struct"
- ; LEGACY: store i[[#SBITS]] 0, i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align 2
ret {i32, i32} { i32 42, i32 11 }
}
@@ -136,9 +115,6 @@ define i1 @extract_struct({i1, i5} %s) {
; FAST: [[EM:%.*]] = extractvalue { i[[#SBITS]], i[[#SBITS]] } [[SM]], 0
; FAST: store i[[#SBITS]] [[EM]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; LEGACY: @"dfs$extract_struct"
- ; LEGACY: [[SM:%.*]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN:2]]
- ; LEGACY: store i[[#SBITS]] [[SM]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
%e2 = extractvalue {i1, i5} %s, 0
ret i1 %e2
}
@@ -149,13 +125,6 @@ define {i1, i5} @insert_struct({i1, i5} %s, i5 %e1) {
; FAST: [[SM:%.*]] = load { i[[#SBITS]], i[[#SBITS]] }, { i[[#SBITS]], i[[#SBITS]] }* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to { i[[#SBITS]], i[[#SBITS]] }*), align [[ALIGN]]
; FAST: [[SM1:%.*]] = insertvalue { i[[#SBITS]], i[[#SBITS]] } [[SM]], i[[#SBITS]] [[EM]], 1
; FAST: store { i[[#SBITS]], i[[#SBITS]] } [[SM1]], { i[[#SBITS]], i[[#SBITS]] }* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to { i[[#SBITS]], i[[#SBITS]] }*), align [[ALIGN]]
-
- ; LEGACY: @"dfs$insert_struct"
- ; LEGACY: [[EM:%.*]] = load i[[#SBITS]], i[[#SBITS]]* inttoptr (i64 add (i64 ptrtoint ([[TLS_ARR]]* @__dfsan_arg_tls to i64), i64 2) to i[[#SBITS]]*), align [[ALIGN:2]]
- ; LEGACY: [[SM:%.*]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
- ; LEGACY: [[U:%.*]] = call zeroext i[[#SBITS]] @__dfsan_union(i[[#SBITS]] zeroext [[SM]], i[[#SBITS]] zeroext [[EM]])
- ; LEGACY: [[P:%.*]] = phi i[[#SBITS]] [ [[U]], {{.*}} ], [ [[SM]], {{.*}} ]
- ; LEGACY: store i[[#SBITS]] [[P]], i[[#SBITS]]* bitcast ([[TLS_ARR]]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
%s1 = insertvalue {i1, i5} %s, i5 %e1, 1
ret {i1, i5} %s1
}
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/union-large.ll b/llvm/test/Instrumentation/DataFlowSanitizer/union-large.ll
deleted file mode 100644
index 04082391f7de9..0000000000000
--- a/llvm/test/Instrumentation/DataFlowSanitizer/union-large.ll
+++ /dev/null
@@ -1,3014 +0,0 @@
-; RUN: opt < %s -dfsan -S | FileCheck %s
-target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
-
-; Check that we use dfsan_union in large functions instead of __dfsan_union.
-
-; CHECK-LABEL: @"dfs$foo"
-define i32 @foo(i32 %a, i32 %b) {
-bb0:
- br label %bb1
-
-bb1:
- br label %bb2
-
-bb2:
- br label %bb3
-
-bb3:
- br label %bb4
-
-bb4:
- br label %bb5
-
-bb5:
- br label %bb6
-
-bb6:
- br label %bb7
-
-bb7:
- br label %bb8
-
-bb8:
- br label %bb9
-
-bb9:
- br label %bb10
-
-bb10:
- br label %bb11
-
-bb11:
- br label %bb12
-
-bb12:
- br label %bb13
-
-bb13:
- br label %bb14
-
-bb14:
- br label %bb15
-
-bb15:
- br label %bb16
-
-bb16:
- br label %bb17
-
-bb17:
- br label %bb18
-
-bb18:
- br label %bb19
-
-bb19:
- br label %bb20
-
-bb20:
- br label %bb21
-
-bb21:
- br label %bb22
-
-bb22:
- br label %bb23
-
-bb23:
- br label %bb24
-
-bb24:
- br label %bb25
-
-bb25:
- br label %bb26
-
-bb26:
- br label %bb27
-
-bb27:
- br label %bb28
-
-bb28:
- br label %bb29
-
-bb29:
- br label %bb30
-
-bb30:
- br label %bb31
-
-bb31:
- br label %bb32
-
-bb32:
- br label %bb33
-
-bb33:
- br label %bb34
-
-bb34:
- br label %bb35
-
-bb35:
- br label %bb36
-
-bb36:
- br label %bb37
-
-bb37:
- br label %bb38
-
-bb38:
- br label %bb39
-
-bb39:
- br label %bb40
-
-bb40:
- br label %bb41
-
-bb41:
- br label %bb42
-
-bb42:
- br label %bb43
-
-bb43:
- br label %bb44
-
-bb44:
- br label %bb45
-
-bb45:
- br label %bb46
-
-bb46:
- br label %bb47
-
-bb47:
- br label %bb48
-
-bb48:
- br label %bb49
-
-bb49:
- br label %bb50
-
-bb50:
- br label %bb51
-
-bb51:
- br label %bb52
-
-bb52:
- br label %bb53
-
-bb53:
- br label %bb54
-
-bb54:
- br label %bb55
-
-bb55:
- br label %bb56
-
-bb56:
- br label %bb57
-
-bb57:
- br label %bb58
-
-bb58:
- br label %bb59
-
-bb59:
- br label %bb60
-
-bb60:
- br label %bb61
-
-bb61:
- br label %bb62
-
-bb62:
- br label %bb63
-
-bb63:
- br label %bb64
-
-bb64:
- br label %bb65
-
-bb65:
- br label %bb66
-
-bb66:
- br label %bb67
-
-bb67:
- br label %bb68
-
-bb68:
- br label %bb69
-
-bb69:
- br label %bb70
-
-bb70:
- br label %bb71
-
-bb71:
- br label %bb72
-
-bb72:
- br label %bb73
-
-bb73:
- br label %bb74
-
-bb74:
- br label %bb75
-
-bb75:
- br label %bb76
-
-bb76:
- br label %bb77
-
-bb77:
- br label %bb78
-
-bb78:
- br label %bb79
-
-bb79:
- br label %bb80
-
-bb80:
- br label %bb81
-
-bb81:
- br label %bb82
-
-bb82:
- br label %bb83
-
-bb83:
- br label %bb84
-
-bb84:
- br label %bb85
-
-bb85:
- br label %bb86
-
-bb86:
- br label %bb87
-
-bb87:
- br label %bb88
-
-bb88:
- br label %bb89
-
-bb89:
- br label %bb90
-
-bb90:
- br label %bb91
-
-bb91:
- br label %bb92
-
-bb92:
- br label %bb93
-
-bb93:
- br label %bb94
-
-bb94:
- br label %bb95
-
-bb95:
- br label %bb96
-
-bb96:
- br label %bb97
-
-bb97:
- br label %bb98
-
-bb98:
- br label %bb99
-
-bb99:
- br label %bb100
-
-bb100:
- br label %bb101
-
-bb101:
- br label %bb102
-
-bb102:
- br label %bb103
-
-bb103:
- br label %bb104
-
-bb104:
- br label %bb105
-
-bb105:
- br label %bb106
-
-bb106:
- br label %bb107
-
-bb107:
- br label %bb108
-
-bb108:
- br label %bb109
-
-bb109:
- br label %bb110
-
-bb110:
- br label %bb111
-
-bb111:
- br label %bb112
-
-bb112:
- br label %bb113
-
-bb113:
- br label %bb114
-
-bb114:
- br label %bb115
-
-bb115:
- br label %bb116
-
-bb116:
- br label %bb117
-
-bb117:
- br label %bb118
-
-bb118:
- br label %bb119
-
-bb119:
- br label %bb120
-
-bb120:
- br label %bb121
-
-bb121:
- br label %bb122
-
-bb122:
- br label %bb123
-
-bb123:
- br label %bb124
-
-bb124:
- br label %bb125
-
-bb125:
- br label %bb126
-
-bb126:
- br label %bb127
-
-bb127:
- br label %bb128
-
-bb128:
- br label %bb129
-
-bb129:
- br label %bb130
-
-bb130:
- br label %bb131
-
-bb131:
- br label %bb132
-
-bb132:
- br label %bb133
-
-bb133:
- br label %bb134
-
-bb134:
- br label %bb135
-
-bb135:
- br label %bb136
-
-bb136:
- br label %bb137
-
-bb137:
- br label %bb138
-
-bb138:
- br label %bb139
-
-bb139:
- br label %bb140
-
-bb140:
- br label %bb141
-
-bb141:
- br label %bb142
-
-bb142:
- br label %bb143
-
-bb143:
- br label %bb144
-
-bb144:
- br label %bb145
-
-bb145:
- br label %bb146
-
-bb146:
- br label %bb147
-
-bb147:
- br label %bb148
-
-bb148:
- br label %bb149
-
-bb149:
- br label %bb150
-
-bb150:
- br label %bb151
-
-bb151:
- br label %bb152
-
-bb152:
- br label %bb153
-
-bb153:
- br label %bb154
-
-bb154:
- br label %bb155
-
-bb155:
- br label %bb156
-
-bb156:
- br label %bb157
-
-bb157:
- br label %bb158
-
-bb158:
- br label %bb159
-
-bb159:
- br label %bb160
-
-bb160:
- br label %bb161
-
-bb161:
- br label %bb162
-
-bb162:
- br label %bb163
-
-bb163:
- br label %bb164
-
-bb164:
- br label %bb165
-
-bb165:
- br label %bb166
-
-bb166:
- br label %bb167
-
-bb167:
- br label %bb168
-
-bb168:
- br label %bb169
-
-bb169:
- br label %bb170
-
-bb170:
- br label %bb171
-
-bb171:
- br label %bb172
-
-bb172:
- br label %bb173
-
-bb173:
- br label %bb174
-
-bb174:
- br label %bb175
-
-bb175:
- br label %bb176
-
-bb176:
- br label %bb177
-
-bb177:
- br label %bb178
-
-bb178:
- br label %bb179
-
-bb179:
- br label %bb180
-
-bb180:
- br label %bb181
-
-bb181:
- br label %bb182
-
-bb182:
- br label %bb183
-
-bb183:
- br label %bb184
-
-bb184:
- br label %bb185
-
-bb185:
- br label %bb186
-
-bb186:
- br label %bb187
-
-bb187:
- br label %bb188
-
-bb188:
- br label %bb189
-
-bb189:
- br label %bb190
-
-bb190:
- br label %bb191
-
-bb191:
- br label %bb192
-
-bb192:
- br label %bb193
-
-bb193:
- br label %bb194
-
-bb194:
- br label %bb195
-
-bb195:
- br label %bb196
-
-bb196:
- br label %bb197
-
-bb197:
- br label %bb198
-
-bb198:
- br label %bb199
-
-bb199:
- br label %bb200
-
-bb200:
- br label %bb201
-
-bb201:
- br label %bb202
-
-bb202:
- br label %bb203
-
-bb203:
- br label %bb204
-
-bb204:
- br label %bb205
-
-bb205:
- br label %bb206
-
-bb206:
- br label %bb207
-
-bb207:
- br label %bb208
-
-bb208:
- br label %bb209
-
-bb209:
- br label %bb210
-
-bb210:
- br label %bb211
-
-bb211:
- br label %bb212
-
-bb212:
- br label %bb213
-
-bb213:
- br label %bb214
-
-bb214:
- br label %bb215
-
-bb215:
- br label %bb216
-
-bb216:
- br label %bb217
-
-bb217:
- br label %bb218
-
-bb218:
- br label %bb219
-
-bb219:
- br label %bb220
-
-bb220:
- br label %bb221
-
-bb221:
- br label %bb222
-
-bb222:
- br label %bb223
-
-bb223:
- br label %bb224
-
-bb224:
- br label %bb225
-
-bb225:
- br label %bb226
-
-bb226:
- br label %bb227
-
-bb227:
- br label %bb228
-
-bb228:
- br label %bb229
-
-bb229:
- br label %bb230
-
-bb230:
- br label %bb231
-
-bb231:
- br label %bb232
-
-bb232:
- br label %bb233
-
-bb233:
- br label %bb234
-
-bb234:
- br label %bb235
-
-bb235:
- br label %bb236
-
-bb236:
- br label %bb237
-
-bb237:
- br label %bb238
-
-bb238:
- br label %bb239
-
-bb239:
- br label %bb240
-
-bb240:
- br label %bb241
-
-bb241:
- br label %bb242
-
-bb242:
- br label %bb243
-
-bb243:
- br label %bb244
-
-bb244:
- br label %bb245
-
-bb245:
- br label %bb246
-
-bb246:
- br label %bb247
-
-bb247:
- br label %bb248
-
-bb248:
- br label %bb249
-
-bb249:
- br label %bb250
-
-bb250:
- br label %bb251
-
-bb251:
- br label %bb252
-
-bb252:
- br label %bb253
-
-bb253:
- br label %bb254
-
-bb254:
- br label %bb255
-
-bb255:
- br label %bb256
-
-bb256:
- br label %bb257
-
-bb257:
- br label %bb258
-
-bb258:
- br label %bb259
-
-bb259:
- br label %bb260
-
-bb260:
- br label %bb261
-
-bb261:
- br label %bb262
-
-bb262:
- br label %bb263
-
-bb263:
- br label %bb264
-
-bb264:
- br label %bb265
-
-bb265:
- br label %bb266
-
-bb266:
- br label %bb267
-
-bb267:
- br label %bb268
-
-bb268:
- br label %bb269
-
-bb269:
- br label %bb270
-
-bb270:
- br label %bb271
-
-bb271:
- br label %bb272
-
-bb272:
- br label %bb273
-
-bb273:
- br label %bb274
-
-bb274:
- br label %bb275
-
-bb275:
- br label %bb276
-
-bb276:
- br label %bb277
-
-bb277:
- br label %bb278
-
-bb278:
- br label %bb279
-
-bb279:
- br label %bb280
-
-bb280:
- br label %bb281
-
-bb281:
- br label %bb282
-
-bb282:
- br label %bb283
-
-bb283:
- br label %bb284
-
-bb284:
- br label %bb285
-
-bb285:
- br label %bb286
-
-bb286:
- br label %bb287
-
-bb287:
- br label %bb288
-
-bb288:
- br label %bb289
-
-bb289:
- br label %bb290
-
-bb290:
- br label %bb291
-
-bb291:
- br label %bb292
-
-bb292:
- br label %bb293
-
-bb293:
- br label %bb294
-
-bb294:
- br label %bb295
-
-bb295:
- br label %bb296
-
-bb296:
- br label %bb297
-
-bb297:
- br label %bb298
-
-bb298:
- br label %bb299
-
-bb299:
- br label %bb300
-
-bb300:
- br label %bb301
-
-bb301:
- br label %bb302
-
-bb302:
- br label %bb303
-
-bb303:
- br label %bb304
-
-bb304:
- br label %bb305
-
-bb305:
- br label %bb306
-
-bb306:
- br label %bb307
-
-bb307:
- br label %bb308
-
-bb308:
- br label %bb309
-
-bb309:
- br label %bb310
-
-bb310:
- br label %bb311
-
-bb311:
- br label %bb312
-
-bb312:
- br label %bb313
-
-bb313:
- br label %bb314
-
-bb314:
- br label %bb315
-
-bb315:
- br label %bb316
-
-bb316:
- br label %bb317
-
-bb317:
- br label %bb318
-
-bb318:
- br label %bb319
-
-bb319:
- br label %bb320
-
-bb320:
- br label %bb321
-
-bb321:
- br label %bb322
-
-bb322:
- br label %bb323
-
-bb323:
- br label %bb324
-
-bb324:
- br label %bb325
-
-bb325:
- br label %bb326
-
-bb326:
- br label %bb327
-
-bb327:
- br label %bb328
-
-bb328:
- br label %bb329
-
-bb329:
- br label %bb330
-
-bb330:
- br label %bb331
-
-bb331:
- br label %bb332
-
-bb332:
- br label %bb333
-
-bb333:
- br label %bb334
-
-bb334:
- br label %bb335
-
-bb335:
- br label %bb336
-
-bb336:
- br label %bb337
-
-bb337:
- br label %bb338
-
-bb338:
- br label %bb339
-
-bb339:
- br label %bb340
-
-bb340:
- br label %bb341
-
-bb341:
- br label %bb342
-
-bb342:
- br label %bb343
-
-bb343:
- br label %bb344
-
-bb344:
- br label %bb345
-
-bb345:
- br label %bb346
-
-bb346:
- br label %bb347
-
-bb347:
- br label %bb348
-
-bb348:
- br label %bb349
-
-bb349:
- br label %bb350
-
-bb350:
- br label %bb351
-
-bb351:
- br label %bb352
-
-bb352:
- br label %bb353
-
-bb353:
- br label %bb354
-
-bb354:
- br label %bb355
-
-bb355:
- br label %bb356
-
-bb356:
- br label %bb357
-
-bb357:
- br label %bb358
-
-bb358:
- br label %bb359
-
-bb359:
- br label %bb360
-
-bb360:
- br label %bb361
-
-bb361:
- br label %bb362
-
-bb362:
- br label %bb363
-
-bb363:
- br label %bb364
-
-bb364:
- br label %bb365
-
-bb365:
- br label %bb366
-
-bb366:
- br label %bb367
-
-bb367:
- br label %bb368
-
-bb368:
- br label %bb369
-
-bb369:
- br label %bb370
-
-bb370:
- br label %bb371
-
-bb371:
- br label %bb372
-
-bb372:
- br label %bb373
-
-bb373:
- br label %bb374
-
-bb374:
- br label %bb375
-
-bb375:
- br label %bb376
-
-bb376:
- br label %bb377
-
-bb377:
- br label %bb378
-
-bb378:
- br label %bb379
-
-bb379:
- br label %bb380
-
-bb380:
- br label %bb381
-
-bb381:
- br label %bb382
-
-bb382:
- br label %bb383
-
-bb383:
- br label %bb384
-
-bb384:
- br label %bb385
-
-bb385:
- br label %bb386
-
-bb386:
- br label %bb387
-
-bb387:
- br label %bb388
-
-bb388:
- br label %bb389
-
-bb389:
- br label %bb390
-
-bb390:
- br label %bb391
-
-bb391:
- br label %bb392
-
-bb392:
- br label %bb393
-
-bb393:
- br label %bb394
-
-bb394:
- br label %bb395
-
-bb395:
- br label %bb396
-
-bb396:
- br label %bb397
-
-bb397:
- br label %bb398
-
-bb398:
- br label %bb399
-
-bb399:
- br label %bb400
-
-bb400:
- br label %bb401
-
-bb401:
- br label %bb402
-
-bb402:
- br label %bb403
-
-bb403:
- br label %bb404
-
-bb404:
- br label %bb405
-
-bb405:
- br label %bb406
-
-bb406:
- br label %bb407
-
-bb407:
- br label %bb408
-
-bb408:
- br label %bb409
-
-bb409:
- br label %bb410
-
-bb410:
- br label %bb411
-
-bb411:
- br label %bb412
-
-bb412:
- br label %bb413
-
-bb413:
- br label %bb414
-
-bb414:
- br label %bb415
-
-bb415:
- br label %bb416
-
-bb416:
- br label %bb417
-
-bb417:
- br label %bb418
-
-bb418:
- br label %bb419
-
-bb419:
- br label %bb420
-
-bb420:
- br label %bb421
-
-bb421:
- br label %bb422
-
-bb422:
- br label %bb423
-
-bb423:
- br label %bb424
-
-bb424:
- br label %bb425
-
-bb425:
- br label %bb426
-
-bb426:
- br label %bb427
-
-bb427:
- br label %bb428
-
-bb428:
- br label %bb429
-
-bb429:
- br label %bb430
-
-bb430:
- br label %bb431
-
-bb431:
- br label %bb432
-
-bb432:
- br label %bb433
-
-bb433:
- br label %bb434
-
-bb434:
- br label %bb435
-
-bb435:
- br label %bb436
-
-bb436:
- br label %bb437
-
-bb437:
- br label %bb438
-
-bb438:
- br label %bb439
-
-bb439:
- br label %bb440
-
-bb440:
- br label %bb441
-
-bb441:
- br label %bb442
-
-bb442:
- br label %bb443
-
-bb443:
- br label %bb444
-
-bb444:
- br label %bb445
-
-bb445:
- br label %bb446
-
-bb446:
- br label %bb447
-
-bb447:
- br label %bb448
-
-bb448:
- br label %bb449
-
-bb449:
- br label %bb450
-
-bb450:
- br label %bb451
-
-bb451:
- br label %bb452
-
-bb452:
- br label %bb453
-
-bb453:
- br label %bb454
-
-bb454:
- br label %bb455
-
-bb455:
- br label %bb456
-
-bb456:
- br label %bb457
-
-bb457:
- br label %bb458
-
-bb458:
- br label %bb459
-
-bb459:
- br label %bb460
-
-bb460:
- br label %bb461
-
-bb461:
- br label %bb462
-
-bb462:
- br label %bb463
-
-bb463:
- br label %bb464
-
-bb464:
- br label %bb465
-
-bb465:
- br label %bb466
-
-bb466:
- br label %bb467
-
-bb467:
- br label %bb468
-
-bb468:
- br label %bb469
-
-bb469:
- br label %bb470
-
-bb470:
- br label %bb471
-
-bb471:
- br label %bb472
-
-bb472:
- br label %bb473
-
-bb473:
- br label %bb474
-
-bb474:
- br label %bb475
-
-bb475:
- br label %bb476
-
-bb476:
- br label %bb477
-
-bb477:
- br label %bb478
-
-bb478:
- br label %bb479
-
-bb479:
- br label %bb480
-
-bb480:
- br label %bb481
-
-bb481:
- br label %bb482
-
-bb482:
- br label %bb483
-
-bb483:
- br label %bb484
-
-bb484:
- br label %bb485
-
-bb485:
- br label %bb486
-
-bb486:
- br label %bb487
-
-bb487:
- br label %bb488
-
-bb488:
- br label %bb489
-
-bb489:
- br label %bb490
-
-bb490:
- br label %bb491
-
-bb491:
- br label %bb492
-
-bb492:
- br label %bb493
-
-bb493:
- br label %bb494
-
-bb494:
- br label %bb495
-
-bb495:
- br label %bb496
-
-bb496:
- br label %bb497
-
-bb497:
- br label %bb498
-
-bb498:
- br label %bb499
-
-bb499:
- br label %bb500
-
-bb500:
- br label %bb501
-
-bb501:
- br label %bb502
-
-bb502:
- br label %bb503
-
-bb503:
- br label %bb504
-
-bb504:
- br label %bb505
-
-bb505:
- br label %bb506
-
-bb506:
- br label %bb507
-
-bb507:
- br label %bb508
-
-bb508:
- br label %bb509
-
-bb509:
- br label %bb510
-
-bb510:
- br label %bb511
-
-bb511:
- br label %bb512
-
-bb512:
- br label %bb513
-
-bb513:
- br label %bb514
-
-bb514:
- br label %bb515
-
-bb515:
- br label %bb516
-
-bb516:
- br label %bb517
-
-bb517:
- br label %bb518
-
-bb518:
- br label %bb519
-
-bb519:
- br label %bb520
-
-bb520:
- br label %bb521
-
-bb521:
- br label %bb522
-
-bb522:
- br label %bb523
-
-bb523:
- br label %bb524
-
-bb524:
- br label %bb525
-
-bb525:
- br label %bb526
-
-bb526:
- br label %bb527
-
-bb527:
- br label %bb528
-
-bb528:
- br label %bb529
-
-bb529:
- br label %bb530
-
-bb530:
- br label %bb531
-
-bb531:
- br label %bb532
-
-bb532:
- br label %bb533
-
-bb533:
- br label %bb534
-
-bb534:
- br label %bb535
-
-bb535:
- br label %bb536
-
-bb536:
- br label %bb537
-
-bb537:
- br label %bb538
-
-bb538:
- br label %bb539
-
-bb539:
- br label %bb540
-
-bb540:
- br label %bb541
-
-bb541:
- br label %bb542
-
-bb542:
- br label %bb543
-
-bb543:
- br label %bb544
-
-bb544:
- br label %bb545
-
-bb545:
- br label %bb546
-
-bb546:
- br label %bb547
-
-bb547:
- br label %bb548
-
-bb548:
- br label %bb549
-
-bb549:
- br label %bb550
-
-bb550:
- br label %bb551
-
-bb551:
- br label %bb552
-
-bb552:
- br label %bb553
-
-bb553:
- br label %bb554
-
-bb554:
- br label %bb555
-
-bb555:
- br label %bb556
-
-bb556:
- br label %bb557
-
-bb557:
- br label %bb558
-
-bb558:
- br label %bb559
-
-bb559:
- br label %bb560
-
-bb560:
- br label %bb561
-
-bb561:
- br label %bb562
-
-bb562:
- br label %bb563
-
-bb563:
- br label %bb564
-
-bb564:
- br label %bb565
-
-bb565:
- br label %bb566
-
-bb566:
- br label %bb567
-
-bb567:
- br label %bb568
-
-bb568:
- br label %bb569
-
-bb569:
- br label %bb570
-
-bb570:
- br label %bb571
-
-bb571:
- br label %bb572
-
-bb572:
- br label %bb573
-
-bb573:
- br label %bb574
-
-bb574:
- br label %bb575
-
-bb575:
- br label %bb576
-
-bb576:
- br label %bb577
-
-bb577:
- br label %bb578
-
-bb578:
- br label %bb579
-
-bb579:
- br label %bb580
-
-bb580:
- br label %bb581
-
-bb581:
- br label %bb582
-
-bb582:
- br label %bb583
-
-bb583:
- br label %bb584
-
-bb584:
- br label %bb585
-
-bb585:
- br label %bb586
-
-bb586:
- br label %bb587
-
-bb587:
- br label %bb588
-
-bb588:
- br label %bb589
-
-bb589:
- br label %bb590
-
-bb590:
- br label %bb591
-
-bb591:
- br label %bb592
-
-bb592:
- br label %bb593
-
-bb593:
- br label %bb594
-
-bb594:
- br label %bb595
-
-bb595:
- br label %bb596
-
-bb596:
- br label %bb597
-
-bb597:
- br label %bb598
-
-bb598:
- br label %bb599
-
-bb599:
- br label %bb600
-
-bb600:
- br label %bb601
-
-bb601:
- br label %bb602
-
-bb602:
- br label %bb603
-
-bb603:
- br label %bb604
-
-bb604:
- br label %bb605
-
-bb605:
- br label %bb606
-
-bb606:
- br label %bb607
-
-bb607:
- br label %bb608
-
-bb608:
- br label %bb609
-
-bb609:
- br label %bb610
-
-bb610:
- br label %bb611
-
-bb611:
- br label %bb612
-
-bb612:
- br label %bb613
-
-bb613:
- br label %bb614
-
-bb614:
- br label %bb615
-
-bb615:
- br label %bb616
-
-bb616:
- br label %bb617
-
-bb617:
- br label %bb618
-
-bb618:
- br label %bb619
-
-bb619:
- br label %bb620
-
-bb620:
- br label %bb621
-
-bb621:
- br label %bb622
-
-bb622:
- br label %bb623
-
-bb623:
- br label %bb624
-
-bb624:
- br label %bb625
-
-bb625:
- br label %bb626
-
-bb626:
- br label %bb627
-
-bb627:
- br label %bb628
-
-bb628:
- br label %bb629
-
-bb629:
- br label %bb630
-
-bb630:
- br label %bb631
-
-bb631:
- br label %bb632
-
-bb632:
- br label %bb633
-
-bb633:
- br label %bb634
-
-bb634:
- br label %bb635
-
-bb635:
- br label %bb636
-
-bb636:
- br label %bb637
-
-bb637:
- br label %bb638
-
-bb638:
- br label %bb639
-
-bb639:
- br label %bb640
-
-bb640:
- br label %bb641
-
-bb641:
- br label %bb642
-
-bb642:
- br label %bb643
-
-bb643:
- br label %bb644
-
-bb644:
- br label %bb645
-
-bb645:
- br label %bb646
-
-bb646:
- br label %bb647
-
-bb647:
- br label %bb648
-
-bb648:
- br label %bb649
-
-bb649:
- br label %bb650
-
-bb650:
- br label %bb651
-
-bb651:
- br label %bb652
-
-bb652:
- br label %bb653
-
-bb653:
- br label %bb654
-
-bb654:
- br label %bb655
-
-bb655:
- br label %bb656
-
-bb656:
- br label %bb657
-
-bb657:
- br label %bb658
-
-bb658:
- br label %bb659
-
-bb659:
- br label %bb660
-
-bb660:
- br label %bb661
-
-bb661:
- br label %bb662
-
-bb662:
- br label %bb663
-
-bb663:
- br label %bb664
-
-bb664:
- br label %bb665
-
-bb665:
- br label %bb666
-
-bb666:
- br label %bb667
-
-bb667:
- br label %bb668
-
-bb668:
- br label %bb669
-
-bb669:
- br label %bb670
-
-bb670:
- br label %bb671
-
-bb671:
- br label %bb672
-
-bb672:
- br label %bb673
-
-bb673:
- br label %bb674
-
-bb674:
- br label %bb675
-
-bb675:
- br label %bb676
-
-bb676:
- br label %bb677
-
-bb677:
- br label %bb678
-
-bb678:
- br label %bb679
-
-bb679:
- br label %bb680
-
-bb680:
- br label %bb681
-
-bb681:
- br label %bb682
-
-bb682:
- br label %bb683
-
-bb683:
- br label %bb684
-
-bb684:
- br label %bb685
-
-bb685:
- br label %bb686
-
-bb686:
- br label %bb687
-
-bb687:
- br label %bb688
-
-bb688:
- br label %bb689
-
-bb689:
- br label %bb690
-
-bb690:
- br label %bb691
-
-bb691:
- br label %bb692
-
-bb692:
- br label %bb693
-
-bb693:
- br label %bb694
-
-bb694:
- br label %bb695
-
-bb695:
- br label %bb696
-
-bb696:
- br label %bb697
-
-bb697:
- br label %bb698
-
-bb698:
- br label %bb699
-
-bb699:
- br label %bb700
-
-bb700:
- br label %bb701
-
-bb701:
- br label %bb702
-
-bb702:
- br label %bb703
-
-bb703:
- br label %bb704
-
-bb704:
- br label %bb705
-
-bb705:
- br label %bb706
-
-bb706:
- br label %bb707
-
-bb707:
- br label %bb708
-
-bb708:
- br label %bb709
-
-bb709:
- br label %bb710
-
-bb710:
- br label %bb711
-
-bb711:
- br label %bb712
-
-bb712:
- br label %bb713
-
-bb713:
- br label %bb714
-
-bb714:
- br label %bb715
-
-bb715:
- br label %bb716
-
-bb716:
- br label %bb717
-
-bb717:
- br label %bb718
-
-bb718:
- br label %bb719
-
-bb719:
- br label %bb720
-
-bb720:
- br label %bb721
-
-bb721:
- br label %bb722
-
-bb722:
- br label %bb723
-
-bb723:
- br label %bb724
-
-bb724:
- br label %bb725
-
-bb725:
- br label %bb726
-
-bb726:
- br label %bb727
-
-bb727:
- br label %bb728
-
-bb728:
- br label %bb729
-
-bb729:
- br label %bb730
-
-bb730:
- br label %bb731
-
-bb731:
- br label %bb732
-
-bb732:
- br label %bb733
-
-bb733:
- br label %bb734
-
-bb734:
- br label %bb735
-
-bb735:
- br label %bb736
-
-bb736:
- br label %bb737
-
-bb737:
- br label %bb738
-
-bb738:
- br label %bb739
-
-bb739:
- br label %bb740
-
-bb740:
- br label %bb741
-
-bb741:
- br label %bb742
-
-bb742:
- br label %bb743
-
-bb743:
- br label %bb744
-
-bb744:
- br label %bb745
-
-bb745:
- br label %bb746
-
-bb746:
- br label %bb747
-
-bb747:
- br label %bb748
-
-bb748:
- br label %bb749
-
-bb749:
- br label %bb750
-
-bb750:
- br label %bb751
-
-bb751:
- br label %bb752
-
-bb752:
- br label %bb753
-
-bb753:
- br label %bb754
-
-bb754:
- br label %bb755
-
-bb755:
- br label %bb756
-
-bb756:
- br label %bb757
-
-bb757:
- br label %bb758
-
-bb758:
- br label %bb759
-
-bb759:
- br label %bb760
-
-bb760:
- br label %bb761
-
-bb761:
- br label %bb762
-
-bb762:
- br label %bb763
-
-bb763:
- br label %bb764
-
-bb764:
- br label %bb765
-
-bb765:
- br label %bb766
-
-bb766:
- br label %bb767
-
-bb767:
- br label %bb768
-
-bb768:
- br label %bb769
-
-bb769:
- br label %bb770
-
-bb770:
- br label %bb771
-
-bb771:
- br label %bb772
-
-bb772:
- br label %bb773
-
-bb773:
- br label %bb774
-
-bb774:
- br label %bb775
-
-bb775:
- br label %bb776
-
-bb776:
- br label %bb777
-
-bb777:
- br label %bb778
-
-bb778:
- br label %bb779
-
-bb779:
- br label %bb780
-
-bb780:
- br label %bb781
-
-bb781:
- br label %bb782
-
-bb782:
- br label %bb783
-
-bb783:
- br label %bb784
-
-bb784:
- br label %bb785
-
-bb785:
- br label %bb786
-
-bb786:
- br label %bb787
-
-bb787:
- br label %bb788
-
-bb788:
- br label %bb789
-
-bb789:
- br label %bb790
-
-bb790:
- br label %bb791
-
-bb791:
- br label %bb792
-
-bb792:
- br label %bb793
-
-bb793:
- br label %bb794
-
-bb794:
- br label %bb795
-
-bb795:
- br label %bb796
-
-bb796:
- br label %bb797
-
-bb797:
- br label %bb798
-
-bb798:
- br label %bb799
-
-bb799:
- br label %bb800
-
-bb800:
- br label %bb801
-
-bb801:
- br label %bb802
-
-bb802:
- br label %bb803
-
-bb803:
- br label %bb804
-
-bb804:
- br label %bb805
-
-bb805:
- br label %bb806
-
-bb806:
- br label %bb807
-
-bb807:
- br label %bb808
-
-bb808:
- br label %bb809
-
-bb809:
- br label %bb810
-
-bb810:
- br label %bb811
-
-bb811:
- br label %bb812
-
-bb812:
- br label %bb813
-
-bb813:
- br label %bb814
-
-bb814:
- br label %bb815
-
-bb815:
- br label %bb816
-
-bb816:
- br label %bb817
-
-bb817:
- br label %bb818
-
-bb818:
- br label %bb819
-
-bb819:
- br label %bb820
-
-bb820:
- br label %bb821
-
-bb821:
- br label %bb822
-
-bb822:
- br label %bb823
-
-bb823:
- br label %bb824
-
-bb824:
- br label %bb825
-
-bb825:
- br label %bb826
-
-bb826:
- br label %bb827
-
-bb827:
- br label %bb828
-
-bb828:
- br label %bb829
-
-bb829:
- br label %bb830
-
-bb830:
- br label %bb831
-
-bb831:
- br label %bb832
-
-bb832:
- br label %bb833
-
-bb833:
- br label %bb834
-
-bb834:
- br label %bb835
-
-bb835:
- br label %bb836
-
-bb836:
- br label %bb837
-
-bb837:
- br label %bb838
-
-bb838:
- br label %bb839
-
-bb839:
- br label %bb840
-
-bb840:
- br label %bb841
-
-bb841:
- br label %bb842
-
-bb842:
- br label %bb843
-
-bb843:
- br label %bb844
-
-bb844:
- br label %bb845
-
-bb845:
- br label %bb846
-
-bb846:
- br label %bb847
-
-bb847:
- br label %bb848
-
-bb848:
- br label %bb849
-
-bb849:
- br label %bb850
-
-bb850:
- br label %bb851
-
-bb851:
- br label %bb852
-
-bb852:
- br label %bb853
-
-bb853:
- br label %bb854
-
-bb854:
- br label %bb855
-
-bb855:
- br label %bb856
-
-bb856:
- br label %bb857
-
-bb857:
- br label %bb858
-
-bb858:
- br label %bb859
-
-bb859:
- br label %bb860
-
-bb860:
- br label %bb861
-
-bb861:
- br label %bb862
-
-bb862:
- br label %bb863
-
-bb863:
- br label %bb864
-
-bb864:
- br label %bb865
-
-bb865:
- br label %bb866
-
-bb866:
- br label %bb867
-
-bb867:
- br label %bb868
-
-bb868:
- br label %bb869
-
-bb869:
- br label %bb870
-
-bb870:
- br label %bb871
-
-bb871:
- br label %bb872
-
-bb872:
- br label %bb873
-
-bb873:
- br label %bb874
-
-bb874:
- br label %bb875
-
-bb875:
- br label %bb876
-
-bb876:
- br label %bb877
-
-bb877:
- br label %bb878
-
-bb878:
- br label %bb879
-
-bb879:
- br label %bb880
-
-bb880:
- br label %bb881
-
-bb881:
- br label %bb882
-
-bb882:
- br label %bb883
-
-bb883:
- br label %bb884
-
-bb884:
- br label %bb885
-
-bb885:
- br label %bb886
-
-bb886:
- br label %bb887
-
-bb887:
- br label %bb888
-
-bb888:
- br label %bb889
-
-bb889:
- br label %bb890
-
-bb890:
- br label %bb891
-
-bb891:
- br label %bb892
-
-bb892:
- br label %bb893
-
-bb893:
- br label %bb894
-
-bb894:
- br label %bb895
-
-bb895:
- br label %bb896
-
-bb896:
- br label %bb897
-
-bb897:
- br label %bb898
-
-bb898:
- br label %bb899
-
-bb899:
- br label %bb900
-
-bb900:
- br label %bb901
-
-bb901:
- br label %bb902
-
-bb902:
- br label %bb903
-
-bb903:
- br label %bb904
-
-bb904:
- br label %bb905
-
-bb905:
- br label %bb906
-
-bb906:
- br label %bb907
-
-bb907:
- br label %bb908
-
-bb908:
- br label %bb909
-
-bb909:
- br label %bb910
-
-bb910:
- br label %bb911
-
-bb911:
- br label %bb912
-
-bb912:
- br label %bb913
-
-bb913:
- br label %bb914
-
-bb914:
- br label %bb915
-
-bb915:
- br label %bb916
-
-bb916:
- br label %bb917
-
-bb917:
- br label %bb918
-
-bb918:
- br label %bb919
-
-bb919:
- br label %bb920
-
-bb920:
- br label %bb921
-
-bb921:
- br label %bb922
-
-bb922:
- br label %bb923
-
-bb923:
- br label %bb924
-
-bb924:
- br label %bb925
-
-bb925:
- br label %bb926
-
-bb926:
- br label %bb927
-
-bb927:
- br label %bb928
-
-bb928:
- br label %bb929
-
-bb929:
- br label %bb930
-
-bb930:
- br label %bb931
-
-bb931:
- br label %bb932
-
-bb932:
- br label %bb933
-
-bb933:
- br label %bb934
-
-bb934:
- br label %bb935
-
-bb935:
- br label %bb936
-
-bb936:
- br label %bb937
-
-bb937:
- br label %bb938
-
-bb938:
- br label %bb939
-
-bb939:
- br label %bb940
-
-bb940:
- br label %bb941
-
-bb941:
- br label %bb942
-
-bb942:
- br label %bb943
-
-bb943:
- br label %bb944
-
-bb944:
- br label %bb945
-
-bb945:
- br label %bb946
-
-bb946:
- br label %bb947
-
-bb947:
- br label %bb948
-
-bb948:
- br label %bb949
-
-bb949:
- br label %bb950
-
-bb950:
- br label %bb951
-
-bb951:
- br label %bb952
-
-bb952:
- br label %bb953
-
-bb953:
- br label %bb954
-
-bb954:
- br label %bb955
-
-bb955:
- br label %bb956
-
-bb956:
- br label %bb957
-
-bb957:
- br label %bb958
-
-bb958:
- br label %bb959
-
-bb959:
- br label %bb960
-
-bb960:
- br label %bb961
-
-bb961:
- br label %bb962
-
-bb962:
- br label %bb963
-
-bb963:
- br label %bb964
-
-bb964:
- br label %bb965
-
-bb965:
- br label %bb966
-
-bb966:
- br label %bb967
-
-bb967:
- br label %bb968
-
-bb968:
- br label %bb969
-
-bb969:
- br label %bb970
-
-bb970:
- br label %bb971
-
-bb971:
- br label %bb972
-
-bb972:
- br label %bb973
-
-bb973:
- br label %bb974
-
-bb974:
- br label %bb975
-
-bb975:
- br label %bb976
-
-bb976:
- br label %bb977
-
-bb977:
- br label %bb978
-
-bb978:
- br label %bb979
-
-bb979:
- br label %bb980
-
-bb980:
- br label %bb981
-
-bb981:
- br label %bb982
-
-bb982:
- br label %bb983
-
-bb983:
- br label %bb984
-
-bb984:
- br label %bb985
-
-bb985:
- br label %bb986
-
-bb986:
- br label %bb987
-
-bb987:
- br label %bb988
-
-bb988:
- br label %bb989
-
-bb989:
- br label %bb990
-
-bb990:
- br label %bb991
-
-bb991:
- br label %bb992
-
-bb992:
- br label %bb993
-
-bb993:
- br label %bb994
-
-bb994:
- br label %bb995
-
-bb995:
- br label %bb996
-
-bb996:
- br label %bb997
-
-bb997:
- br label %bb998
-
-bb998:
- br label %bb999
-
-bb999:
- br label %bb1000
-
-bb1000:
- ; CHECK: call{{.*}}@dfsan_union
- ; CHECK-NOT: phi
- %ab = mul i32 %a, %b
- ret i32 %ab
-}
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/union.ll b/llvm/test/Instrumentation/DataFlowSanitizer/union.ll
index 7fcba2cf3358d..c4ea8d57c6dc1 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/union.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/union.ll
@@ -2,6 +2,9 @@
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
+; CHECK: @__dfsan_shadow_width_bits = weak_odr constant i32 [[#SBITS:]]
+; CHECK: @__dfsan_shadow_width_bytes = weak_odr constant i32 [[#SBYTES:]]
+
@a = common global i32 0
@b = common global i32 0
@@ -9,10 +12,10 @@ target triple = "x86_64-unknown-linux-gnu"
; CHECK-LABEL: @"dfs$f"
define void @f(i32 %x, i32 %y) {
- ; CHECK: call{{.*}}__dfsan_union
+ ; CHECK: or i[[#SBITS]]
%xay = add i32 %x, %y
store i32 %xay, i32* @a
- ; CHECK-NOT: call{{.*}}__dfsan_union
+ ; CHECK-NOT: or i[[#SBITS]]
%xmy = mul i32 %x, %y
store i32 %xmy, i32* @b
ret void
@@ -26,13 +29,13 @@ define void @g(i1 %p, i32 %x, i32 %y) {
br i1 %p, label %l1, label %l2
l1:
- ; CHECK: call{{.*}}__dfsan_union
+ ; CHECK: or i[[#SBITS]]
%xay = add i32 %x, %y
store i32 %xay, i32* @a
br label %l3
l2:
- ; CHECK: call{{.*}}__dfsan_union
+ ; CHECK: or i[[#SBITS]]
%xmy = mul i32 %x, %y
store i32 %xmy, i32* @b
br label %l3
@@ -45,9 +48,9 @@ l3:
; CHECK-LABEL: @"dfs$h"
define i32 @h(i32 %x, i32 %y) {
- ; CHECK: call{{.*}}__dfsan_union
+ ; CHECK: or i[[#SBITS]]
%xay = add i32 %x, %y
- ; CHECK-NOT: call{{.*}}__dfsan_union
+ ; CHECK-NOT: or i[[#SBITS]]
%xayax = add i32 %xay, %x
ret i32 %xayax
}
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/vector.ll b/llvm/test/Instrumentation/DataFlowSanitizer/vector.ll
index 51de5f620c716..623f1afb28eef 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/vector.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/vector.ll
@@ -1,7 +1,5 @@
-; RUN: opt < %s -dfsan -S | FileCheck %s --check-prefixes=CHECK,TLS_ABI,TLS_ABI_LEGACY
; RUN: opt < %s -dfsan -dfsan-args-abi -S | FileCheck %s --check-prefixes=CHECK,ARGS_ABI
-; RUN: opt < %s -dfsan -dfsan-fast-16-labels=true -S | FileCheck %s --check-prefixes=CHECK,TLS_ABI,TLS_ABI_FAST
-; RUN: opt < %s -dfsan -dfsan-fast-8-labels=true -S | FileCheck %s --check-prefixes=CHECK,TLS_ABI,TLS_ABI_FAST
+; RUN: opt < %s -dfsan -S | FileCheck %s --check-prefixes=CHECK,TLS_ABI
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@@ -37,12 +35,7 @@ define <4 x i1> @icmp_vector(<4 x i8> %a, <4 x i8> %b) {
; TLS_ABI-LABEL: @"dfs$icmp_vector"
; TLS_ABI-NEXT: %[[B:.*]] = load i[[#SBITS]], i[[#SBITS]]* inttoptr (i64 add (i64 ptrtoint ([100 x i64]* @__dfsan_arg_tls to i64), i64 2) to i[[#SBITS]]*), align [[ALIGN:2]]
; TLS_ABI-NEXT: %[[A:.*]] = load i[[#SBITS]], i[[#SBITS]]* bitcast ([100 x i64]* @__dfsan_arg_tls to i[[#SBITS]]*), align [[ALIGN]]
-
- ; TLS_ABI_LEGACY: %[[U:.*]] = call zeroext i[[#SBITS]] @__dfsan_union(i[[#SBITS]] zeroext %[[A]], i[[#SBITS]] zeroext %[[B]])
- ; TLS_ABI_LEGACY: %[[L:.*]] = phi i[[#SBITS]] [ %[[U]], {{.*}} ], [ %[[A]], {{.*}} ]
-
- ; COM: With fast labels enabled, union is just an OR.
- ; TLS_ABI_FAST: %[[L:.*]] = or i[[#SBITS]] %[[A]], %[[B]]
+ ; TLS_ABI: %[[L:.*]] = or i[[#SBITS]] %[[A]], %[[B]]
; TLS_ABI: %r = icmp eq <4 x i8> %a, %b
; TLS_ABI: store i[[#SBITS]] %[[L]], i[[#SBITS]]* bitcast ([100 x i64]* @__dfsan_retval_tls to i[[#SBITS]]*), align [[ALIGN]]
More information about the llvm-commits
mailing list