From eca55afea3018f4f322a4b9bf0a3a45ba6014962 Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Fri, 16 Jul 2010 00:55:21 +0000 Subject: Fix for PR3800: make sure not to evaluate the expression for a read-write asm operand twice. llvm-svn: 108489 --- clang/test/CodeGen/asm-inout.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 clang/test/CodeGen/asm-inout.c (limited to 'clang/test/CodeGen/asm-inout.c') diff --git a/clang/test/CodeGen/asm-inout.c b/clang/test/CodeGen/asm-inout.c new file mode 100644 index 00000000000..f04276693e2 --- /dev/null +++ b/clang/test/CodeGen/asm-inout.c @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s +// PR3800 +int *foo(void); + +// CHECK: @test1 +void test1() { + // CHECK: [[REGCALLRESULT:%[a-zA-Z0-9\.]+]] = call i32* @foo() + // CHECK: call void asm "foobar", "=*m,*m,~{dirflag},~{fpsr},~{flags}"(i32* [[REGCALLRESULT]], i32* [[REGCALLRESULT]]) + asm ("foobar" : "+m"(*foo())); +} + +// CHECK: @test2 +void test2() { + // CHECK: [[REGCALLRESULT:%[a-zA-Z0-9\.]+]] = call i32* @foo() + // CHECK: load i32* [[REGCALLRESULT]] + // CHECK: call i32 asm + // CHECK: store i32 {{%[a-zA-Z0-9\.]+}}, i32* [[REGCALLRESULT]] + asm ("foobar" : "+r"(*foo())); +} -- cgit v1.2.3