Fix PR2346 by marking vaarg as volatile so that licm doesn't try to
authorChris Lattner <sabre@nondot.org>
Tue, 20 May 2008 22:05:28 +0000 (22:05 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 20 May 2008 22:05:28 +0000 (22:05 +0000)
hoist them.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51356 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/AliasSetTracker.cpp
test/Transforms/LICM/2008-05-20-AliasSetVAArg.ll [new file with mode: 0644]

index 68603e53b64ee40138123f257a9147dd8ee7b910..228bb80ae3b8a1866d50048116031d057be4072d 100644 (file)
@@ -294,7 +294,10 @@ bool AliasSetTracker::add(FreeInst *FI) {
 
 bool AliasSetTracker::add(VAArgInst *VAAI) {
   bool NewPtr;
-  addPointer(VAAI->getOperand(0), ~0, AliasSet::ModRef, NewPtr);
+  AliasSet &AS = addPointer(VAAI->getOperand(0), ~0, AliasSet::ModRef, NewPtr);
+  
+  // Treat vaarg instructions as volatile (not to be moved).
+  AS.setVolatile();
   return NewPtr;
 }
 
diff --git a/test/Transforms/LICM/2008-05-20-AliasSetVAArg.ll b/test/Transforms/LICM/2008-05-20-AliasSetVAArg.ll
new file mode 100644 (file)
index 0000000..dcb20e7
--- /dev/null
@@ -0,0 +1,30 @@
+; RUN: llvm-as < %s | opt -licm -disable-output
+; PR2346
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
+target triple = "i686-pc-linux-gnu"
+       %struct._zval_struct = type { %union._double, i32, i8, i8, i8, i8 }
+       %union._double = type { double }
+
+define i8* @zend_fetch_resource(%struct._zval_struct** %passed_id, i32 %default_id, i8* %resource_type_name, i32* %found_resource_type, i32 %num_resource_types, ...) {
+entry:
+       br label %whilebody.i.i
+
+whilebody.i.i:         ; preds = %whilebody.i.i, %entry
+       br i1 false, label %ifthen.i.i, label %whilebody.i.i
+
+ifthen.i.i:            ; preds = %whilebody.i.i
+       br label %forcond
+
+forcond:               ; preds = %forbody, %ifthen.i.i
+       br i1 false, label %forbody, label %afterfor
+
+forbody:               ; preds = %forcond
+       va_arg i8** null, i32           ; <i32>:0 [#uses=0]
+       br i1 false, label %ifthen59, label %forcond
+
+ifthen59:              ; preds = %forbody
+       unreachable
+
+afterfor:              ; preds = %forcond
+       ret i8* null
+}