[cfe-commits] r143596 - /cfe/trunk/lib/CodeGen/TargetInfo.cpp

Hatanaka, Akira ahatanaka at mips.com
Wed Nov 2 18:09:59 PDT 2011


Yes, that should be 40-bits.

The structure with sub-doubleword fields was needed to handle packed structures whose size is not a multiple of 64. When I test it with the program below, a full double word load is used to load the last field of struct S4 instead of a byte load. Is this legal? It seems incorrect to me to load from a memory location outside the global g2.

### source program.
typedef struct {
  int i1, i2;
  double d1;
  char f1;
} __attribute__((packed)) S4;

void foo110(S4, int, int);

extern S4 g2, g1;

void foo100(int a1, S4 a2, int a3) {
  g2 = a2;
  foo110(g1, a3, a1);
}

### everything with 64-bit chunks.
; ModuleID = 'f1.c'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v64:64:64-n32"
target triple = "mips64el-unknown-linux"

%struct.S4 = type <{ i32, i32, double, i8 }>

@g2 = external global %struct.S4
@g1 = external global %struct.S4

define void @foo100(i32 %a1, i64 %a2.coerce0, double %a2.coerce1, i64 %a2.coerce2, i32 %a3) nounwind {
entry:
  %0 = zext i64 %a2.coerce0 to i136
  %1 = bitcast double %a2.coerce1 to i64
  %2 = zext i64 %1 to i136
  %3 = shl nuw nsw i136 %2, 64
  %4 = zext i64 %a2.coerce2 to i136
  %5 = shl i136 %4, 128
  %ins3 = or i136 %5, %0
  %ins = or i136 %ins3, %3
  store i136 %ins, i136* bitcast (%struct.S4* @g2 to i136*), align 1
  %6 = load i64* bitcast (%struct.S4* @g1 to i64*), align 1
  %7 = load double* getelementptr inbounds (%struct.S4* @g1, i64 0, i32 2), align 1
  %8 = load i64* bitcast (i8* getelementptr inbounds (%struct.S4* @g1, i64 0, i32 3) to i64*), align 1
  tail call void @foo110(i64 %6, double %7, i64 %8, i32 %a3, i32 %a1) nounwind
  ret void
}

declare void @foo110(i64, double, i64, i32, i32)

The code in trunk emits this:

### structure with sub-doubleword fields.
; ModuleID = 'f1.c'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v64:64:64-n32"
target triple = "mips64el-unknown-linux"

%struct.S4 = type <{ i32, i32, double, i8 }>

@g2 = external global %struct.S4
@g1 = external global %struct.S4

define void @foo100(i32 %a1, i64 %a2.coerce0, double %a2.coerce1, { i8 } %a2.coerce2, i32 %a3) nounwind {
entry:
  %0 = zext i64 %a2.coerce0 to i136
  %1 = bitcast double %a2.coerce1 to i64
  %2 = zext i64 %1 to i136
  %3 = shl nuw nsw i136 %2, 64
  %4 = extractvalue { i8 } %a2.coerce2, 0
  %5 = zext i8 %4 to i136
  %6 = shl nuw i136 %5, 128
  %ins3 = or i136 %3, %0
  %ins = or i136 %ins3, %6
  store i136 %ins, i136* bitcast (%struct.S4* @g2 to i136*), align 1
  %7 = load i64* bitcast (%struct.S4* @g1 to i64*), align 1
  %8 = load double* getelementptr inbounds (%struct.S4* @g1, i64 0, i32 2), align 1
  %9 = load { i8 }* bitcast (i8* getelementptr inbounds (%struct.S4* @g1, i64 0, i32 3) to { i8 }*), align 1
  tail call void @foo110(i64 %7, double %8, { i8 } %9, i32 %a3, i32 %a1) nounwind
  ret void
}

declare void @foo110(i64, double, { i8 }, i32, i32)

______________________________________
From: Eli Friedman [eli.friedman at gmail.com]
Sent: Wednesday, November 02, 2011 5:22 PM
To: Hatanaka, Akira
Cc: cfe-commits at cs.uiuc.edu
Subject: Re: [cfe-commits] r143596 - /cfe/trunk/lib/CodeGen/TargetInfo.cpp

On Wed, Nov 2, 2011 at 4:54 PM, Akira Hatanaka <ahatanaka at mips.com> wrote:
> +  // Add ((StructSize - LastOffset) / 64) args of type i64.
> +  for (unsigned N = (StructSize - LastOffset) / 64; N; --N)
> +    ArgList.push_back(I64);
> +
> +  // Whatever is left over goes into a structure consisting of sub-doubleword
> +  // types. For example, if the size of the remainder is 40-bytes,
> +  // struct {i32, i8} is added to ArgList.

I assume you mean bits?

>From looking over the ABI description, this doesn't look right...
everything should be using i64 chunks.

-Eli




More information about the cfe-commits mailing list