Loads and stores of unsized types?

This came up in D20764, this IR verifies today:

%X = type opaque

define void @f_0(%X* %ptr) {
  %t = load %X, %X* %ptr
  ret void
}

define void @f_1(%X %val, %X* %ptr) {
  store %X %val, %X* %ptr
  ret void
}

which I found surprising -- what does it mean to load / store values
of unknown sizes? Passing it to llc fails an assertion. Are there
legitimate cases where we'd want to generate such IR?

-- Sanjoy

This came up in D20764, this IR verifies today:

%X = type opaque

define void @f_0(%X* %ptr) {
  %t = load %X, %X* %ptr
  ret void
}

define void @f_1(%X %val, %X* %ptr) {
  store %X %val, %X* %ptr
  ret void
}

which I found surprising -- what does it mean to load / store values
of unknown sizes? Passing it to llc fails an assertion. Are there
legitimate cases where we'd want to generate such IR?

You can also get it to crash by throwing it at InstCombine. I think we
should add a verifier rule to make memory operations sized.

To reiterate what I said on IRC, I agree with David and would expect the verifier to reject unsized loads and stores.

Patch for review: http://reviews.llvm.org/D20846