| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -S -passes=instcombine < %s | FileCheck %s |
| |
| ; Make sure we don't pull shufflevector through an intrinsic that returns a struct. |
| |
| define { <4 x i32>, <4 x i1> } @sadd_ov_shuffle_ops(<4 x i32> %x) { |
| ; CHECK-LABEL: define { <4 x i32>, <4 x i1> } @sadd_ov_shuffle_ops( |
| ; CHECK-SAME: <4 x i32> [[X:%.*]]) { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[SPLAT:%.*]] = shufflevector <4 x i32> [[X]], <4 x i32> poison, <4 x i32> zeroinitializer |
| ; CHECK-NEXT: [[OV:%.*]] = call { <4 x i32>, <4 x i1> } @llvm.sadd.with.overflow.v4i32(<4 x i32> [[SPLAT]], <4 x i32> splat (i32 1)) |
| ; CHECK-NEXT: ret { <4 x i32>, <4 x i1> } [[OV]] |
| ; |
| entry: |
| %splat = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> zeroinitializer |
| %ov = call { <4 x i32>, <4 x i1> } @llvm.sadd.with.overflow.v4i32(<4 x i32> %splat, <4 x i32> splat (i32 1)) |
| ret { <4 x i32>, <4 x i1> } %ov |
| } |
| |
| define { <4 x float>, <4 x i32> } @frexp_ov_shuffle_ops(<4 x float> %x) { |
| ; CHECK-LABEL: define { <4 x float>, <4 x i32> } @frexp_ov_shuffle_ops( |
| ; CHECK-SAME: <4 x float> [[X:%.*]]) { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[SPLAT:%.*]] = shufflevector <4 x float> [[X]], <4 x float> poison, <4 x i32> zeroinitializer |
| ; CHECK-NEXT: [[OV:%.*]] = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> [[SPLAT]]) |
| ; CHECK-NEXT: ret { <4 x float>, <4 x i32> } [[OV]] |
| ; |
| entry: |
| %splat = shufflevector <4 x float> %x, <4 x float> poison, <4 x i32> zeroinitializer |
| %ov = call { <4 x float>, <4 x i32> } @llvm.frexp(<4 x float> %splat) |
| ret { <4 x float>, <4 x i32> } %ov |
| } |