blob: d78e2845f77512fccc9c6a7d5836e0fe1e4ffadb [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt -passes='require<profile-summary>,function(codegenprepare)' -mtriple=aarch64-unknown-linux-gnu -S < %s | FileCheck %s
; Test extracting a value from an aggregate type followed by a bitcast.
define <2 x i32> @test_aggregate_src({ i64, i64 } %agg) {
; CHECK-LABEL: define <2 x i32> @test_aggregate_src(
; CHECK-SAME: { i64, i64 } [[AGG:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i64, i64 } [[AGG]], 0
; CHECK-NEXT: [[ISZERO:%.*]] = icmp eq i64 [[VAL]], 0
; CHECK-NEXT: br i1 [[ISZERO]], label %[[EXIT:.*]], label %[[REDUCTION:.*]]
; CHECK: [[REDUCTION]]:
; CHECK-NEXT: [[BC:%.*]] = bitcast i64 [[VAL]] to <2 x i32>
; CHECK-NEXT: ret <2 x i32> [[BC]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: ret <2 x i32> zeroinitializer
;
entry:
%val = extractvalue { i64, i64 } %agg, 0
%iszero = icmp eq i64 %val, 0
br i1 %iszero, label %exit, label %reduction
reduction:
%bc = bitcast i64 %val to <2 x i32>
ret <2 x i32> %bc
exit:
ret <2 x i32> zeroinitializer
}
define <4 x i32> @test_aggregate_src_128({ i128, i128 } %agg) {
; CHECK-LABEL: define <4 x i32> @test_aggregate_src_128(
; CHECK-SAME: { i128, i128 } [[AGG:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i128, i128 } [[AGG]], 0
; CHECK-NEXT: [[BC:%.*]] = bitcast i128 [[VAL]] to <4 x i32>
; CHECK-NEXT: [[ISZERO:%.*]] = icmp eq i128 [[VAL]], 0
; CHECK-NEXT: br i1 [[ISZERO]], label %[[EXIT:.*]], label %[[REDUCTION:.*]]
; CHECK: [[REDUCTION]]:
; CHECK-NEXT: ret <4 x i32> [[BC]]
; CHECK: [[EXIT]]:
; CHECK-NEXT: ret <4 x i32> zeroinitializer
;
entry:
%val = extractvalue { i128, i128 } %agg, 0
%iszero = icmp eq i128 %val, 0
br i1 %iszero, label %exit, label %reduction
reduction:
%bc = bitcast i128 %val to <4 x i32>
ret <4 x i32> %bc
exit:
ret <4 x i32> zeroinitializer
}