aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/memops.c
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2017-01-04 04:03:18 +0100
committerChristopher Li <sparse@chrisli.org>2017-02-13 09:34:45 +0800
commit0ee83ccffa3437fa97058c7cdc28961f59476c9d (patch)
tree93777aa6faa33beb7890058fea927cbea890bae6 /memops.c
parentd8ce303b14f6c7e0c9f0ec37781404d735476d62 (diff)
downloadsparse-dev-0ee83ccffa3437fa97058c7cdc28961f59476c9d.tar.gz
volatile loads must not be simplified
memops.c:simplify_loads() tries to simplify all loads, even volatile ones. For example, on the following code: static int foo(volatile int *a, int v) { *a = v; return *a; } test-linearize returns something like: foo: store.32 %arg2 -> 0[%arg1] ret.32 %arg2 while the correct output is more like: foo: store.32 %arg2 -> 0[%arg1] load.32 %r5 <- 0[%arg1] ret.32 %r5 The fix is to simply ignore loads with the 'volatile' modifier. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com> Signed-off-by: Christopher Li <sparse@chrisli.org>
Diffstat (limited to 'memops.c')
-rw-r--r--memops.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/memops.c b/memops.c
index 45bd3401..6dac1f57 100644
--- a/memops.c
+++ b/memops.c
@@ -99,6 +99,9 @@ static void simplify_loads(struct basic_block *bb)
/* Check for illegal offsets.. */
check_access(insn);
+ if (insn->type->ctype.modifiers & MOD_VOLATILE)
+ continue;
+
RECURSE_PTR_REVERSE(insn, dom) {
int dominance;
if (!dom->bb)