138 lines · plain
1; RUN: llc < %s -mtriple=x86_64-linux -O0 | FileCheck %s --check-prefix=X642; RUN: llc < %s -mtriple=x86_64-windows-itanium -O0 | FileCheck %s --check-prefix=X643; RUN: llc < %s -mtriple=i686-- -O0 | FileCheck %s --check-prefix=X324 5; GEP indices are interpreted as signed integers, so they6; should be sign-extended to 64 bits on 64-bit targets.7; PR31818define i32 @test1(i32 %t3, ptr %t1) nounwind {9 %t9 = getelementptr i32, ptr %t1, i32 %t3 ; <ptr> [#uses=1]10 %t15 = load i32, ptr %t9 ; <i32> [#uses=1]11 ret i32 %t1512; X32-LABEL: test1:13; X32: movl (%eax,%ecx,4), %eax14; X32: ret15 16; X64-LABEL: test1:17; X64: movslq %e[[A0:di|cx]], %rax18; X64: movl (%r[[A1:si|dx]],%rax,4), %eax19; X64: ret20 21}22define i32 @test2(i64 %t3, ptr %t1) nounwind {23 %t9 = getelementptr i32, ptr %t1, i64 %t3 ; <ptr> [#uses=1]24 %t15 = load i32, ptr %t9 ; <i32> [#uses=1]25 ret i32 %t1526; X32-LABEL: test2:27; X32: movl ({{%e[a-z]+}},{{%e[a-z]+}},4), %e28; X32: ret29 30; X64-LABEL: test2:31; X64: movl (%r[[A1]],%r[[A0]],4), %eax32; X64: ret33}34 35 36 37; PR498438define i8 @test3(ptr %start) nounwind {39entry:40 %A = getelementptr i8, ptr %start, i64 -2 ; <ptr> [#uses=1]41 %B = load i8, ptr %A, align 1 ; <i8> [#uses=1]42 ret i8 %B43 44 45; X32-LABEL: test3:46; X32: movl 4(%esp), %eax47; X32: movb -2(%eax), %al48; X32: ret49 50; X64-LABEL: test3:51; X64: movb -2(%r[[A0]]), %al52; X64: ret53 54}55 56define double @test4(i64 %x, ptr %p) nounwind {57entry:58 %x.addr = alloca i64, align 8 ; <ptr> [#uses=2]59 %p.addr = alloca ptr, align 8 ; <ptr> [#uses=2]60 store i64 %x, ptr %x.addr61 store ptr %p, ptr %p.addr62 %tmp = load i64, ptr %x.addr ; <i64> [#uses=1]63 %add = add nsw i64 %tmp, 16 ; <i64> [#uses=1]64 %tmp1 = load ptr, ptr %p.addr ; <ptr> [#uses=1]65 %arrayidx = getelementptr inbounds double, ptr %tmp1, i64 %add ; <ptr> [#uses=1]66 %tmp2 = load double, ptr %arrayidx ; <double> [#uses=1]67 ret double %tmp268 69; X32-LABEL: test4:70; X32: 128(%e{{.*}},%e{{.*}},8)71; X64-LABEL: test4:72; X64: 128(%r{{.*}},%r{{.*}},8)73}74 75; PR8961 - Make sure the sext for the GEP addressing comes before the load that76; is folded.77define i64 @test5(ptr %A, i32 %I, i64 %B) nounwind {78 %v8 = getelementptr i8, ptr %A, i32 %I79 %v10 = load i64, ptr %v880 %v11 = add i64 %B, %v1081 ret i64 %v1182; X64-LABEL: test5:83; X64: movslq %e[[A1]], [[R0:%r[a-z]+]]84; X64-NEXT: (%r[[A0]],[[R0]]),85; X64: ret86}87 88; PR9500, rdar://9156159 - Don't do non-local address mode folding,89; because it may require values which wouldn't otherwise be live out90; of their blocks.91define void @test6() personality ptr @__gxx_personality_v0 {92if.end: ; preds = %if.then, %invoke.cont93 %tmp15 = load i64, ptr undef94 %dec = add i64 %tmp15, 1395 store i64 %dec, ptr undef96 %call17 = invoke ptr @_ZNK18G__FastAllocString4dataEv()97 to label %invoke.cont16 unwind label %lpad98 99invoke.cont16: ; preds = %if.then14100 %arrayidx18 = getelementptr inbounds i8, ptr %call17, i64 %dec101 store i8 0, ptr %arrayidx18102 unreachable103 104lpad: ; preds = %if.end19, %if.then14, %if.end, %entry105 %exn = landingpad {ptr, i32}106 cleanup107 unreachable108}109declare ptr @_ZNK18G__FastAllocString4dataEv() nounwind110 111 112; PR10605 / rdar://9930964 - Don't fold loads incorrectly. The load should113; happen before the store. 114define i32 @test7(ptr %tmp1, i32 %tmp71, i32 %tmp63) nounwind {115; X64-LABEL: test7:116; X64: movl 8({{%rdi|%rcx}}), %eax117; X64: movl $4, 8({{%rdi|%rcx}})118 119 120 %tmp29 = getelementptr inbounds {i32,i32,i32}, ptr %tmp1, i32 0, i32 2121 %tmp30 = load i32, ptr %tmp29, align 4122 123 %p2 = getelementptr inbounds {i32,i32,i32}, ptr %tmp1, i32 0, i32 2124 store i32 4, ptr %p2125 126 %tmp72 = or i32 %tmp71, %tmp30127 %tmp73 = icmp ne i32 %tmp63, 32128 br i1 %tmp73, label %T, label %F129 130T:131 ret i32 %tmp72132 133F:134 ret i32 4135}136 137declare i32 @__gxx_personality_v0(...)138