[LLVMdev] Weird volatile propagation ?
Arnaud A. de Grandmaison
arnaud.allarddegrandmaison at parrot.com
Fri Jan 18 09:30:49 PST 2013
Hi All,
Using clang+llvm at head, I noticed a weird behaviour with the following
reduced testcase :
$ cat test.c
#include <stdint.h>
struct R {
uint16_t a;
uint16_t b;
};
volatile struct R * const addr = (volatile struct R *) 416;
void test(uint16_t a)
{
struct R r = { a, 1 };
*addr = r;
}
$ clang -O2 -o - -emit-llvm -S -c test.c
; ModuleID = 'test.c'
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"
%struct.R = type { i16, i16 }
@addr = constant %struct.R* inttoptr (i64 416 to %struct.R*), align 8
define void @test(i16 zeroext %a) nounwind uwtable {
%r.sroa.0 = alloca i16, align 2
%r.sroa.1 = alloca i16, align 2
store i16 %a, i16* %r.sroa.0, align 2
store i16 1, i16* %r.sroa.1, align 2
%r.sroa.0.0.load3 = load volatile i16* %r.sroa.0, align 2
store volatile i16 %r.sroa.0.0.load3, i16* inttoptr (i64 416 to i16*), align 32
%r.sroa.1.0.load2 = load volatile i16* %r.sroa.1, align 2
store volatile i16 %r.sroa.1.0.load2, i16* inttoptr (i64 418 to i16*), align 2
ret void
}
When I would have expected something like :
define void @test(i16 zeroext %a) nounwind uwtable {
store volatile i16 %a, i16* inttoptr (i64 416 to i16*), align 2
store volatile i16 1, i16* inttoptr (i64 418 to i16*), align 2
ret void
}
Using LLVM-3.1, I get the expected code. Would this ring a bell to anybody ?
Cheers,
--
Arnaud de Grandmaison
More information about the llvm-dev
mailing list