121 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=mldst-motion -S < %s | FileCheck %s3;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 416; CHECK-NEXT: ret void17;18entry:19 br i1 %c, label %if.then, label %if.else20 21if.then:22 store i32 %x, ptr %p23 br label %if.end24 25if.else:26 store i32 %y, ptr %p27 br label %if.end28 29if.end:30 ret void31}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 439; CHECK-NEXT: br label [[IF_END:%.*]]40; CHECK: if.else:41; CHECK-NEXT: store i32 [[Y:%.*]], ptr [[P2:%.*]], align 442; CHECK-NEXT: br label [[IF_END]]43; CHECK: if.end:44; CHECK-NEXT: ret void45;46entry:47 br i1 %c, label %if.then, label %if.else48 49if.then:50 store i32 %x, ptr %p151 br label %if.end52 53if.else:54 store i32 %y, ptr %p255 br label %if.end56 57if.end:58 ret void59}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 165; 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 473; CHECK-NEXT: ret void74;75entry:76 %gep = getelementptr i32, ptr %p, i32 177 br i1 %c, label %if.then, label %if.else78 79if.then:80 store i32 %x, ptr %gep81 br label %if.end82 83if.else:84 store i32 %y, ptr %gep85 br label %if.end86 87if.end:88 ret void89}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 1102; CHECK-NEXT: store i32 [[Y_SINK]], ptr [[TMP0]], align 4103; CHECK-NEXT: ret void104;105entry:106 br i1 %c, label %if.then, label %if.else107 108if.then:109 %gep1 = getelementptr i32, ptr %p, i32 1110 store i32 %x, ptr %gep1111 br label %if.end112 113if.else:114 %gep2 = getelementptr i32, ptr %p, i32 1115 store i32 %y, ptr %gep2116 br label %if.end117 118if.end:119 ret void120}121