26 changes: 13 additions & 13 deletions llvm/test/Transforms/AtomicExpand/X86/expand-atomic-libcall.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,26 @@

define i256 @atomic_load256_libcall(ptr %ptr) nounwind {
; CHECK-LABEL: @atomic_load256_libcall(
; CHECK-NEXT: [[TMP2:%.*]] = alloca i256, align 8
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 32, ptr [[TMP2]])
; CHECK-NEXT: call void @__atomic_load(i64 32, ptr [[PTR:%.*]], ptr [[TMP2]], i32 0)
; CHECK-NEXT: [[TMP4:%.*]] = load i256, ptr [[TMP2]], align 8
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 32, ptr [[TMP2]])
; CHECK-NEXT: ret i256 [[TMP4]]
; CHECK-NEXT: [[TMP1:%.*]] = alloca i256, align 8
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 32, ptr [[TMP1]])
; CHECK-NEXT: call void @__atomic_load(i64 32, ptr [[PTR:%.*]], ptr [[TMP1]], i32 0)
; CHECK-NEXT: [[TMP2:%.*]] = load i256, ptr [[TMP1]], align 8
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 32, ptr [[TMP1]])
; CHECK-NEXT: ret i256 [[TMP2]]
;
%result = load atomic i256, ptr %ptr unordered, align 16
ret i256 %result
}

define i256 @atomic_load256_libcall_as1(ptr addrspace(1) %ptr) nounwind {
; CHECK-LABEL: @atomic_load256_libcall_as1(
; CHECK-NEXT: [[TMP2:%.*]] = addrspacecast ptr addrspace(1) [[PTR:%.*]] to ptr
; CHECK-NEXT: [[TMP3:%.*]] = alloca i256, align 8
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 32, ptr [[TMP3]])
; CHECK-NEXT: call void @__atomic_load(i64 32, ptr [[TMP2]], ptr [[TMP3]], i32 0)
; CHECK-NEXT: [[TMP5:%.*]] = load i256, ptr [[TMP3]], align 8
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 32, ptr [[TMP3]])
; CHECK-NEXT: ret i256 [[TMP5]]
; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr addrspace(1) [[PTR:%.*]] to ptr
; CHECK-NEXT: [[TMP2:%.*]] = alloca i256, align 8
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 32, ptr [[TMP2]])
; CHECK-NEXT: call void @__atomic_load(i64 32, ptr [[TMP1]], ptr [[TMP2]], i32 0)
; CHECK-NEXT: [[TMP3:%.*]] = load i256, ptr [[TMP2]], align 8
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 32, ptr [[TMP2]])
; CHECK-NEXT: ret i256 [[TMP3]]
;
%result = load atomic i256, ptr addrspace(1) %ptr unordered, align 16
ret i256 %result
Expand Down
32 changes: 16 additions & 16 deletions llvm/test/Transforms/InstCombine/double-float-shrink-2.ll
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ declare <2 x double> @llvm.trunc.v2f64(<2 x double>)

define float @test_shrink_libcall_floor(float %C) {
; CHECK-LABEL: @test_shrink_libcall_floor(
; CHECK-NEXT: [[F:%.*]] = call float @llvm.floor.f32(float [[C:%.*]])
; CHECK-NEXT: ret float [[F]]
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.floor.f32(float [[C:%.*]])
; CHECK-NEXT: ret float [[TMP1]]
;
%D = fpext float %C to double
; --> floorf
Expand All @@ -53,8 +53,8 @@ define float @test_shrink_libcall_floor(float %C) {

define float @test_shrink_libcall_ceil(float %C) {
; CHECK-LABEL: @test_shrink_libcall_ceil(
; CHECK-NEXT: [[F:%.*]] = call float @llvm.ceil.f32(float [[C:%.*]])
; CHECK-NEXT: ret float [[F]]
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.ceil.f32(float [[C:%.*]])
; CHECK-NEXT: ret float [[TMP1]]
;
%D = fpext float %C to double
; --> ceilf
Expand All @@ -65,8 +65,8 @@ define float @test_shrink_libcall_ceil(float %C) {

define float @test_shrink_libcall_round(float %C) {
; CHECK-LABEL: @test_shrink_libcall_round(
; CHECK-NEXT: [[F:%.*]] = call float @llvm.round.f32(float [[C:%.*]])
; CHECK-NEXT: ret float [[F]]
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.round.f32(float [[C:%.*]])
; CHECK-NEXT: ret float [[TMP1]]
;
%D = fpext float %C to double
; --> roundf
Expand All @@ -77,8 +77,8 @@ define float @test_shrink_libcall_round(float %C) {

define float @test_shrink_libcall_roundeven(float %C) {
; CHECK-LABEL: @test_shrink_libcall_roundeven(
; CHECK-NEXT: [[F:%.*]] = call float @llvm.roundeven.f32(float [[C:%.*]])
; CHECK-NEXT: ret float [[F]]
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.roundeven.f32(float [[C:%.*]])
; CHECK-NEXT: ret float [[TMP1]]
;
%D = fpext float %C to double
; --> roundeven
Expand All @@ -89,8 +89,8 @@ define float @test_shrink_libcall_roundeven(float %C) {

define float @test_shrink_libcall_nearbyint(float %C) {
; CHECK-LABEL: @test_shrink_libcall_nearbyint(
; CHECK-NEXT: [[F:%.*]] = call float @llvm.nearbyint.f32(float [[C:%.*]])
; CHECK-NEXT: ret float [[F]]
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.nearbyint.f32(float [[C:%.*]])
; CHECK-NEXT: ret float [[TMP1]]
;
%D = fpext float %C to double
; --> nearbyintf
Expand All @@ -101,8 +101,8 @@ define float @test_shrink_libcall_nearbyint(float %C) {

define float @test_shrink_libcall_trunc(float %C) {
; CHECK-LABEL: @test_shrink_libcall_trunc(
; CHECK-NEXT: [[F:%.*]] = call float @llvm.trunc.f32(float [[C:%.*]])
; CHECK-NEXT: ret float [[F]]
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.trunc.f32(float [[C:%.*]])
; CHECK-NEXT: ret float [[TMP1]]
;
%D = fpext float %C to double
; --> truncf
Expand All @@ -115,8 +115,8 @@ define float @test_shrink_libcall_trunc(float %C) {
; tested platforms.
define float @test_shrink_libcall_fabs(float %C) {
; CHECK-LABEL: @test_shrink_libcall_fabs(
; CHECK-NEXT: [[F:%.*]] = call float @llvm.fabs.f32(float [[C:%.*]])
; CHECK-NEXT: ret float [[F]]
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[C:%.*]])
; CHECK-NEXT: ret float [[TMP1]]
;
%D = fpext float %C to double
%E = call double @fabs(double %D)
Expand All @@ -127,8 +127,8 @@ define float @test_shrink_libcall_fabs(float %C) {
; Make sure fast math flags are preserved
define float @test_shrink_libcall_fabs_fast(float %C) {
; CHECK-LABEL: @test_shrink_libcall_fabs_fast(
; CHECK-NEXT: [[F:%.*]] = call fast float @llvm.fabs.f32(float [[C:%.*]])
; CHECK-NEXT: ret float [[F]]
; CHECK-NEXT: [[TMP1:%.*]] = call fast float @llvm.fabs.f32(float [[C:%.*]])
; CHECK-NEXT: ret float [[TMP1]]
;
%D = fpext float %C to double
%E = call fast double @fabs(double %D)
Expand Down
32 changes: 21 additions & 11 deletions llvm/test/Transforms/InstCombine/ffs-i16.ll
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,34 @@
; Test that the ffs library call simplifier works correctly even for
; targets with 16-bit int.
;
; RUN: opt < %s -mtriple=avr-linux -passes=instcombine -S | FileCheck %s
; RUN: opt < %s -mtriple=msp430-linux -passes=instcombine -S | FileCheck %s
; RUN: opt < %s -mtriple=avr-linux -passes=instcombine -S | FileCheck %s --check-prefix=AVR
; RUN: opt < %s -mtriple=msp430-linux -passes=instcombine -S | FileCheck %s --check-prefix=MSP430

declare i16 @ffs(i16)

declare void @sink(i16)


define void @fold_ffs(i16 %x) {
; CHECK-LABEL: @fold_ffs(
; CHECK-NEXT: call void @sink(i16 0)
; CHECK-NEXT: call void @sink(i16 1)
; CHECK-NEXT: [[CTTZ:%.*]] = call i16 @llvm.cttz.i16(i16 [[X:%.*]], i1 true), !range [[RNG0:![0-9]+]]
; CHECK-NEXT: [[TMP1:%.*]] = add nuw nsw i16 [[CTTZ]], 1
; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i16 [[X]], 0
; CHECK-NEXT: [[NX:%.*]] = select i1 [[DOTNOT]], i16 0, i16 [[TMP1]]
; CHECK-NEXT: call void @sink(i16 [[NX]])
; CHECK-NEXT: ret void
; AVR-LABEL: @fold_ffs(
; AVR-NEXT: call void @sink(i16 0)
; AVR-NEXT: call void @sink(i16 1)
; AVR-NEXT: [[CTTZ:%.*]] = call i16 @llvm.cttz.i16(i16 [[X:%.*]], i1 true), !range [[RNG0:![0-9]+]]
; AVR-NEXT: [[TMP1:%.*]] = add nuw nsw i16 [[CTTZ]], 1
; AVR-NEXT: [[DOTNOT:%.*]] = icmp eq i16 [[X]], 0
; AVR-NEXT: [[NX:%.*]] = select i1 [[DOTNOT]], i16 0, i16 [[TMP1]]
; AVR-NEXT: call void @sink(i16 [[NX]])
; AVR-NEXT: ret void
;
; MSP430-LABEL: @fold_ffs(
; MSP430-NEXT: call void @sink(i16 0)
; MSP430-NEXT: call void @sink(i16 1)
; MSP430-NEXT: [[CTTZ:%.*]] = call i16 @llvm.cttz.i16(i16 [[X:%.*]], i1 true), !range [[RNG0:![0-9]+]]
; MSP430-NEXT: [[TMP1:%.*]] = add nuw nsw i16 [[CTTZ]], 1
; MSP430-NEXT: [[DOTNOT:%.*]] = icmp eq i16 [[X]], 0
; MSP430-NEXT: [[NX:%.*]] = select i1 [[DOTNOT]], i16 0, i16 [[TMP1]]
; MSP430-NEXT: call void @sink(i16 [[NX]])
; MSP430-NEXT: ret void
;
%n0 = call i16 @ffs(i16 0)
call void @sink(i16 %n0)
Expand Down
26 changes: 17 additions & 9 deletions llvm/test/Transforms/InstCombine/fls-i16.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,30 @@
; targets with 16-bit int. Although fls is available on a number of
; targets it's supported (hardcoded as available) only on FreeBSD.
;
; RUN: opt < %s -mtriple=avr-freebsd -passes=instcombine -S | FileCheck %s
; RUN: opt < %s -mtriple=msp430-freebsd -passes=instcombine -S | FileCheck %s
; RUN: opt < %s -mtriple=avr-freebsd -passes=instcombine -S | FileCheck %s --check-prefix=AVR
; RUN: opt < %s -mtriple=msp430-freebsd -passes=instcombine -S | FileCheck %s --check-prefix=MSP430

declare i16 @fls(i16)

declare void @sink(i16)


define void @fold_fls(i16 %x) {
; CHECK-LABEL: @fold_fls(
; CHECK-NEXT: call void @sink(i16 0)
; CHECK-NEXT: call void @sink(i16 1)
; CHECK-NEXT: [[CTLZ:%.*]] = call i16 @llvm.ctlz.i16(i16 [[X:%.*]], i1 false), !range [[RNG0:![0-9]+]]
; CHECK-NEXT: [[NX:%.*]] = sub nuw nsw i16 16, [[CTLZ]]
; CHECK-NEXT: call void @sink(i16 [[NX]])
; CHECK-NEXT: ret void
; AVR-LABEL: @fold_fls(
; AVR-NEXT: call void @sink(i16 0)
; AVR-NEXT: call void @sink(i16 1)
; AVR-NEXT: [[CTLZ:%.*]] = call i16 @llvm.ctlz.i16(i16 [[X:%.*]], i1 false), !range [[RNG0:![0-9]+]]
; AVR-NEXT: [[NX:%.*]] = sub nuw nsw i16 16, [[CTLZ]]
; AVR-NEXT: call void @sink(i16 [[NX]])
; AVR-NEXT: ret void
;
; MSP430-LABEL: @fold_fls(
; MSP430-NEXT: call void @sink(i16 0)
; MSP430-NEXT: call void @sink(i16 1)
; MSP430-NEXT: [[CTLZ:%.*]] = call i16 @llvm.ctlz.i16(i16 [[X:%.*]], i1 false), !range [[RNG0:![0-9]+]]
; MSP430-NEXT: [[NX:%.*]] = sub nuw nsw i16 16, [[CTLZ]]
; MSP430-NEXT: call void @sink(i16 [[NX]])
; MSP430-NEXT: ret void
;
%n0 = call i16 @fls(i16 0)
call void @sink(i16 %n0)
Expand Down
44 changes: 29 additions & 15 deletions llvm/test/Transforms/InstCombine/isascii-i16.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,42 @@
; Test that the isascii library call simplifier works correctly even for
; targets with 16-bit int.
;
; RUN: opt < %s -mtriple=avr-freebsd -passes=instcombine -S | FileCheck %s
; RUN: opt < %s -mtriple=msp430-linux -passes=instcombine -S | FileCheck %s
; RUN: opt < %s -mtriple=avr-freebsd -passes=instcombine -S | FileCheck %s --check-prefix=AVR
; RUN: opt < %s -mtriple=msp430-linux -passes=instcombine -S | FileCheck %s --check-prefix=MSP430

declare i16 @isascii(i16)

declare void @sink(i16)


define void @fold_isascii(i16 %c) {
; CHECK-LABEL: @fold_isascii(
; CHECK-NEXT: call void @sink(i16 1)
; CHECK-NEXT: call void @sink(i16 1)
; CHECK-NEXT: call void @sink(i16 1)
; CHECK-NEXT: call void @sink(i16 0)
; CHECK-NEXT: call void @sink(i16 0)
; CHECK-NEXT: call void @sink(i16 0)
; CHECK-NEXT: call void @sink(i16 0)
; CHECK-NEXT: call void @sink(i16 0)
; CHECK-NEXT: [[ISASCII:%.*]] = icmp ult i16 [[C:%.*]], 128
; CHECK-NEXT: [[IC:%.*]] = zext i1 [[ISASCII]] to i16
; CHECK-NEXT: call void @sink(i16 [[IC]])
; CHECK-NEXT: ret void
; AVR-LABEL: @fold_isascii(
; AVR-NEXT: call void @sink(i16 1)
; AVR-NEXT: call void @sink(i16 1)
; AVR-NEXT: call void @sink(i16 1)
; AVR-NEXT: call void @sink(i16 0)
; AVR-NEXT: call void @sink(i16 0)
; AVR-NEXT: call void @sink(i16 0)
; AVR-NEXT: call void @sink(i16 0)
; AVR-NEXT: call void @sink(i16 0)
; AVR-NEXT: [[ISASCII:%.*]] = icmp ult i16 [[C:%.*]], 128
; AVR-NEXT: [[IC:%.*]] = zext i1 [[ISASCII]] to i16
; AVR-NEXT: call void @sink(i16 [[IC]])
; AVR-NEXT: ret void
;
; MSP430-LABEL: @fold_isascii(
; MSP430-NEXT: call void @sink(i16 1)
; MSP430-NEXT: call void @sink(i16 1)
; MSP430-NEXT: call void @sink(i16 1)
; MSP430-NEXT: call void @sink(i16 0)
; MSP430-NEXT: call void @sink(i16 0)
; MSP430-NEXT: call void @sink(i16 0)
; MSP430-NEXT: call void @sink(i16 0)
; MSP430-NEXT: call void @sink(i16 0)
; MSP430-NEXT: [[ISASCII:%.*]] = icmp ult i16 [[C:%.*]], 128
; MSP430-NEXT: [[IC:%.*]] = zext i1 [[ISASCII]] to i16
; MSP430-NEXT: call void @sink(i16 [[IC]])
; MSP430-NEXT: ret void
;
%i0 = call i16 @isascii(i16 0)
call void @sink(i16 %i0)
Expand Down
59 changes: 39 additions & 20 deletions llvm/test/Transforms/InstCombine/isdigit-i16.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,51 @@
; Test that the isdigit library call simplifier works correctly even for
; targets with 16-bit int.
;
; RUN: opt < %s -mtriple=avr-linux -passes=instcombine -S | FileCheck %s
; RUN: opt < %s -mtriple=msp430-freebsd -passes=instcombine -S | FileCheck %s
; RUN: opt < %s -mtriple=avr-linux -passes=instcombine -S | FileCheck %s --check-prefix=AVR
; RUN: opt < %s -mtriple=msp430-freebsd -passes=instcombine -S | FileCheck %s --check-prefix=MSP430

declare i16 @isdigit(i16)

declare void @sink(i16)

define void @fold_isdigit(i16 %c) {
; CHECK-LABEL: @fold_isdigit(
; CHECK-NEXT: call void @sink(i16 0)
; CHECK-NEXT: call void @sink(i16 0)
; CHECK-NEXT: call void @sink(i16 0)
; CHECK-NEXT: call void @sink(i16 1)
; CHECK-NEXT: call void @sink(i16 1)
; CHECK-NEXT: call void @sink(i16 1)
; CHECK-NEXT: call void @sink(i16 0)
; CHECK-NEXT: call void @sink(i16 0)
; CHECK-NEXT: call void @sink(i16 0)
; CHECK-NEXT: call void @sink(i16 0)
; CHECK-NEXT: call void @sink(i16 0)
; CHECK-NEXT: call void @sink(i16 0)
; CHECK-NEXT: [[ISDIGITTMP:%.*]] = add i16 [[C:%.*]], -48
; CHECK-NEXT: [[ISDIGIT:%.*]] = icmp ult i16 [[ISDIGITTMP]], 10
; CHECK-NEXT: [[IC:%.*]] = zext i1 [[ISDIGIT]] to i16
; CHECK-NEXT: call void @sink(i16 [[IC]])
; CHECK-NEXT: ret void
; AVR-LABEL: @fold_isdigit(
; AVR-NEXT: call void @sink(i16 0)
; AVR-NEXT: call void @sink(i16 0)
; AVR-NEXT: call void @sink(i16 0)
; AVR-NEXT: call void @sink(i16 1)
; AVR-NEXT: call void @sink(i16 1)
; AVR-NEXT: call void @sink(i16 1)
; AVR-NEXT: call void @sink(i16 0)
; AVR-NEXT: call void @sink(i16 0)
; AVR-NEXT: call void @sink(i16 0)
; AVR-NEXT: call void @sink(i16 0)
; AVR-NEXT: call void @sink(i16 0)
; AVR-NEXT: call void @sink(i16 0)
; AVR-NEXT: [[ISDIGITTMP:%.*]] = add i16 [[C:%.*]], -48
; AVR-NEXT: [[ISDIGIT:%.*]] = icmp ult i16 [[ISDIGITTMP]], 10
; AVR-NEXT: [[IC:%.*]] = zext i1 [[ISDIGIT]] to i16
; AVR-NEXT: call void @sink(i16 [[IC]])
; AVR-NEXT: ret void
;
; MSP430-LABEL: @fold_isdigit(
; MSP430-NEXT: call void @sink(i16 0)
; MSP430-NEXT: call void @sink(i16 0)
; MSP430-NEXT: call void @sink(i16 0)
; MSP430-NEXT: call void @sink(i16 1)
; MSP430-NEXT: call void @sink(i16 1)
; MSP430-NEXT: call void @sink(i16 1)
; MSP430-NEXT: call void @sink(i16 0)
; MSP430-NEXT: call void @sink(i16 0)
; MSP430-NEXT: call void @sink(i16 0)
; MSP430-NEXT: call void @sink(i16 0)
; MSP430-NEXT: call void @sink(i16 0)
; MSP430-NEXT: call void @sink(i16 0)
; MSP430-NEXT: [[ISDIGITTMP:%.*]] = add i16 [[C:%.*]], -48
; MSP430-NEXT: [[ISDIGIT:%.*]] = icmp ult i16 [[ISDIGITTMP]], 10
; MSP430-NEXT: [[IC:%.*]] = zext i1 [[ISDIGIT]] to i16
; MSP430-NEXT: call void @sink(i16 [[IC]])
; MSP430-NEXT: ret void
;
%i0 = call i16 @isdigit(i16 0)
call void @sink(i16 %i0)
Expand Down
269 changes: 155 additions & 114 deletions llvm/test/Transforms/InstCombine/pow_fp_int.ll

Large diffs are not rendered by default.

57 changes: 37 additions & 20 deletions llvm/test/Transforms/InstCombine/printf-i16.ll
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
;
; RUN: opt < %s -mtriple=avr-freebsd -passes=instcombine -S | FileCheck %s
; RUN: opt < %s -mtriple=msp430-linux -passes=instcombine -S | FileCheck %s
; RUN: opt < %s -mtriple=avr-freebsd -passes=instcombine -S | FileCheck %s --check-prefix=AVR
; RUN: opt < %s -mtriple=msp430-linux -passes=instcombine -S | FileCheck %s --check-prefix=MSP430
;
; Verify that the puts to putchar transformation works correctly even for
; targets with 16-bit int.
Expand All @@ -23,25 +23,42 @@ declare i16 @printf(ptr, ...)
; in the same output for calls with equivalent arguments.

define void @xform_printf(i8 %c8, i16 %c16) {
; CHECK-LABEL: @xform_printf(
; CHECK-NEXT: [[PUTCHAR:%.*]] = call i16 @putchar(i16 1)
; CHECK-NEXT: [[PUTCHAR1:%.*]] = call i16 @putchar(i16 1)
; CHECK-NEXT: [[PUTCHAR2:%.*]] = call i16 @putchar(i16 1)
; CHECK-NEXT: [[PUTCHAR3:%.*]] = call i16 @putchar(i16 127)
; CHECK-NEXT: [[PUTCHAR4:%.*]] = call i16 @putchar(i16 127)
; CHECK-NEXT: [[PUTCHAR5:%.*]] = call i16 @putchar(i16 127)
; CHECK-NEXT: [[PUTCHAR6:%.*]] = call i16 @putchar(i16 128)
; CHECK-NEXT: [[PUTCHAR7:%.*]] = call i16 @putchar(i16 128)
; CHECK-NEXT: [[PUTCHAR8:%.*]] = call i16 @putchar(i16 128)
; CHECK-NEXT: [[PUTCHAR9:%.*]] = call i16 @putchar(i16 255)
; CHECK-NEXT: [[PUTCHAR10:%.*]] = call i16 @putchar(i16 255)
; CHECK-NEXT: [[PUTCHAR11:%.*]] = call i16 @putchar(i16 255)
; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[C8:%.*]] to i16
; CHECK-NEXT: [[PUTCHAR12:%.*]] = call i16 @putchar(i16 [[TMP1]])
; CHECK-NEXT: [[PUTCHAR13:%.*]] = call i16 @putchar(i16 [[C16:%.*]])
; CHECK-NEXT: ret void
; AVR-LABEL: @xform_printf(
; AVR-NEXT: [[PUTCHAR:%.*]] = call i16 @putchar(i16 1)
; AVR-NEXT: [[PUTCHAR1:%.*]] = call i16 @putchar(i16 1)
; AVR-NEXT: [[PUTCHAR2:%.*]] = call i16 @putchar(i16 1)
; AVR-NEXT: [[PUTCHAR3:%.*]] = call i16 @putchar(i16 127)
; AVR-NEXT: [[PUTCHAR4:%.*]] = call i16 @putchar(i16 127)
; AVR-NEXT: [[PUTCHAR5:%.*]] = call i16 @putchar(i16 127)
; AVR-NEXT: [[PUTCHAR6:%.*]] = call i16 @putchar(i16 128)
; AVR-NEXT: [[PUTCHAR7:%.*]] = call i16 @putchar(i16 128)
; AVR-NEXT: [[PUTCHAR8:%.*]] = call i16 @putchar(i16 128)
; AVR-NEXT: [[PUTCHAR9:%.*]] = call i16 @putchar(i16 255)
; AVR-NEXT: [[PUTCHAR10:%.*]] = call i16 @putchar(i16 255)
; AVR-NEXT: [[PUTCHAR11:%.*]] = call i16 @putchar(i16 255)
; AVR-NEXT: [[TMP1:%.*]] = zext i8 [[C8:%.*]] to i16
; AVR-NEXT: [[PUTCHAR12:%.*]] = call i16 @putchar(i16 [[TMP1]])
; AVR-NEXT: [[PUTCHAR13:%.*]] = call i16 @putchar(i16 [[C16:%.*]])
; AVR-NEXT: ret void
;
; MSP430-LABEL: @xform_printf(
; MSP430-NEXT: [[PUTCHAR:%.*]] = call i16 @putchar(i16 1)
; MSP430-NEXT: [[PUTCHAR1:%.*]] = call i16 @putchar(i16 1)
; MSP430-NEXT: [[PUTCHAR2:%.*]] = call i16 @putchar(i16 1)
; MSP430-NEXT: [[PUTCHAR3:%.*]] = call i16 @putchar(i16 127)
; MSP430-NEXT: [[PUTCHAR4:%.*]] = call i16 @putchar(i16 127)
; MSP430-NEXT: [[PUTCHAR5:%.*]] = call i16 @putchar(i16 127)
; MSP430-NEXT: [[PUTCHAR6:%.*]] = call i16 @putchar(i16 128)
; MSP430-NEXT: [[PUTCHAR7:%.*]] = call i16 @putchar(i16 128)
; MSP430-NEXT: [[PUTCHAR8:%.*]] = call i16 @putchar(i16 128)
; MSP430-NEXT: [[PUTCHAR9:%.*]] = call i16 @putchar(i16 255)
; MSP430-NEXT: [[PUTCHAR10:%.*]] = call i16 @putchar(i16 255)
; MSP430-NEXT: [[PUTCHAR11:%.*]] = call i16 @putchar(i16 255)
; MSP430-NEXT: [[TMP1:%.*]] = zext i8 [[C8:%.*]] to i16
; MSP430-NEXT: [[PUTCHAR12:%.*]] = call i16 @putchar(i16 [[TMP1]])
; MSP430-NEXT: [[PUTCHAR13:%.*]] = call i16 @putchar(i16 [[C16:%.*]])
; MSP430-NEXT: ret void
;

call i16 (ptr, ...) @printf(ptr @s1)
call i16 (ptr, ...) @printf(ptr @pcnt_c, i16 1)
call i16 (ptr, ...) @printf(ptr @pcnt_s, ptr @s1)
Expand Down
16 changes: 10 additions & 6 deletions llvm/test/Transforms/InstCombine/puts-i16.ll
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
;
; RUN: opt < %s -mtriple=avr-linux -passes=instcombine -S | FileCheck %s
; RUN: opt < %s -mtriple=msp430-freebsd -passes=instcombine -S | FileCheck %s
; RUN: opt < %s -mtriple=avr-linux -passes=instcombine -S | FileCheck %s --check-prefix=AVR
; RUN: opt < %s -mtriple=msp430-freebsd -passes=instcombine -S | FileCheck %s --check-prefix=MSP430
;
; Test that the puts to putchar transformation works correctly even for
; targets with 16-bit int.
Expand All @@ -12,11 +12,15 @@ declare i16 @puts(ptr)
@empty = constant [1 x i8] c"\00"

define void @xform_puts(i16 %c) {
; CHECK-LABEL: @xform_puts(
; CHECK-NEXT: [[PUTCHAR:%.*]] = call i16 @putchar(i16 10)
; CHECK-NEXT: ret void
;
; Transform puts("") to putchar("\n").
; AVR-LABEL: @xform_puts(
; AVR-NEXT: [[PUTCHAR:%.*]] = call i16 @putchar(i16 10)
; AVR-NEXT: ret void
;
; MSP430-LABEL: @xform_puts(
; MSP430-NEXT: [[PUTCHAR:%.*]] = call i16 @putchar(i16 10)
; MSP430-NEXT: ret void
;
call i16 @puts(ptr @empty)

ret void
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/Transforms/LoopUnroll/ARM/upperbound.ll
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ define i32 @test2(i32 %l86) {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[L86_OFF:%.*]] = add i32 [[L86:%.*]], -1
; CHECK-NEXT: [[SWITCH:%.*]] = icmp ult i32 [[L86_OFF]], 24
; CHECK-NEXT: [[DOTNOT30:%.*]] = icmp ne i32 [[L86]], 25
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = zext i1 [[DOTNOT30]] to i32
; CHECK-NEXT: [[OR_COND23_NOT:%.*]] = icmp ne i32 [[L86]], 25
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = zext i1 [[OR_COND23_NOT]] to i32
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = select i1 [[SWITCH]], i32 0, i32 [[SPEC_SELECT]]
; CHECK-NEXT: ret i32 [[COMMON_RET_OP]]
;
Expand Down
18 changes: 9 additions & 9 deletions llvm/test/Transforms/LoopVectorize/PowerPC/widened-massv-call.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,20 @@ define dso_local double @test(ptr %Arr) {
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
; CHECK: vector.body:
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <2 x double> [ zeroinitializer, [[ENTRY]] ], [ [[TMP5:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[VEC_PHI:%.*]] = phi <2 x double> [ zeroinitializer, [[ENTRY]] ], [ [[TMP4:%.*]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[INDEX]] to i64
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds float, ptr [[ARR:%.*]], i64 [[TMP0]]
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x float>, ptr [[TMP1]], align 4
; CHECK-NEXT: [[TMP3:%.*]] = fpext <2 x float> [[WIDE_LOAD]] to <2 x double>
; CHECK-NEXT: [[TMP4:%.*]] = tail call fast <2 x double> @__sind2(<2 x double> [[TMP3]])
; CHECK-NEXT: [[TMP5]] = fadd fast <2 x double> [[TMP4]], [[VEC_PHI]]
; CHECK-NEXT: [[TMP2:%.*]] = fpext <2 x float> [[WIDE_LOAD]] to <2 x double>
; CHECK-NEXT: [[TMP3:%.*]] = tail call fast <2 x double> @__sind2(<2 x double> [[TMP2]])
; CHECK-NEXT: [[TMP4]] = fadd fast <2 x double> [[TMP3]], [[VEC_PHI]]
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 128
; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i32 [[INDEX_NEXT]], 128
; CHECK-NEXT: br i1 [[TMP5]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
; CHECK: middle.block:
; CHECK-NEXT: [[DOTLCSSA:%.*]] = phi <2 x double> [ [[TMP5]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[TMP7:%.*]] = tail call fast double @llvm.vector.reduce.fadd.v2f64(double -0.000000e+00, <2 x double> [[DOTLCSSA]])
; CHECK-NEXT: ret double [[TMP7]]
; CHECK-NEXT: [[DOTLCSSA:%.*]] = phi <2 x double> [ [[TMP4]], [[VECTOR_BODY]] ]
; CHECK-NEXT: [[TMP6:%.*]] = tail call fast double @llvm.vector.reduce.fadd.v2f64(double -0.000000e+00, <2 x double> [[DOTLCSSA]])
; CHECK-NEXT: ret double [[TMP6]]
;
entry:
br label %for.cond
Expand Down
28 changes: 14 additions & 14 deletions llvm/test/Transforms/LoopVectorize/RISCV/masked_gather_scatter.ll
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@ define void @foo4(ptr nocapture %A, ptr nocapture readonly %B, ptr nocapture rea
; RV32-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 625, [[TMP2]]
; RV32-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]]
; RV32: vector.memcheck:
; RV32-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 79880
; RV32-NEXT: [[UGLYGEP1:%.*]] = getelementptr i8, ptr [[TRIGGER:%.*]], i64 39940
; RV32-NEXT: [[UGLYGEP2:%.*]] = getelementptr i8, ptr [[B:%.*]], i64 159752
; RV32-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[A]], [[UGLYGEP1]]
; RV32-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[TRIGGER]], [[UGLYGEP]]
; RV32-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 79880
; RV32-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[TRIGGER:%.*]], i64 39940
; RV32-NEXT: [[SCEVGEP2:%.*]] = getelementptr i8, ptr [[B:%.*]], i64 159752
; RV32-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[A]], [[SCEVGEP1]]
; RV32-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[TRIGGER]], [[SCEVGEP]]
; RV32-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
; RV32-NEXT: [[BOUND03:%.*]] = icmp ult ptr [[A]], [[UGLYGEP2]]
; RV32-NEXT: [[BOUND14:%.*]] = icmp ult ptr [[B]], [[UGLYGEP]]
; RV32-NEXT: [[BOUND03:%.*]] = icmp ult ptr [[A]], [[SCEVGEP2]]
; RV32-NEXT: [[BOUND14:%.*]] = icmp ult ptr [[B]], [[SCEVGEP]]
; RV32-NEXT: [[FOUND_CONFLICT5:%.*]] = and i1 [[BOUND03]], [[BOUND14]]
; RV32-NEXT: [[CONFLICT_RDX:%.*]] = or i1 [[FOUND_CONFLICT]], [[FOUND_CONFLICT5]]
; RV32-NEXT: br i1 [[CONFLICT_RDX]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]
Expand Down Expand Up @@ -104,14 +104,14 @@ define void @foo4(ptr nocapture %A, ptr nocapture readonly %B, ptr nocapture rea
; RV64-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 625, [[TMP2]]
; RV64-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]]
; RV64: vector.memcheck:
; RV64-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 79880
; RV64-NEXT: [[UGLYGEP1:%.*]] = getelementptr i8, ptr [[TRIGGER:%.*]], i64 39940
; RV64-NEXT: [[UGLYGEP2:%.*]] = getelementptr i8, ptr [[B:%.*]], i64 159752
; RV64-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[A]], [[UGLYGEP1]]
; RV64-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[TRIGGER]], [[UGLYGEP]]
; RV64-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 79880
; RV64-NEXT: [[SCEVGEP1:%.*]] = getelementptr i8, ptr [[TRIGGER:%.*]], i64 39940
; RV64-NEXT: [[SCEVGEP2:%.*]] = getelementptr i8, ptr [[B:%.*]], i64 159752
; RV64-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[A]], [[SCEVGEP1]]
; RV64-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[TRIGGER]], [[SCEVGEP]]
; RV64-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
; RV64-NEXT: [[BOUND03:%.*]] = icmp ult ptr [[A]], [[UGLYGEP2]]
; RV64-NEXT: [[BOUND14:%.*]] = icmp ult ptr [[B]], [[UGLYGEP]]
; RV64-NEXT: [[BOUND03:%.*]] = icmp ult ptr [[A]], [[SCEVGEP2]]
; RV64-NEXT: [[BOUND14:%.*]] = icmp ult ptr [[B]], [[SCEVGEP]]
; RV64-NEXT: [[FOUND_CONFLICT5:%.*]] = and i1 [[BOUND03]], [[BOUND14]]
; RV64-NEXT: [[CONFLICT_RDX:%.*]] = or i1 [[FOUND_CONFLICT]], [[FOUND_CONFLICT5]]
; RV64-NEXT: br i1 [[CONFLICT_RDX]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/MergeICmps/X86/addressspaces.ll
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ define void @form_memcmp(ptr dereferenceable(16) %a, ptr dereferenceable(16) %b)
; CHECK-NEXT: br label %"bb1+bb2"
; CHECK: "bb1+bb2":
; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr [[A]], ptr [[B]], i64 16)
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[MEMCMP]], 0
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[MEMCMP]], 0
; CHECK-NEXT: br label [[BB3:%.*]]
; CHECK: bb3:
; CHECK-NEXT: ret void
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ define i64 @sum_2_at_with_int_conversion(ptr %A, ptr %B, i64 %N) {
; CHECK-NEXT: [[SUM_NEXT]] = add i64 [[ADD]], [[LV_I9]]
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
; CHECK-NEXT: [[C:%.*]] = icmp slt i64 [[IV]], [[N]]
; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT]], !llvm.loop [[LOOP3:![0-9]+]]
; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT]], !llvm.loop [[LOOP4:![0-9]+]]
; CHECK: exit:
; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i64 [ [[SUM_NEXT_PEEL]], [[AT_WITH_INT_CONVERSION_EXIT11_PEEL:%.*]] ], [ [[SUM_NEXT]], [[AT_WITH_INT_CONVERSION_EXIT11]] ]
; CHECK-NEXT: ret i64 [[SUM_NEXT_LCSSA]]
Expand Down
64 changes: 32 additions & 32 deletions llvm/test/Transforms/SLPVectorizer/AArch64/splat-loads.ll
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ define void @splat_loads_double(ptr %array1, ptr %array2, ptr %ptrA, ptr %ptrB)
; CHECK-NEXT: [[GEP_2_1:%.*]] = getelementptr inbounds double, ptr [[ARRAY2:%.*]], i64 1
; CHECK-NEXT: [[LD_2_0:%.*]] = load double, ptr [[ARRAY2]], align 8
; CHECK-NEXT: [[LD_2_1:%.*]] = load double, ptr [[GEP_2_1]], align 8
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x double>, ptr [[ARRAY1:%.*]], align 8
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x double> poison, double [[LD_2_0]], i32 0
; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x double> [[TMP2]], <2 x double> poison, <2 x i32> zeroinitializer
; CHECK-NEXT: [[TMP3:%.*]] = fmul <2 x double> [[TMP1]], [[SHUFFLE]]
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x double>, ptr [[ARRAY1:%.*]], align 8
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x double> poison, double [[LD_2_0]], i32 0
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <2 x double> [[TMP1]], <2 x double> poison, <2 x i32> zeroinitializer
; CHECK-NEXT: [[TMP3:%.*]] = fmul <2 x double> [[TMP0]], [[TMP2]]
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x double> poison, double [[LD_2_1]], i32 0
; CHECK-NEXT: [[SHUFFLE1:%.*]] = shufflevector <2 x double> [[TMP4]], <2 x double> poison, <2 x i32> zeroinitializer
; CHECK-NEXT: [[TMP5:%.*]] = fmul <2 x double> [[TMP1]], [[SHUFFLE1]]
; CHECK-NEXT: [[TMP6:%.*]] = fadd <2 x double> [[TMP3]], [[TMP5]]
; CHECK-NEXT: store <2 x double> [[TMP6]], ptr [[ARRAY1]], align 8
; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <2 x double> [[TMP4]], <2 x double> poison, <2 x i32> zeroinitializer
; CHECK-NEXT: [[TMP6:%.*]] = fmul <2 x double> [[TMP0]], [[TMP5]]
; CHECK-NEXT: [[TMP7:%.*]] = fadd <2 x double> [[TMP3]], [[TMP6]]
; CHECK-NEXT: store <2 x double> [[TMP7]], ptr [[ARRAY1]], align 8
; CHECK-NEXT: ret void
;
entry:
Expand Down Expand Up @@ -52,15 +52,15 @@ define void @splat_loads_float(ptr %array1, ptr %array2, ptr %ptrA, ptr %ptrB) {
; CHECK-NEXT: [[GEP_2_1:%.*]] = getelementptr inbounds float, ptr [[ARRAY2:%.*]], i64 1
; CHECK-NEXT: [[LD_2_0:%.*]] = load float, ptr [[ARRAY2]], align 8
; CHECK-NEXT: [[LD_2_1:%.*]] = load float, ptr [[GEP_2_1]], align 8
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x float>, ptr [[ARRAY1:%.*]], align 8
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x float> poison, float [[LD_2_0]], i32 0
; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[TMP2]], <2 x float> poison, <2 x i32> zeroinitializer
; CHECK-NEXT: [[TMP3:%.*]] = fmul <2 x float> [[TMP1]], [[SHUFFLE]]
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x float>, ptr [[ARRAY1:%.*]], align 8
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x float> poison, float [[LD_2_0]], i32 0
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <2 x float> [[TMP1]], <2 x float> poison, <2 x i32> zeroinitializer
; CHECK-NEXT: [[TMP3:%.*]] = fmul <2 x float> [[TMP0]], [[TMP2]]
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x float> poison, float [[LD_2_1]], i32 0
; CHECK-NEXT: [[SHUFFLE1:%.*]] = shufflevector <2 x float> [[TMP4]], <2 x float> poison, <2 x i32> zeroinitializer
; CHECK-NEXT: [[TMP5:%.*]] = fmul <2 x float> [[TMP1]], [[SHUFFLE1]]
; CHECK-NEXT: [[TMP6:%.*]] = fadd <2 x float> [[TMP3]], [[TMP5]]
; CHECK-NEXT: store <2 x float> [[TMP6]], ptr [[ARRAY1]], align 4
; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <2 x float> [[TMP4]], <2 x float> poison, <2 x i32> zeroinitializer
; CHECK-NEXT: [[TMP6:%.*]] = fmul <2 x float> [[TMP0]], [[TMP5]]
; CHECK-NEXT: [[TMP7:%.*]] = fadd <2 x float> [[TMP3]], [[TMP6]]
; CHECK-NEXT: store <2 x float> [[TMP7]], ptr [[ARRAY1]], align 4
; CHECK-NEXT: ret void
;
entry:
Expand Down Expand Up @@ -93,15 +93,15 @@ define void @splat_loads_i64(ptr %array1, ptr %array2, ptr %ptrA, ptr %ptrB) {
; CHECK-NEXT: [[GEP_2_1:%.*]] = getelementptr inbounds i64, ptr [[ARRAY2:%.*]], i64 1
; CHECK-NEXT: [[LD_2_0:%.*]] = load i64, ptr [[ARRAY2]], align 8
; CHECK-NEXT: [[LD_2_1:%.*]] = load i64, ptr [[GEP_2_1]], align 8
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr [[ARRAY1:%.*]], align 8
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i64> poison, i64 [[LD_2_0]], i32 0
; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x i64> [[TMP2]], <2 x i64> poison, <2 x i32> zeroinitializer
; CHECK-NEXT: [[TMP3:%.*]] = or <2 x i64> [[TMP1]], [[SHUFFLE]]
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr [[ARRAY1:%.*]], align 8
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> poison, i64 [[LD_2_0]], i32 0
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <2 x i64> [[TMP1]], <2 x i64> poison, <2 x i32> zeroinitializer
; CHECK-NEXT: [[TMP3:%.*]] = or <2 x i64> [[TMP0]], [[TMP2]]
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> poison, i64 [[LD_2_1]], i32 0
; CHECK-NEXT: [[SHUFFLE1:%.*]] = shufflevector <2 x i64> [[TMP4]], <2 x i64> poison, <2 x i32> zeroinitializer
; CHECK-NEXT: [[TMP5:%.*]] = or <2 x i64> [[TMP1]], [[SHUFFLE1]]
; CHECK-NEXT: [[TMP6:%.*]] = add <2 x i64> [[TMP3]], [[TMP5]]
; CHECK-NEXT: store <2 x i64> [[TMP6]], ptr [[ARRAY1]], align 4
; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <2 x i64> [[TMP4]], <2 x i64> poison, <2 x i32> zeroinitializer
; CHECK-NEXT: [[TMP6:%.*]] = or <2 x i64> [[TMP0]], [[TMP5]]
; CHECK-NEXT: [[TMP7:%.*]] = add <2 x i64> [[TMP3]], [[TMP6]]
; CHECK-NEXT: store <2 x i64> [[TMP7]], ptr [[ARRAY1]], align 4
; CHECK-NEXT: ret void
;
entry:
Expand Down Expand Up @@ -134,15 +134,15 @@ define void @splat_loads_i32(ptr %array1, ptr %array2, ptr %ptrA, ptr %ptrB) {
; CHECK-NEXT: [[GEP_2_1:%.*]] = getelementptr inbounds i32, ptr [[ARRAY2:%.*]], i64 1
; CHECK-NEXT: [[LD_2_0:%.*]] = load i32, ptr [[ARRAY2]], align 8
; CHECK-NEXT: [[LD_2_1:%.*]] = load i32, ptr [[GEP_2_1]], align 8
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i32>, ptr [[ARRAY1:%.*]], align 8
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i32> poison, i32 [[LD_2_0]], i32 0
; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x i32> [[TMP2]], <2 x i32> poison, <2 x i32> zeroinitializer
; CHECK-NEXT: [[TMP3:%.*]] = or <2 x i32> [[TMP1]], [[SHUFFLE]]
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i32>, ptr [[ARRAY1:%.*]], align 8
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i32> poison, i32 [[LD_2_0]], i32 0
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <2 x i32> [[TMP1]], <2 x i32> poison, <2 x i32> zeroinitializer
; CHECK-NEXT: [[TMP3:%.*]] = or <2 x i32> [[TMP0]], [[TMP2]]
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i32> poison, i32 [[LD_2_1]], i32 0
; CHECK-NEXT: [[SHUFFLE1:%.*]] = shufflevector <2 x i32> [[TMP4]], <2 x i32> poison, <2 x i32> zeroinitializer
; CHECK-NEXT: [[TMP5:%.*]] = or <2 x i32> [[TMP1]], [[SHUFFLE1]]
; CHECK-NEXT: [[TMP6:%.*]] = add <2 x i32> [[TMP3]], [[TMP5]]
; CHECK-NEXT: store <2 x i32> [[TMP6]], ptr [[ARRAY1]], align 4
; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <2 x i32> [[TMP4]], <2 x i32> poison, <2 x i32> zeroinitializer
; CHECK-NEXT: [[TMP6:%.*]] = or <2 x i32> [[TMP0]], [[TMP5]]
; CHECK-NEXT: [[TMP7:%.*]] = add <2 x i32> [[TMP3]], [[TMP6]]
; CHECK-NEXT: store <2 x i32> [[TMP7]], ptr [[ARRAY1]], align 4
; CHECK-NEXT: ret void
;
entry:
Expand Down
116 changes: 58 additions & 58 deletions llvm/test/Transforms/SLPVectorizer/X86/control-dependence.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ declare i64 @may_throw() willreturn
; Base case with no interesting control dependencies
define void @test_no_control(ptr %a, ptr %b, ptr %c) {
; CHECK-LABEL: @test_no_control(
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr [[A:%.*]], align 4
; CHECK-NEXT: [[TMP4:%.*]] = load <2 x i64>, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[TMP5:%.*]] = add <2 x i64> [[TMP2]], [[TMP4]]
; CHECK-NEXT: store <2 x i64> [[TMP5]], ptr [[B:%.*]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr [[A:%.*]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[TMP3:%.*]] = add <2 x i64> [[TMP1]], [[TMP2]]
; CHECK-NEXT: store <2 x i64> [[TMP3]], ptr [[B:%.*]], align 4
; CHECK-NEXT: ret void
;
%v1 = load i64, ptr %a
Expand All @@ -34,11 +34,11 @@ define void @test1(ptr %a, ptr %b, ptr %c) {
; CHECK-LABEL: @test1(
; CHECK-NEXT: [[C1:%.*]] = load i64, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[C2:%.*]] = call i64 @may_inf_loop_ro()
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr [[A:%.*]], align 4
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[C1]], i32 0
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[C2]], i32 1
; CHECK-NEXT: [[TMP5:%.*]] = add <2 x i64> [[TMP2]], [[TMP4]]
; CHECK-NEXT: store <2 x i64> [[TMP5]], ptr [[B:%.*]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr [[A:%.*]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i64> poison, i64 [[C1]], i32 0
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> [[TMP2]], i64 [[C2]], i32 1
; CHECK-NEXT: [[TMP4:%.*]] = add <2 x i64> [[TMP1]], [[TMP3]]
; CHECK-NEXT: store <2 x i64> [[TMP4]], ptr [[B:%.*]], align 4
; CHECK-NEXT: ret void
;
%v1 = load i64, ptr %a
Expand All @@ -60,11 +60,11 @@ define void @test2(ptr %a, ptr %b, ptr %c) {
; CHECK-LABEL: @test2(
; CHECK-NEXT: [[C1:%.*]] = load i64, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[C2:%.*]] = call i64 @may_inf_loop_ro()
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr [[A:%.*]], align 4
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[C1]], i32 0
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[C2]], i32 1
; CHECK-NEXT: [[TMP5:%.*]] = add <2 x i64> [[TMP2]], [[TMP4]]
; CHECK-NEXT: store <2 x i64> [[TMP5]], ptr [[B:%.*]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr [[A:%.*]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i64> poison, i64 [[C1]], i32 0
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> [[TMP2]], i64 [[C2]], i32 1
; CHECK-NEXT: [[TMP4:%.*]] = add <2 x i64> [[TMP1]], [[TMP3]]
; CHECK-NEXT: store <2 x i64> [[TMP4]], ptr [[B:%.*]], align 4
; CHECK-NEXT: ret void
;
%c1 = load i64, ptr %c
Expand All @@ -87,11 +87,11 @@ define void @test3(ptr %a, ptr %b, ptr %c) {
; CHECK-LABEL: @test3(
; CHECK-NEXT: [[C1:%.*]] = load i64, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[C2:%.*]] = call i64 @may_inf_loop_ro()
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr [[A:%.*]], align 4
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[C1]], i32 0
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[C2]], i32 1
; CHECK-NEXT: [[TMP5:%.*]] = add <2 x i64> [[TMP2]], [[TMP4]]
; CHECK-NEXT: store <2 x i64> [[TMP5]], ptr [[B:%.*]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr [[A:%.*]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i64> poison, i64 [[C1]], i32 0
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> [[TMP2]], i64 [[C2]], i32 1
; CHECK-NEXT: [[TMP4:%.*]] = add <2 x i64> [[TMP1]], [[TMP3]]
; CHECK-NEXT: store <2 x i64> [[TMP4]], ptr [[B:%.*]], align 4
; CHECK-NEXT: ret void
;
%v1 = load i64, ptr %a
Expand All @@ -113,11 +113,11 @@ define void @test4(ptr %a, ptr %b, ptr %c) {
; CHECK-LABEL: @test4(
; CHECK-NEXT: [[C1:%.*]] = load i64, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[C2:%.*]] = call i64 @may_inf_loop_ro()
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr [[A:%.*]], align 4
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[C1]], i32 0
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[C2]], i32 1
; CHECK-NEXT: [[TMP5:%.*]] = add <2 x i64> [[TMP2]], [[TMP4]]
; CHECK-NEXT: store <2 x i64> [[TMP5]], ptr [[B:%.*]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr [[A:%.*]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i64> poison, i64 [[C1]], i32 0
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> [[TMP2]], i64 [[C2]], i32 1
; CHECK-NEXT: [[TMP4:%.*]] = add <2 x i64> [[TMP1]], [[TMP3]]
; CHECK-NEXT: store <2 x i64> [[TMP4]], ptr [[B:%.*]], align 4
; CHECK-NEXT: ret void
;
%v1 = load i64, ptr %a
Expand All @@ -139,11 +139,11 @@ define void @test5(ptr %a, ptr %b, ptr %c) {
; CHECK-LABEL: @test5(
; CHECK-NEXT: [[C2:%.*]] = call i64 @may_inf_loop_ro()
; CHECK-NEXT: [[C1:%.*]] = load i64, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr [[A:%.*]], align 4
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[C1]], i32 0
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[C2]], i32 1
; CHECK-NEXT: [[TMP5:%.*]] = add <2 x i64> [[TMP2]], [[TMP4]]
; CHECK-NEXT: store <2 x i64> [[TMP5]], ptr [[B:%.*]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr [[A:%.*]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i64> poison, i64 [[C1]], i32 0
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> [[TMP2]], i64 [[C2]], i32 1
; CHECK-NEXT: [[TMP4:%.*]] = add <2 x i64> [[TMP1]], [[TMP3]]
; CHECK-NEXT: store <2 x i64> [[TMP4]], ptr [[B:%.*]], align 4
; CHECK-NEXT: ret void
;
%a2 = getelementptr i64, ptr %a, i32 1
Expand All @@ -164,10 +164,10 @@ define void @test5(ptr %a, ptr %b, ptr %c) {
define void @test6(ptr %a, ptr %b, ptr %c) {
; CHECK-LABEL: @test6(
; CHECK-NEXT: [[TMP1:%.*]] = call i64 @may_inf_loop_ro()
; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr [[A:%.*]], align 4
; CHECK-NEXT: [[TMP5:%.*]] = load <2 x i64>, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[TMP6:%.*]] = add <2 x i64> [[TMP3]], [[TMP5]]
; CHECK-NEXT: store <2 x i64> [[TMP6]], ptr [[B:%.*]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr [[A:%.*]], align 4
; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[TMP4:%.*]] = add <2 x i64> [[TMP2]], [[TMP3]]
; CHECK-NEXT: store <2 x i64> [[TMP4]], ptr [[B:%.*]], align 4
; CHECK-NEXT: ret void
;
%v1 = load i64, ptr %a
Expand Down Expand Up @@ -200,11 +200,11 @@ define void @test7(ptr %a, ptr %b, ptr %c) {
; CHECK-NEXT: store i64 0, ptr [[A]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = call i64 @may_inf_loop_ro()
; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[A2]], align 4
; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> poison, i64 [[V1]], i32 0
; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x i64> [[TMP4]], i64 [[V2]], i32 1
; CHECK-NEXT: [[TMP6:%.*]] = add <2 x i64> [[TMP5]], [[TMP3]]
; CHECK-NEXT: store <2 x i64> [[TMP6]], ptr [[B:%.*]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[V1]], i32 0
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[V2]], i32 1
; CHECK-NEXT: [[TMP5:%.*]] = add <2 x i64> [[TMP4]], [[TMP2]]
; CHECK-NEXT: store <2 x i64> [[TMP5]], ptr [[B:%.*]], align 4
; CHECK-NEXT: ret void
;
%v1 = load i64, ptr %a
Expand Down Expand Up @@ -233,11 +233,11 @@ define void @test8(ptr %a, ptr %b, ptr %c) {
; CHECK-NEXT: store i64 0, ptr [[A]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = call i64 @may_throw() #[[ATTR4:[0-9]+]]
; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[A2]], align 4
; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> poison, i64 [[V1]], i32 0
; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x i64> [[TMP4]], i64 [[V2]], i32 1
; CHECK-NEXT: [[TMP6:%.*]] = add <2 x i64> [[TMP5]], [[TMP3]]
; CHECK-NEXT: store <2 x i64> [[TMP6]], ptr [[B:%.*]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[V1]], i32 0
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[V2]], i32 1
; CHECK-NEXT: [[TMP5:%.*]] = add <2 x i64> [[TMP4]], [[TMP2]]
; CHECK-NEXT: store <2 x i64> [[TMP5]], ptr [[B:%.*]], align 4
; CHECK-NEXT: ret void
;
%v1 = load i64, ptr %a
Expand Down Expand Up @@ -266,11 +266,11 @@ define void @test9(ptr %a, ptr %b, ptr %c) {
; CHECK-NEXT: store i64 0, ptr [[A]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = call i64 @may_throw()
; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[A2]], align 4
; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> poison, i64 [[V1]], i32 0
; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x i64> [[TMP4]], i64 [[V2]], i32 1
; CHECK-NEXT: [[TMP6:%.*]] = add <2 x i64> [[TMP5]], [[TMP3]]
; CHECK-NEXT: store <2 x i64> [[TMP6]], ptr [[B:%.*]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[V1]], i32 0
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[V2]], i32 1
; CHECK-NEXT: [[TMP5:%.*]] = add <2 x i64> [[TMP4]], [[TMP2]]
; CHECK-NEXT: store <2 x i64> [[TMP5]], ptr [[B:%.*]], align 4
; CHECK-NEXT: ret void
;
%v1 = load i64, ptr %a
Expand Down Expand Up @@ -301,11 +301,11 @@ define void @test10(ptr %a, ptr %b, ptr %c) {
; CHECK-NEXT: store i64 [[U1]], ptr [[A]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = call i64 @may_inf_loop_ro()
; CHECK-NEXT: [[U2:%.*]] = udiv i64 200, [[V2]]
; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> poison, i64 [[U1]], i32 0
; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x i64> [[TMP4]], i64 [[U2]], i32 1
; CHECK-NEXT: [[TMP6:%.*]] = add <2 x i64> [[TMP5]], [[TMP3]]
; CHECK-NEXT: store <2 x i64> [[TMP6]], ptr [[B:%.*]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[U1]], i32 0
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[U2]], i32 1
; CHECK-NEXT: [[TMP5:%.*]] = add <2 x i64> [[TMP4]], [[TMP2]]
; CHECK-NEXT: store <2 x i64> [[TMP5]], ptr [[B:%.*]], align 4
; CHECK-NEXT: ret void
;
%v1 = load i64, ptr %a
Expand Down Expand Up @@ -337,11 +337,11 @@ define void @test11(i64 %x, i64 %y, ptr %b, ptr %c) {
; CHECK-NEXT: store i64 [[U1]], ptr [[B:%.*]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = call i64 @may_inf_loop_ro()
; CHECK-NEXT: [[U2:%.*]] = udiv i64 200, [[Y:%.*]]
; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> poison, i64 [[U1]], i32 0
; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x i64> [[TMP4]], i64 [[U2]], i32 1
; CHECK-NEXT: [[TMP6:%.*]] = add <2 x i64> [[TMP5]], [[TMP3]]
; CHECK-NEXT: store <2 x i64> [[TMP6]], ptr [[B]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr [[C:%.*]], align 4
; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> poison, i64 [[U1]], i32 0
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> [[TMP3]], i64 [[U2]], i32 1
; CHECK-NEXT: [[TMP5:%.*]] = add <2 x i64> [[TMP4]], [[TMP2]]
; CHECK-NEXT: store <2 x i64> [[TMP5]], ptr [[B]], align 4
; CHECK-NEXT: ret void
;
%u1 = udiv i64 200, %x
Expand Down