| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt < %s -passes=slp-vectorizer -mtriple=wasm32-unknown-unknown -mattr=+reference-types -S | FileCheck %s |
| |
| ; The SLP vectorizer used to try to vectorize the two externref PHIs |
| ; below into a <2 x externref> and then crashed. |
| ; Check that they are left alone and the vectorizer doesn't crash. |
| |
| target datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20" |
| target triple = "wasm32-unknown-unknown" |
| |
| %externref = type target("wasm.externref") |
| |
| declare %externref @foo() |
| declare void @bar(%externref) |
| |
| define void @test(i32 %flag, %externref %ref1, %externref %ref2) { |
| ; CHECK-LABEL: @test( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[FLAG:%.*]], 0 |
| ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] |
| ; CHECK: if.then: |
| ; CHECK-NEXT: [[CALL:%.*]] = call target("wasm.externref") @foo() |
| ; CHECK-NEXT: [[CALL1:%.*]] = call target("wasm.externref") @foo() |
| ; CHECK-NEXT: br label [[IF_END]] |
| ; CHECK: if.end: |
| ; CHECK-NEXT: [[R1:%.*]] = phi target("wasm.externref") [ [[CALL]], [[IF_THEN]] ], [ [[REF1:%.*]], [[ENTRY:%.*]] ] |
| ; CHECK-NEXT: [[R2:%.*]] = phi target("wasm.externref") [ [[CALL1]], [[IF_THEN]] ], [ [[REF2:%.*]], [[ENTRY]] ] |
| ; CHECK-NEXT: call void @bar(target("wasm.externref") [[R1]]) |
| ; CHECK-NEXT: call void @bar(target("wasm.externref") [[R2]]) |
| ; CHECK-NEXT: ret void |
| ; |
| entry: |
| %cmp = icmp ne i32 %flag, 0 |
| br i1 %cmp, label %if.then, label %if.end |
| |
| if.then: |
| %call = call %externref @foo() |
| %call1 = call %externref @foo() |
| br label %if.end |
| |
| if.end: |
| %r1 = phi %externref [ %call, %if.then ], [ %ref1, %entry ] |
| %r2 = phi %externref [ %call1, %if.then ], [ %ref2, %entry ] |
| call void @bar(%externref %r1) |
| call void @bar(%externref %r2) |
| ret void |
| } |