Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

align src for IrInstructionArrayToVector #2943

Merged
merged 1 commit into from
Jul 24, 2019

Conversation

mikdusan
Copy link
Member

@mikdusan mikdusan commented Jul 24, 2019

closes #2942

reduction.zig - executable segfaults

pub fn main() void {
    var foo: f32 = 3.14;
    var arr = [4]f32 { foo, 1.5, 0.0, 0.0 };
    var vec: @Vector(4, f32) = arr;
}
  • what follows is llvm-ir comparison of broken vs. fixed
  • hint: last load operation uses incorrect alignment 16

llvm-ir diff

--- broken.ll	2019-07-24 13:13:00.467787038 -0400
+++ fixed.ll	2019-07-24 13:13:04.055156465 -0400
@@ -16,7 +16,7 @@
   store float 0.000000e+00, float* %4, align 4, !dbg !11376
   call void @llvm.dbg.declare(metadata [4 x float]* %arr, metadata !11368, metadata !DIExpression()), !dbg !11377
   %5 = bitcast [4 x float]* %arr to <4 x float>*, !dbg !11378
-  %6 = load <4 x float>, <4 x float>* %5, align 16, !dbg !11378
+  %6 = load <4 x float>, <4 x float>* %5, align 4, !dbg !11378
   store <4 x float> %6, <4 x float>* %vec, align 16, !dbg !11379
   call void @llvm.dbg.declare(metadata <4 x float>* %vec, metadata !11370, metadata !DIExpression()), !dbg !11379
   ret void, !dbg !11380

broken llvm-ir

define internal fastcc void @main.0() unnamed_addr #0 !dbg !11362 {
Entry:
  %foo = alloca float, align 4
  %arr = alloca [4 x float], align 4
  %vec = alloca <4 x float>, align 16
  store float 0x40091EB860000000, float* %foo, align 4, !dbg !11372
  call void @llvm.dbg.declare(metadata float* %foo, metadata !11365, metadata !DIExpression()), !dbg !11372
  %0 = getelementptr inbounds [4 x float], [4 x float]* %arr, i64 0, i64 0, !dbg !11373
  %1 = load float, float* %foo, align 4, !dbg !11373
  store float %1, float* %0, align 4, !dbg !11373
  %2 = getelementptr inbounds [4 x float], [4 x float]* %arr, i64 0, i64 1, !dbg !11374
  %3 = getelementptr inbounds [4 x float], [4 x float]* %arr, i64 0, i64 2, !dbg !11375
  %4 = getelementptr inbounds [4 x float], [4 x float]* %arr, i64 0, i64 3, !dbg !11376
  store float 1.500000e+00, float* %2, align 4, !dbg !11374
  store float 0.000000e+00, float* %3, align 4, !dbg !11375
  store float 0.000000e+00, float* %4, align 4, !dbg !11376
  call void @llvm.dbg.declare(metadata [4 x float]* %arr, metadata !11368, metadata !DIExpression()), !dbg !11377
  %5 = bitcast [4 x float]* %arr to <4 x float>*, !dbg !11378
  %6 = load <4 x float>, <4 x float>* %5, align 16, !dbg !11378
  store <4 x float> %6, <4 x float>* %vec, align 16, !dbg !11379
  call void @llvm.dbg.declare(metadata <4 x float>* %vec, metadata !11370, metadata !DIExpression()), !dbg !11379
  ret void, !dbg !11380
}

fixed llvm-ir

define internal fastcc void @main.0() unnamed_addr #0 !dbg !11362 {
Entry:
  %foo = alloca float, align 4
  %arr = alloca [4 x float], align 4
  %vec = alloca <4 x float>, align 16
  store float 0x40091EB860000000, float* %foo, align 4, !dbg !11372
  call void @llvm.dbg.declare(metadata float* %foo, metadata !11365, metadata !DIExpression()), !dbg !11372
  %0 = getelementptr inbounds [4 x float], [4 x float]* %arr, i64 0, i64 0, !dbg !11373
  %1 = load float, float* %foo, align 4, !dbg !11373
  store float %1, float* %0, align 4, !dbg !11373
  %2 = getelementptr inbounds [4 x float], [4 x float]* %arr, i64 0, i64 1, !dbg !11374
  %3 = getelementptr inbounds [4 x float], [4 x float]* %arr, i64 0, i64 2, !dbg !11375
  %4 = getelementptr inbounds [4 x float], [4 x float]* %arr, i64 0, i64 3, !dbg !11376
  store float 1.500000e+00, float* %2, align 4, !dbg !11374
  store float 0.000000e+00, float* %3, align 4, !dbg !11375
  store float 0.000000e+00, float* %4, align 4, !dbg !11376
  call void @llvm.dbg.declare(metadata [4 x float]* %arr, metadata !11368, metadata !DIExpression()), !dbg !11377
  %5 = bitcast [4 x float]* %arr to <4 x float>*, !dbg !11378
  %6 = load <4 x float>, <4 x float>* %5, align 4, !dbg !11378
  store <4 x float> %6, <4 x float>* %vec, align 16, !dbg !11379
  call void @llvm.dbg.declare(metadata <4 x float>* %vec, metadata !11370, metadata !DIExpression()), !dbg !11379
  ret void, !dbg !11380
}

@andrewrk andrewrk merged commit 8e4f3a6 into ziglang:master Jul 24, 2019
@andrewrk
Copy link
Member

Thanks! Test added in 9e11f67

@mikdusan mikdusan deleted the align-IrInstructionArrayToVector branch November 28, 2019 00:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Assigning an array with a non-const element value to another array (or vector) causes a segfault.
2 participants