Index: src/GenPoly/Lvalue.cc
===================================================================
--- src/GenPoly/Lvalue.cc	(revision 397c101ac3d4d5036b990774a5ad5b6598528e82)
+++ src/GenPoly/Lvalue.cc	(revision 78cdb060aebec67f15c7fd9fe672626963efe0b5)
@@ -60,5 +60,5 @@
 		}
 
-		struct ReferenceConversions final : public WithStmtsToAdd {
+		struct ReferenceConversions final : public WithStmtsToAdd, public WithGuards {
 			Expression * postmutate( CastExpr * castExpr );
 			Expression * postmutate( AddressExpr * addrExpr );
@@ -71,4 +71,14 @@
 
 		struct FixIntrinsicResult final : public WithGuards {
+			enum {
+				NoSkip,
+				Skip,
+				SkipInProgress
+			} skip = NoSkip;
+
+			void premutate( AsmExpr * ) { GuardValue( skip ); skip = Skip; }
+			void premutate( ApplicationExpr * ) { GuardValue( skip ); skip = (skip == Skip) ? SkipInProgress : NoSkip; }
+
+
 			Expression * postmutate( ApplicationExpr * appExpr );
 			void premutate( FunctionDecl * funcDecl );
@@ -162,5 +172,5 @@
 
 		Expression * FixIntrinsicResult::postmutate( ApplicationExpr * appExpr ) {
-			if ( isIntrinsicReference( appExpr ) ) {
+			if ( skip != SkipInProgress && isIntrinsicReference( appExpr ) ) {
 				// eliminate reference types from intrinsic applications - now they return lvalues
 				ReferenceType * result = strict_dynamic_cast< ReferenceType * >( appExpr->result );
Index: tests/.expect/references.txt
===================================================================
--- tests/.expect/references.txt	(revision 397c101ac3d4d5036b990774a5ad5b6598528e82)
+++ tests/.expect/references.txt	(revision 78cdb060aebec67f15c7fd9fe672626963efe0b5)
@@ -36,4 +36,5 @@
 3
 3 9 { 1., 7. }, [1, 2, 3]
+4
 Destructing a Y
 Destructing a Y
Index: tests/references.cfa
===================================================================
--- tests/references.cfa	(revision 397c101ac3d4d5036b990774a5ad5b6598528e82)
+++ tests/references.cfa	(revision 78cdb060aebec67f15c7fd9fe672626963efe0b5)
@@ -119,4 +119,14 @@
 		f( 3, a + b, (S){ 1.0, 7.0 }, (int [3]){ 1, 2, 3 } ); // two rvalue to reference
 	}
+
+	{
+		int a = 3;
+		int *p = &a;
+		asm (
+			"incl %[p]\n\t" :
+			: [p] "m" (*p)
+		);
+		printf("%d\n", a);
+	}
 }
 
