[llvm-commits] Slot alignment
Bill Wendling
isanbard at gmail.com
Tue Jul 1 21:07:30 PDT 2008
On Jul 1, 2008, at 6:38 PM, Mon P Wang wrote:
> Hi,
>
> The following small patch is to fix a problem when we have to
> EmitStackConvert. It is possible that two types of the same size
> may have different alignment (e.g., users may specify a stricter
> alignment than native or vector types may have stricter alignment
> than a scalar of the same size). If one ever tries to do stack
> convert of this, we create a stack slot with the alignment of the
> destination and we can generate a load/store with greater alignment
> than the stack slot that we have created. The following patch
> generates a StackSlot with the minimum alignment necessary for both
> the source and the destination type. If you have any comments,
> please let me know.
>
Hi Mon Ping,
A couple of comments.
Index: include/llvm/CodeGen/SelectionDAG.h
===================================================================
--- include/llvm/CodeGen/SelectionDAG.h (revision 52999)
+++ include/llvm/CodeGen/SelectionDAG.h (working copy)
@@ -574,9 +574,11 @@
void dump() const;
/// CreateStackTemporary - Create a stack temporary, suitable for
holding the
- /// specified value type.
+ /// specified value type. If minAlign is specified, the slot size
will have
+ /// at least that alignment.
SDOperand CreateStackTemporary(MVT VT);
-
+ SDOperand CreateStackTemporary(MVT VT, unsigned minAlign);
+
/// FoldSetCC - Constant fold a setcc to true or false.
SDOperand FoldSetCC(MVT VT, SDOperand N1,
SDOperand N2, ISD::CondCode Cond);
Index: lib/CodeGen/SelectionDAG/SelectionDAG.cpp
===================================================================
--- lib/CodeGen/SelectionDAG/SelectionDAG.cpp (revision 52999)
+++ lib/CodeGen/SelectionDAG/SelectionDAG.cpp (working copy)
@@ -1081,15 +1081,20 @@
/// CreateStackTemporary - Create a stack temporary, suitable for
holding the
/// specified value type.
SDOperand SelectionDAG::CreateStackTemporary(MVT VT) {
+ return CreateStackTemporary(VT, 1);
+}
+
+SDOperand SelectionDAG::CreateStackTemporary(MVT VT, unsigned
minAlign) {
It's not necessary to create two functions. Just specify a default
value for minAlign like so:
+ SDOperand CreateStackTemporary(MVT VT, unsigned minAlign = 1);
+ if (StackAlign < minAlign)
+ StackAlign = minAlign;
You could use std::max here.
More information about the llvm-commits
mailing list