Push/Pop/AddSP/SubSP always modify ESP
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Thu, 14 Sep 2006 14:14:46 +0000 (14:14 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Thu, 14 Sep 2006 14:14:46 +0000 (14:14 +0000)
ir/be/ia32/bearch_ia32.c

index 7cef37a..6a4f64d 100644 (file)
@@ -264,13 +264,19 @@ static arch_irn_flags_t ia32_get_flags(const void *self, const ir_node *irn) {
        if(is_Proj(irn)) {
                ir_node *pred = get_Proj_pred(irn);
                if(is_ia32_Push(pred) && get_Proj_proj(irn) == pn_ia32_Push_stack) {
-                       return arch_irn_flags_modify_sp;
+                       /* Push modifies always ESP, this cannot be changed */
+                       return arch_irn_flags_modify_sp | arch_irn_flags_ignore;
                }
                if(is_ia32_Pop(pred) && get_Proj_proj(irn) == pn_ia32_Pop_stack) {
-                       return arch_irn_flags_modify_sp;
+                       return arch_irn_flags_modify_sp | arch_irn_flags_ignore;
                }
                if(is_ia32_AddSP(pred) && get_Proj_proj(irn) == pn_ia32_AddSP_stack) {
-                       return arch_irn_flags_modify_sp;
+                       /* AddSP modifies always ESP, this cannot be changed */
+                       return arch_irn_flags_modify_sp | arch_irn_flags_ignore;
+               }
+               if(is_ia32_SubSP(pred) && get_Proj_proj(irn) == pn_ia32_SubSP_stack) {
+                       /* SubSP modifies always ESP, this cannot be changed */
+                       return arch_irn_flags_modify_sp | arch_irn_flags_ignore;
                }
        }