[LLVMdev] LLVM introduces racy read - Unsafe transformation?

sohachak at mpi-sws.org
Mon, 26 Jan 2015 15:22:18 -0000

Hi,

I am looking for thoughts on the following LLVM transformation.

Consider the following transformation which replaces conditional load(a)
with load(a);select instructions.

Source
--------
int a; bool flag;

int readA() {
 int r=0;
 if(flag) {
   r = a;
 }
return r;
}

Command
--------
clang++ -std=c++11 -pthread -emit-llvm <filename>.cpp -S;opt -O3
<filename>.ll -o <filename>.opt.bc -S

Target
-------

define i32 @_Z5readAv() #3 {
entry:
  %0 = load i8* @flag, align 1
  %1 = and i8 %0, 1
  %tobool = icmp eq i8 %1, 0
  %2 = load i32* @a, align 4
  %. = select i1 %tobool, i32 0, i32 %2
  ret i32 %.
}

Consider the following function writeA() runs in parallel with readA().

void writeA(){
  a = 42;
}

The source program has no data race if flag=false. But the target program
is racy due to the introduced load(a) operation.

This is a benign race since the load(a) is used only when flag=true.

However, according to the C11/C++11 consistency model the semantics of a
racy program is undefined and may have arbitrary behavior.

Thus the transformation is unsafe.

Note: The full example files are attached.

Regards,
soham
-------------- next part --------------
A non-text attachment was scrubbed...
Name: loadrace.zip
Type: application/x-zip-compressed
Size: 28366 bytes
Desc: not available
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20150126/31013770/attachment.bin>