| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt -passes=slp-vectorizer -slp-threshold=-1000 -mtriple=x86_64-unknown-linux-gnu -S < %s | FileCheck %s |
| |
| define void @issue209023(ptr %p) { |
| ; CHECK-LABEL: @issue209023( |
| ; CHECK-NEXT: [[P0:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 0 |
| ; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr [[P0]], align 4 |
| ; CHECK-NEXT: [[TMP2:%.*]] = add <4 x i32> [[TMP1]], <i32 3, i32 7, i32 1, i32 -5> |
| ; CHECK-NEXT: store <4 x i32> [[TMP2]], ptr [[P0]], align 4 |
| ; CHECK-NEXT: ret void |
| ; |
| %p0 = getelementptr inbounds i32, ptr %p, i64 0 |
| %p1 = getelementptr inbounds i32, ptr %p, i64 1 |
| %p2 = getelementptr inbounds i32, ptr %p, i64 2 |
| %p3 = getelementptr inbounds i32, ptr %p, i64 3 |
| %x0 = load i32, ptr %p0 |
| %x1 = load i32, ptr %p1 |
| %x2 = load i32, ptr %p2 |
| %x3 = load i32, ptr %p3 |
| %a0 = add nuw i32 %x0, 3 |
| %a1 = add nuw i32 %x1, 7 |
| %a2 = add nuw i32 %x2, 1 |
| %a3 = sub nuw i32 %x3, 5 |
| store i32 %a0, ptr %p0 |
| store i32 %a1, ptr %p1 |
| store i32 %a2, ptr %p2 |
| store i32 %a3, ptr %p3 |
| ret void |
| } |
| |
| define void @add_converted_to_sub_drops_nuw(ptr %p, i32 %x, i32 %y) { |
| ; CHECK-LABEL: @add_converted_to_sub_drops_nuw( |
| ; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i32> poison, i32 [[X:%.*]], i64 0 |
| ; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i32> [[TMP1]], i32 [[Y:%.*]], i64 1 |
| ; CHECK-NEXT: [[TMP3:%.*]] = sub <2 x i32> [[TMP2]], <i32 -5, i32 7> |
| ; CHECK-NEXT: store <2 x i32> [[TMP3]], ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: ret void |
| ; |
| %a = add nuw i32 %x, 5 |
| %b = sub nuw i32 %y, 7 |
| store i32 %a, ptr %p, align 4 |
| %p1 = getelementptr inbounds i32, ptr %p, i64 1 |
| store i32 %b, ptr %p1, align 4 |
| ret void |
| } |
| |
| define void @sub_converted_to_add_drops_nuw(ptr %p, i32 %x, i32 %y) { |
| ; CHECK-LABEL: @sub_converted_to_add_drops_nuw( |
| ; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i32> poison, i32 [[X:%.*]], i64 0 |
| ; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i32> [[TMP1]], i32 [[Y:%.*]], i64 1 |
| ; CHECK-NEXT: [[TMP3:%.*]] = add <2 x i32> [[TMP2]], <i32 -5, i32 7> |
| ; CHECK-NEXT: store <2 x i32> [[TMP3]], ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: ret void |
| ; |
| %a = sub nuw i32 %x, 5 |
| %b = add nuw i32 %y, 7 |
| store i32 %a, ptr %p, align 4 |
| %p1 = getelementptr inbounds i32, ptr %p, i64 1 |
| store i32 %b, ptr %p1, align 4 |
| ret void |
| } |
| |
| define void @same_opcode_keeps_nuw(ptr %p, i32 %x, i32 %y) { |
| ; CHECK-LABEL: @same_opcode_keeps_nuw( |
| ; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i32> poison, i32 [[X:%.*]], i64 0 |
| ; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i32> [[TMP1]], i32 [[Y:%.*]], i64 1 |
| ; CHECK-NEXT: [[TMP3:%.*]] = add nuw <2 x i32> [[TMP2]], <i32 5, i32 7> |
| ; CHECK-NEXT: store <2 x i32> [[TMP3]], ptr [[P:%.*]], align 4 |
| ; CHECK-NEXT: ret void |
| ; |
| %a = add nuw i32 %x, 5 |
| %b = add nuw i32 %y, 7 |
| store i32 %a, ptr %p, align 4 |
| %p1 = getelementptr inbounds i32, ptr %p, i64 1 |
| store i32 %b, ptr %p1, align 4 |
| ret void |
| } |