1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=mldst-motion -S < %s | FileCheck %s 3;target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" 4 5define void @no_gep_same_ptr(i1 %c, ptr %p, i32 %x, i32 %y) { 6; CHECK-LABEL: @no_gep_same_ptr( 7; CHECK-NEXT: entry: 8; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 9; CHECK: if.then: 10; CHECK-NEXT: br label [[IF_END:%.*]] 11; CHECK: if.else: 12; CHECK-NEXT: br label [[IF_END]] 13; CHECK: if.end: 14; CHECK-NEXT: [[Y_SINK:%.*]] = phi i32 [ [[X:%.*]], [[IF_THEN]] ], [ [[Y:%.*]], [[IF_ELSE]] ] 15; CHECK-NEXT: store i32 [[Y_SINK]], ptr [[P:%.*]], align 4 16; CHECK-NEXT: ret void 17; 18entry: 19 br i1 %c, label %if.then, label %if.else 20 21if.then: 22 store i32 %x, ptr %p 23 br label %if.end 24 25if.else: 26 store i32 %y, ptr %p 27 br label %if.end 28 29if.end: 30 ret void 31} 32 33define void @no_gep_different_ptr(i1 %c, ptr %p1, ptr %p2, i32 %x, i32 %y) { 34; CHECK-LABEL: @no_gep_different_ptr( 35; CHECK-NEXT: entry: 36; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 37; CHECK: if.then: 38; CHECK-NEXT: store i32 [[X:%.*]], ptr [[P1:%.*]], align 4 39; CHECK-NEXT: br label [[IF_END:%.*]] 40; CHECK: if.else: 41; CHECK-NEXT: store i32 [[Y:%.*]], ptr [[P2:%.*]], align 4 42; CHECK-NEXT: br label [[IF_END]] 43; CHECK: if.end: 44; CHECK-NEXT: ret void 45; 46entry: 47 br i1 %c, label %if.then, label %if.else 48 49if.then: 50 store i32 %x, ptr %p1 51 br label %if.end 52 53if.else: 54 store i32 %y, ptr %p2 55 br label %if.end 56 57if.end: 58 ret void 59} 60 61define void @shared_gep(i1 %c, ptr %p, i32 %x, i32 %y) { 62; CHECK-LABEL: @shared_gep( 63; CHECK-NEXT: entry: 64; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 1 65; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 66; CHECK: if.then: 67; CHECK-NEXT: br label [[IF_END:%.*]] 68; CHECK: if.else: 69; CHECK-NEXT: br label [[IF_END]] 70; CHECK: if.end: 71; CHECK-NEXT: [[Y_SINK:%.*]] = phi i32 [ [[X:%.*]], [[IF_THEN]] ], [ [[Y:%.*]], [[IF_ELSE]] ] 72; CHECK-NEXT: store i32 [[Y_SINK]], ptr [[GEP]], align 4 73; CHECK-NEXT: ret void 74; 75entry: 76 %gep = getelementptr i32, ptr %p, i32 1 77 br i1 %c, label %if.then, label %if.else 78 79if.then: 80 store i32 %x, ptr %gep 81 br label %if.end 82 83if.else: 84 store i32 %y, ptr %gep 85 br label %if.end 86 87if.end: 88 ret void 89} 90 91define void @separate_geps(i1 %c, ptr %p, i32 %x, i32 %y) { 92; CHECK-LABEL: @separate_geps( 93; CHECK-NEXT: entry: 94; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 95; CHECK: if.then: 96; CHECK-NEXT: br label [[IF_END:%.*]] 97; CHECK: if.else: 98; CHECK-NEXT: br label [[IF_END]] 99; CHECK: if.end: 100; CHECK-NEXT: [[Y_SINK:%.*]] = phi i32 [ [[X:%.*]], [[IF_THEN]] ], [ [[Y:%.*]], [[IF_ELSE]] ] 101; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 1 102; CHECK-NEXT: store i32 [[Y_SINK]], ptr [[TMP0]], align 4 103; CHECK-NEXT: ret void 104; 105entry: 106 br i1 %c, label %if.then, label %if.else 107 108if.then: 109 %gep1 = getelementptr i32, ptr %p, i32 1 110 store i32 %x, ptr %gep1 111 br label %if.end 112 113if.else: 114 %gep2 = getelementptr i32, ptr %p, i32 1 115 store i32 %y, ptr %gep2 116 br label %if.end 117 118if.end: 119 ret void 120} 121